函数调用中的Python理解(PEP 448)
(这些都在Python 3.5.2上) 在下面,我看到: 函数调用中的无包装理解,例如函数调用中的Python理解(PEP 448),python,python-3.x,language-lawyer,Python,Python 3.x,Language Lawyer,(这些都在Python 3.5.2上) 在下面,我看到: 函数调用中的无包装理解,例如f(其中x代表x),已经有效 这很有趣。如果我定义以下函数: def f(a, b, c): return a + b + c 然后,这个措辞让我认为f(在[1,2,3]中的物对物]==6。但实际上,我得到: >>> f(thing for thing in [1, 2, 3]) TypeError: f() missing 2 required positional argumen
f(其中x代表x)
,已经有效
这很有趣。如果我定义以下函数:
def f(a, b, c):
return a + b + c
然后,这个措辞让我认为f(在[1,2,3]中的物对物]==6
。但实际上,我得到:
>>> f(thing for thing in [1, 2, 3])
TypeError: f() missing 2 required positional arguments: 'b' and 'c'
i、 e.整个生成器表达式作为a
传递
那么PEP 448中的这句话是什么意思?是否可以将生成器表达式作为参数传递?此语句仅表示在pre-PEPworld
f(其中x代表x)
中,生成器表达式已经有效,并作为第一个函数参数传递
要使示例正常工作,您需要显式地解包生成器,如PEP示例所示
f(*(thing for thing in [1, 2, 3])) # returns 6
此语句仅表示在pre-PEPworld
f(其中x代表x)
中已有效,并将生成器表达式作为第一个函数参数传递
要使示例正常工作,您需要显式地解包生成器,如PEP示例所示
f(*(thing for thing in [1, 2, 3])) # returns 6
所发生的事情是,在第
f行(在[1,2,3]中是物对物的)
中,您只传递第一个参数,它是一个生成器。缺少参数b
和c
此外,请检查政治公众人物的以下部分:
然而,目前还不清楚这是不是最好的行为,或者这是不是最好的行为
应该解压缩到调用f的参数中。既然这是
很可能会让人困惑,而且效用很小,但事实并非如此
包括在本政治公众人物中。相反,这些将抛出一个SyntaxError和
应使用带有明确括号的理解
所发生的事情是,在第
f行(在[1,2,3]中是物对物的)
中,您只传递第一个参数,它是一个生成器。缺少参数b
和c
此外,请检查政治公众人物的以下部分:
然而,目前还不清楚这是不是最好的行为,或者这是不是最好的行为
应该解压缩到调用f的参数中。既然这是
很可能会让人困惑,而且效用很小,但事实并非如此
包括在本政治公众人物中。相反,这些将抛出一个SyntaxError和
应使用带有明确括号的理解
实际上f(其中x代表x)
不是PEP 448引入的新功能,而是由。注意,并非PEP 448中讨论的所有功能都在Python 3.5中实现。问题中提到的措施未得到实施:
因为这可能会让人困惑,而且只起到很小的作用
实用程序,不包括在本政治公众人物中。相反,这些将抛出一个
应使用带有明确括号的语法错误和理解
相反
实际上f(其中x代表x)
不是PEP 448引入的新功能,而是由。注意,并非PEP 448中讨论的所有功能都在Python 3.5中实现。问题中提到的措施未得到实施:
因为这可能会让人困惑,而且只起到很小的作用
实用程序,不包括在本政治公众人物中。相反,这些将抛出一个
应使用带有明确括号的语法错误和理解
相反
Python允许您将单个生成器表达式传递给正在调用的函数,而不需要额外的括号。例如:
foo(x for x in range(10))
主要相当于:
genexp = (x for x in range(10)) # parentheses are necessary here
foo(genexp)
如果传递给函数调用的还有其他参数(例如,foo(w,(x表示范围(10))中的x),y,z)
,其中第二个参数是x
的生成器表达式,则在定义生成器表达式时仍然需要括号
政治公众人物顺便提到,在这种情况下,解包语法的进一步扩展可能会令人困惑。如果一种新的生成器表达式
(*x代表嵌套中的x)
是合法的(它不是最终政治公众人物的一部分,但考虑了一段时间),那么foo(*x代表嵌套中的x)
应该如何工作?它是否等同于foo((*x表示嵌套中的x))
(使用单个生成器表达式调用,其中包括新的“展平”*
),或者它的意思是foo(*(x表示嵌套中的x))
(现在是合法的)?Python允许您将单个生成器表达式传递给正在调用的函数,而不需要额外的括号。例如:
foo(x for x in range(10))
主要相当于:
genexp = (x for x in range(10)) # parentheses are necessary here
foo(genexp)
如果传递给函数调用的还有其他参数(例如,foo(w,(x表示范围(10))中的x),y,z)
,其中第二个参数是x
的生成器表达式,则在定义生成器表达式时仍然需要括号
政治公众人物顺便提到,在这种情况下,解包语法的进一步扩展可能会令人困惑。如果一种新的生成器表达式(*x代表嵌套中的x)
是合法的(它不是最终政治公众人物的一部分,但考虑了一段时间),那么foo(*x代表嵌套中的x)
应该如何工作?它是否等同于foo((*x表示嵌套中的x))
(使用单个生成器表达式调用,其中包括新的“展平”*
),或者它的意思是foo(*(x表示嵌套中的x))
(现在这是合法的)