簡體   English   中英

Python 語法:函數參數中的 `for`

[英]Python Syntax: `for` in function arguments

以下部分復制自官方的完整 Python 3 語法

arglist: argument (',' argument)*  [',']

argument: ( test [comp_for] |
            test ':=' test |
            test '=' test |
            '**' test |
            '*' test )

comp_iter: comp_for | comp_if
sync_comp_for: 'for' exprlist 'in' or_test [comp_iter]
comp_for: [ASYNC] sync_comp_for
comp_if: 'if' test_nocond [comp_iter]

arglist用於將參數傳遞給函數調用或類定義的多個地方)。

我對規則argument : test [comp_for]感到困惑argument : test [comp_for] 作為. for . in . . for . in . 生成器已經是test有效派生類,這似乎意味着for作為函數參數具有特殊含義。

my_function(x for x in range(3))

然而,只是玩弄這個定義總是將它解釋為由所描述的語法創建的通常的生成器對象。

y = (x for x in range(3))
my_function(y)

那么,這種語法實際上有什么特別之處嗎? 或者它只是遺留/未來的保留代碼?

(x for x in range(3))是一個生成器表達式,它源自test非終結符。 但是x for x in range(3)不是從test派生的; 括號是必要的。 因此,如果沒有argument : test [comp_for]生產, sum((x for x in range(3)))將是一個有效的函數調用,但不是sum(x for x in range(3))

另一方面, sum(x for x in range(3))不能以任何其他方式解析,並且語法似乎沒有帶有額外括號的版本那么混亂。 因此,當 Python 2.4 中引入生成器表達式時,修改了參數列表的語法以使語法糖成為可能——但前提是生成器表達式是唯一的參數。

您可以在PEP 289 中找到有關更改的詳細說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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