[英]Can someone explain the Python “function” concept in this context to me?
您應該如何訪問其中的10個? 我被告知我們將在此函數中返回一個函數,但這有什么意義呢?
函數([1、2、3、4])(10)
根據您在問題中提供的有限信息,我做出了很多假設。
但是,您似乎想了解功能閉包。 這是一個完全人為的示例:
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
在您的表達式function([1, 2, 3, 4])(10)
,有兩個調用 ,一個帶有參數[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
我們在這里看到這不是數學意義上的純函數,因為它的值受其參數以外的其他狀態的影響。 我們經常嘗試避免這種副作用,或者至少通過突出顯示狀態容器(例如在方法調用中)來暴露它們。
最后,根據上下文的不同,表達式可能會以多種方式失敗,包括如果未簡單定義function
則發生NameError
如果嘗試對不可調用對象進行一次調用,則發生TypeError
。 從語法上講,它仍然是正確的Python,並且可以處理這兩個異常,盡管這樣做可能會有些變態。 例如,電子表格程序中的單元格公式為Python表達式。 您可以使用特定的命名空間(全局變量) 對其進行評估 ,並捕獲任何錯誤以說明公式輸入錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.