Python 如果输入低于0.0或高于1.0,则返回0.0和1.0

Python 如果输入低于0.0或高于1.0,则返回0.0和1.0,python,if-statement,floating-point,idioms,Python,If Statement,Floating Point,Idioms,目标是在输入值介于(0.0,1.0)之间时“做点什么” 否则, 如果输入大于等于1.0或 如果输入则返回0.0如果愿意,可以使用decorator样式 装饰器(具有自定义的最小值和最大值): 或者,您可以使用一个简单的装饰器(具有预定义的限制): 它不应该是返回做某事(x)?另外,为什么不让做某事来决定呢?这样代码会更干净。@NickChapman的可能副本这不是钳制,因为条件取决于输入,而不是结果。是的,但如果输入高于1.0,很容易检测,但如果低于0,则正方形将使其在(0.0,1.0)范围内

目标是在输入值介于(0.0,1.0)之间时“做点什么”

否则,

  • 如果输入大于等于1.0或

  • 如果输入则返回0.0如果愿意,可以使用decorator样式

    装饰器(具有自定义的最小值和最大值):

    或者,您可以使用一个简单的装饰器(具有预定义的限制):


    它不应该是
    返回做某事(x)
    ?另外,为什么不让
    做某事
    来决定呢?这样代码会更干净。@NickChapman的可能副本这不是钳制,因为条件取决于输入,而不是结果。是的,但如果输入高于1.0,很容易检测,但如果低于0,则正方形将使其在(0.0,1.0)范围内,这是不需要的输出。为什么要通过将简单逻辑隐藏在装饰器中来掩盖它?@Sneftel如果你一直使用这种方法,它并不会掩盖逻辑。如果您只做了一次,那么我同意使用decorator比在函数中添加逻辑更烦人。但是如果你打算用不同的函数重复10次,那么装饰器是处理这个问题的好方法。@Sneftel他要求的是代码风格,而不是解决方案。我相信它在某些情况下是有用的。如果它被使用一次,我同意有更短的方法。
    def func(x):
        if x >= 1.0:
            return 1.0
        elif x <= 0.0:
            return 0.0
        else: 
            return do_something(x)
    
    def func(x):
        if 0 < x < 1.0:
            return do_something(x)
        else:
            return max(min(x, 1.0), 0.0)
    
    def do_something(x):
        return x**2
    
    >>> x = 0.231
    >>> 0 < x < 1.0
    True
    
    >>> x**2
    0.053361000000000006
    >>> 0 < x**2 < 1.0
    True
    
    >>> x = 0.231
    >>> max(min(x**2, 1.0), 0.0)
    0.053361000000000006
    
    >>> x = -0.231
    
    >>> x = - 0.231
    >>> max(min(x**2, 1.0), 0.0)
    0.053361000000000006
    
    def do_something(x):
        ratio_y, score_y = 1.5, 0.5
        beta = math.log(score_y) / math.log(score_y)**2
        return math.exp(beta * math.log(x)**2)'
    
    def limit_decorator(min_val, max_val):
        def inner_decorator(func):
            def wrapping_func(x):
                if x >= max_val:
                    return max_val
                elif x <= min_val:
                    return min_val
                else:
                    return func(x)
            return wrapping_func
        return inner_decorator
    
    @limit_decorator(0.0, 1.0)
    def do_something(value):
        return value**2
    
    def limit_decorator(func):
        def wrapping_func(x):
            if x >= 1.0:
                return 1.0
            elif x <= 0.0:
                return 0.0
            else:
                return func(x)
        return wrapping_func
    
    @limit_decorator
    def do_something(value):
        return value**2