【问题标题】:Specify a range (upper and lower bound) for a variable in Python在 Python 中为变量指定范围(上限和下限)
【发布时间】:2018-04-04 14:32:40
【问题描述】:

有没有办法在 Python 中为浮点变量指定边界?例如,当我导入数据时,我想检查它是否在某个范围内,例如min <= variable <=max。此外,如果可能的话,如果导入的值超出这些范围(甚至丢失),我想为此类变量分配一个特定值。

如果变量是浮点数,我也许可以做第一部分。

def var_check(x,lower_bound=3,upper_bound=30):
    rng = range(lower_bound,upper_bound+1)
    if x not in rng:
        return (upper_bound-lower_bound)/2
    else:
        return x

x = var_check(5) 返回 5,而x = var_check(50) 返回 13。

关于如何为浮点变量执行此操作的任何想法?

【问题讨论】:

    标签: python


    【解决方案1】:

    您几乎可以完全按照您在问题中写的内容:

    def var_check(x, lower_bound=3, upper_bound=30):
        if lower_bound <= x <= upper_bound:
            return x
        else:
            return (upper_bound - lower_bound) / 2
    

    顺便说一句,你应该对整数做同样的事情,至少在 Python 2 中。在 Python 3 中(或在 Python 2 中使用 xrange),这并不重要。

    【讨论】:

      【解决方案2】:

      解决方案可能如下所示:

      def var_check(x, lower_bound=3, upper_bound=30):
          if x >= lower_bound and x <= upper_bound:
              return x
          return (upper_bound-lower_bound)/2
      
      print(var_check(2.5))
      print(var_check(15.5))
      print(var_check(33.5))
      

      输出

      13.5
      15.5
      13.5
      

      【讨论】:

        【解决方案3】:

        你可以定义一个类并覆盖它的__float__

        class MyFloat:
           def __init__(self, num, upper=20, lower=10):
               self.num = num
               self.upper = upper
               self.lower = lower
        
           def __float__(self):
               if self.lower <= self.num <= self.upper:
                   return float(self.num)
               else:
                   return (self.upper - self.lower) / 2
        

        然后在导入数据时,您可以这样做

        >>> data = [1,2,3,10,11,12,21,22,23]
        >>> [float(MyFloat(d)) for d in data]
        >>> [5.0, 5.0, 5.0, 10.0, 11.0, 12.0, 5.0, 5.0, 5.0]
        

        【讨论】:

        • 这似乎是一个有趣但有点复杂的解决方案。尽管如此,我还是收到了TypeError: __float__ returned non-float (type int) 消息。
        • 您能否提供一些引发此错误的示例数据?
        • 我刚刚运行了您包含的示例,并且收到了前面提到的 TypeError。在您提供的编辑之后,该示例现在可以工作了,谢谢!
        猜你喜欢
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2011-08-25
        相关资源
        最近更新 更多