Python:为什么这有效?

时间:2016-02-29 21:46:33

标签: python

我想帮助澄清一下这背后的逻辑。

from operator import add, sub

def a_plus_abs_b(a, b):
    if b < 0:
        f = sub # subtract a negative value
    else:
        f = add # add a positive one
    return f(a, b)

我原本以为我必须考虑一些复杂的数学表达式才能使这个功能起作用,但有人告诉我,只需添加sub并添加到f就可以正常工作了。我很难看到它是如何工作的,所以任何澄清的评论都会非常感激。

2 个答案:

答案 0 :(得分:2)

嗯,逻辑本身是有效的,因为a + abs(b) == a + bb >= 0a + abs(b) == a - bb < 0。我已在下面注释了您的代码。

from operator import add, sub
# two functions are imported:
#   add(x,y) -> (x + y)
#   sub(x,y) -> (x - y)

def a_plus_abs_b(a, b):

    # when b < 0, (a + abs(b)) == (a - b)
    if b < 0:
        # f is a temporary variable holding the function sub
        f = sub

    # when b >= 0, (a + abs(b)) == (a + b)
    else:
        # f is a temporary variable holding the function add
        f = add

    # apply the arguments to the function determined above
    return f(a, b)

但是,这个功能可以写成一行。

def a_plus_abs_b(a, b):
    return a + abs(b)

关于你的函数有趣的是它强调函数是Python中的一阶对象。这意味着它们可以被传递并分配给变量和许多其他东西。

答案 1 :(得分:1)

sub只是对实现减法的函数对象的引用的名称。与任何其他引用一样,您可以将其值分配给其他名称,因此f = sub只会使f另一个名称作为参考存储在sub中。因此,f(a, b)sub(a, b)都会调用相同的基础函数。