有人可以在这个背景下向我解释Python“功能”概念吗?

时间:2017-07-17 18:58:13

标签: python python-3.x function

你怎么能进入10?我被告知我们在这个函数中返回一个函数,但这有什么用呢?

功能([1,2,3,4])(10)

2 个答案:

答案 0 :(得分:2)

我根据你在问题中提供的有限信息做了很多假设 但看起来你试图理解一个功能性的闭包。这是一个完全做作的例子:

def function(a):
    def inner(b):
        return sum(a) == b
    return inner

>>> function([1,2,3,4])(10)
True
>>> eq = function([1,2,3,4])
>>> eq(10)
True
>>> eq(11)
False

答案 1 :(得分:0)

在您的表达式function([1, 2, 3, 4])(10)中,有两个calls,一个带参数[1, 2, 3, 4],另一个带参数10。为此,function必须是可调用的,返回可调用的。 Python严重依赖于具有定义其行为的类型的对象,而可调用性是这些行为之一,由具有__call__方法(可调用类型)的对象递归定义。由于这种动态行为,我们无法从表达式中判断出function是什么类型。

但是,我们可以提供使表达式有效的示例。例如:

function = lambda x: x.__contains__

这使用lambda表达式创建一个匿名函数,该表达式是可调用的。该函数返回一个绑定方法(假设其参数具有__contains__方法),该方法又可以调用,表达式将计算为False

class function:
    def __init__(self,a):
        "Method called during object initialization"
        # Note that the return value doesn't come from this method.
        # self is created before it is called and returned after.
    def __call__(self,b):
        "Method called when the object is called"
        return "Well, the first one wasn't quite a function."

这使得一个名为function的类,并且类是可调用的,这是我们实例化它们的方式。因此,第一个调用成为对象实例化,第二个调用调用对象。在这个例子中,我们实际上并没有函数,尽管我们确实有两个方法在两个调用中调用。

AChampion的例子使用两个正常的函数定义,其中一个发生在另一个函数定义中,在该调用的a值上创建一个闭包。这是一种更传统的方法,尽管我们仍然可以使用可变值来混淆水域:

def function(a):
    def inner(b):
        return sum(a) == b
    return inner

>>> l = [1,2,3,4]
>>> eq = function(l)
>>> eq(10)
True
>>> eq(15)
False
>>> l.append(5)
>>> eq(15)
True
>>> eq(10)
False

我们在这里看到,这不是数学意义上的纯函数,因为它的值受其他状态的影响而不是其参数。我们经常尝试避免这样的副作用,或者至少通过突出显示状态容器来暴露它们,例如在方法调用中。

最后,根据上下文,表达式可能会以多种方式失败,包括NameError如果function没有定义,或TypeError如果其中一个调用尝试了一个不可调用的对象。它在语法上仍然是正确的Python,并且这两种异常都可以处理,尽管这样做可能有点变态。一个示例可能是电子表格程序,其中单元格公式是Python表达式;你使用特定的命名空间(全局变量)来evaluate它们,并捕获任何错误以解决错误的公式。