Python 函数论元中的表达理解

Python 函数论元中的表达理解,python,Python,为什么这是代码 sum(x代表范围(10))内的x) 有效吗?为什么不需要将x的x括在方括号中(10) >>> nums = (x for x in range(4)) >>> nums <generator object <genexpr> at 0x000001E52747B2B0> >>> next(nums) 0 >>> next(nums) 1 >>> next(nums

为什么这是代码

sum(x代表范围(10))内的x)

有效吗?为什么不需要将x的
x括在方括号中(10)

>>> nums = (x for x in range(4))
>>> nums
<generator object <genexpr> at 0x000001E52747B2B0>
>>> next(nums)
0
>>> next(nums)
1
>>> next(nums)
2
>>> next(nums)
3
>>> next(nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>nums=(范围(4)中x代表x)
>>>努姆斯
>>>下一步(nums)
0
>>>下一步(nums)
1.
>>>下一步(nums)
2.
>>>下一步(nums)
3.
>>>下一步(nums)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
什么是发电机?除非被要求执行,否则它基本上不会执行。列表理解将首先创建一个
list
,然后将该
list
传递给
sum
函数

去掉方括号后,它将成为一个生成器,将生成的每个值发送到
sum
,而无需显式创建列表
sum
将继续从
genexpr
请求数字,并在引发
StopIteration
时停止。这比使用列表理解更快


如果您有一个很长的序列,并且使用sum函数进行列表理解,python将首先花时间生成整个列表,然后sum将再次计算所有元素的总和。将生成器表达式与sum一起使用将减少大量的执行时间,因为sum将在生成每个值后立即得到它。

我认为这在评论中已经说过了,但对于后代来说,(Python 3.8.0)文档中声明“[t]只有一个参数的调用可以省略括号。有关详细信息,请参阅部分。“


编辑:为了完整起见,“调用”部分接着说,调用的实际参数可以是逗号分隔的参数列表,也可以是单个
理解
,这是没有括号的
x中的
x。

严格来说,这里没有必要,
sum(范围(10))
@khelwood,那么
sum(范围(10)中的x代表x))
被隐式转换为
sum()
?我说得对吗?那么这种行为有多可靠?完全可靠。这是语言的一部分。如果您编写了
(for in)
,您就编写了一个生成器表达式。@khelwood,您可能是对的,但我提出了与我在下面的回答相同的问题。当然
sum(X)
意味着
X
赋予
sum
函数。如果是这种情况,
X
X代表范围(10)
而不是生成器
(X代表范围(10))
“这比使用列表理解更快”。。。只有对于大的
n
(x代表范围(4)中的x))
是一个生成器,但是
x代表范围(4)
?这就是你给的
sum
,不是吗?@paxdiablo,显然你可以省略它们,但只有当生成器表达式是唯一的参数时。@paxdiablo
。。。对于在…
中,只要生成器直接位于括号内,且两边都没有逗号,就会创建一个生成器。他们不需要是自己的parentheses@donkopotamus:好的,这很有道理,
列表(x代表范围(4)中的x))
也可以工作。