【问题标题】:How make iterator that keep some value inside itself? [closed]如何使迭代器在自身内部保留一些价值? [关闭]
【发布时间】:2020-01-05 12:28:01
【问题描述】:

第一个代码:

for i in range(2,4):
  q = i
  print(list(q+j for j in range(q)))

返回: [2,3] [3,4,5]

但是第二个代码:

zzz=[]
for i in range(2,4):
  q = i
  zzz.append(q+j for j in range(q))

for i in zzz:
  print(list(i))

返回: [3,4] [3,4,5]

为什么结果不同? 如何使迭代器将 q 值保留在内部(在第二个代码中)? 谢谢

【问题讨论】:

  • 让迭代器把q值保留在里面是什么意思
  • 你真正想要达到什么目的?你想得到什么输出?
  • 请尝试 res=[(q+j) for j in range(q)]
  • 这是不同的,因为 Python 闭包是后期绑定,但很难说在这种抽象上下文中最好的解决方案是什么。
  • 我想我明白你在说什么。如果您在同一个脚本上按顺序执行所有代码(两者),则在第一个循环完成后,q 的最后一个值将是3q 将保持定义,除非您在第二个循环开始之前del q。换句话说,您在问为什么q 不是每个for 循环内的local 变量,对吧?

标签: python iterator cycle


【解决方案1】:
zzz=[]
for i in range(2,4):
  q = i
  zzz.append([q+j for j in range(q)])

for i in zzz:
  print(list(i))

这将产生预期的结果。 注意zzz.append([...]) 中的方括号。这将评估列表中的生成器表达式。 (...) 语法适用于延迟执行的生成器,它将使用 q 的最后一个值。阅读此处了解更多信息https://code-maven.com/list-comprehension-vs-generator-expression

【讨论】:

  • 谢谢。但我想在 zzz 生成器中,而不是列出...(type(zzz[0]) 必须是 'generator')
【解决方案2】:

如果你想要列表中的生成器zzz,你可以定义一个返回这个生成器的函数,例如:

def get_generator(q):
    return (q+j for j in range(q))

zzz=[]
for i in range(2,4):
  zzz.append(get_generator(i))

for i in zzz:
  print(list(i))

打印:

[2, 3]
[3, 4, 5]

【讨论】:

  • 生活小窍门)谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
  • 2018-04-15
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多