【发布时间】:2014-08-12 11:22:49
【问题描述】:
我正在研究来自 What is the most "pythonic" way to iterate over a list in chunks? 的 Nosklo 的回复,他在那里定义了函数:
def chunker(seq, size):
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
有人可以解释一下在 for 循环之后返回是如何工作的吗? 我尝试执行以下操作:
def chunker2(seq, size):
for pos in xrange(0, len(seq), size):
return seq[pos:pos + size]
但我没有得到相同的结果。
请注意,在 Nosklo 示例中,chunker() 被迭代调用,如下例所示:
animals = ['cat', 'dog', 'rabbit', 'duck', 'bird', 'cow', 'gnu', 'fish']
for group in chunker(animals, 3):
print group
通过添加打印,我注意到后者 for 循环执行了 3 次(它通过 animals 列表),但 chunker 函数中的 for 循环仅执行一次。那么,为什么只有一个返回,我可以看到 3 个打印?
【问题讨论】:
-
这不是 for 循环;这是一个生成器表达式。它看起来很像一个 for 循环,这让新手一直认为它是一个循环。见*.com/questions/1756096/…和legacy.python.org/dev/peps/pep-0289
-
非常感谢!我会检查这些链接。
-
+1 用于询问并合理地呈现用户到目前为止所理解的内容。我希望我可以再给一个 +1 来尝试学习最“pythonic”的做事方式。祝你学习 python 好运,还有更多关于 * 的问题。
-
我不确定我是否完全理解。所以,chunker 是生成器,对吧?在我的示例中,它被调用了 3 次,每次都返回不同的值。第一次,组是[猫,狗,兔子]。我的问题是针对以下迭代:下次调用 chunker 时,“pos”如何成为列表的第 4 个索引?我唯一的解释是,列表的完整分段只完成一次,每次我再次调用 chunker 时,我都会得到一个新的分段。我的理解(或多或少)正确吗?谢谢!