Python 返回语句中的for循环
我在研究年Nosklo的反应,他在那里定义了功能: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
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']