Python 返回语句中的for循环

Python 返回语句中的for循环,python,for-loop,return,Python,For Loop,Return,我在研究年Nosklo的反应,他在那里定义了功能: def chunker(seq, size): return (seq[pos:pos + size] for pos in xrange(0, len(seq), size)) 有人能给我解释一下,当后面跟着for循环时,return是如何工作的吗? 我试着做到以下几点: def chunker2(seq, size): for pos in xrange(0, len(seq), size): return seq

我在研究年Nosklo的反应,他在那里定义了功能:

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
有人能给我解释一下,当后面跟着for循环时,return是如何工作的吗? 我试着做到以下几点:

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个打印?

函数的返回值称为生成器,一个在迭代时生成值的对象。在这种情况下,使用括号之间不可分割的代码段创建生成器:
(对于xrange(0,len(seq),size)中的pos,seq[pos:pos+size])

chunker
函数只被调用一次并返回生成器对象,我们将其存储在
generator
变量中。然后,for循环的
只与这个
生成器
对象一起工作,并调用它3次

为了能够打印此生成器的实际调用,必须在生成器表达式
(对于xrange(0,len(seq),size)中的pos,seq[pos:pos+size])
中包含
print
语句,这是不允许的。但我们可以使用语句将此生成器表达式重写为普通表达式,这是一种更详细但功能更广泛的生成器形式,其中可以包含
print
语句,它将按照您最初的预期工作:

>>> def chunker2(seq, size):
...     for pos in xrange(0, len(seq), size):
...         print('chunker2 generator called')
...         yield seq[pos:pos + size]
... 
>>> for group in chunker2(animals, 3):
...     print group
... 
chunker2 generator called
['cat', 'dog', 'rabbit']
chunker2 generator called
['duck', 'bird', 'cow']
chunker2 generator called
['gnu', 'fish']

这里的
chunker2
函数本身就是实际的生成器,会被调用3次。

这不是for循环;这是一个生成器表达式。它看起来很像一个for循环,这让新手经常认为它是一个。再见,非常感谢!我将检查这些链接。+1用于询问并合理呈现用户迄今为止理解的内容。我希望我能给另一个+1来尝试学习最“蟒蛇式”的做事方式。祝你学习python好运,还有更多关于stackoverflow的问题。我不确定我是否完全理解。chunker是发电机,对吗?在我的示例中,它被调用了3次,每次都返回不同的值。第一次,小组是[猫、狗、兔]。我的问题是关于以下迭代:下次调用chunker时,“pos”如何成为列表的第四个索引?我唯一的解释是,列表的完整分段只完成一次,每次我再次调用chunker时,我都会得到一个新的分段。我的理解(或多或少)正确吗?谢谢谢谢因此,这意味着在Nosklo示例中,“下一步”对应于chunker中group(动物,3)循环中的不同迭代:@user3764177正确,
next
函数从iterable对象获取下一项,与
for
循环的一次迭代相同。
>>> generator = chunker(animals, 3)
>>> for chunk in generator:
...     print chunk
... 
['cat', 'dog', 'rabbit']
['duck', 'bird', 'cow']
['gnu', 'fish']    
>>> def chunker2(seq, size):
...     for pos in xrange(0, len(seq), size):
...         print('chunker2 generator called')
...         yield seq[pos:pos + size]
... 
>>> for group in chunker2(animals, 3):
...     print group
... 
chunker2 generator called
['cat', 'dog', 'rabbit']
chunker2 generator called
['duck', 'bird', 'cow']
chunker2 generator called
['gnu', 'fish']