Python:如果迭代器是一个表达式,是否每次都计算?

标签 python iterator loops

举个例子:

>>> for item in [i * 2 for i in range(1, 10)]:
    print item


2
4
6
8
10
12
14
16
18

[i * 2 for i in range(1, 10)] 是每次通过循环计算,还是只计算一次并存储? (另外,表达式的那部分的正确名称是什么?)

我想要这样做的一个原因是我只希望该列表理解的结果在循环中可用。

最佳答案

很好的翻译for i in <whatever>: <loopbody> , 显示它对 any 的作用 <whatever>任何 <loopbody> :

_aux = iter(<whatever>)
while True:
  try: i = next(_aux)
  except StopIteration: break
  <loopbody>

除了我在这里命名的伪变量_aux实际上仍未命名。

所以,<whatever>总是只被评估一次(从中得到一个 iter())并且生成的迭代器是 next ed 直到用完(除非 break 中有一些 <loopbody>)。

如您所用,使用 listcomp,计算会产生 list对象(在您的代码示例中仍未命名)。在非常相似的代码中:

for item in (i * 2 for i in range(1, 10)): ...

使用 genexp 而不是 listcomp(语法上,圆括号而不是 listcomp 的方括号),它是 next()这实际上完成了大部分工作(推进 i 并将其加倍),而不是在构建时集中所有工作——这占用较少的临时内存,并且如果循环体很可能会节省时间 break尽早退出,但除非在这种特殊情况下(非常紧张的内存或可能提前循环终止)listcomp 通常可能会(一点点)更快。

关于Python:如果迭代器是一个表达式,是否每次都计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137443/

相关文章:

python - python的循环问题

python - 用 Python 写一个网站

python - 如何在 Cython 中输入生成器函数?

rust - 使用 map_keys 对扩展迭代器

python - 迭代 self 是一种不好的做法吗?

c - do-while 循环不遵守真值分配 (C)

python - 从字符串中删除变音符号以实现搜索功能

python - 使用text(),有没有办法用scrapy将空文本转换为 'None'

C++ 组合与迭代器

c++ - While 循环和 If 语句和函数