2017-07-17 33 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 
相關問題