2017-07-17 35 views

回答

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,并捕获任何错误来解释输入错误的公式。

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 
相关问题