簡體   English   中英

有人可以在這種情況下向我解釋Python“函數”的概念嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM