我在研究Nosklo在What is the most "pythonic" way to iterate over a list in chunks?中的反应,他在那里定义了函数:
def chunker(seq, size):
return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
有人能给我解释一下当后面跟着for循环时,返回是如何工作的吗? 我试着做以下事情:
^{pr2}$但我没有得到同样的结果。
注意,在Nosklo示例中,chunker()
被反复调用,如下例所示:
animals = ['cat', 'dog', 'rabbit', 'duck', 'bird', 'cow', 'gnu', 'fish']
for group in chunker(animals, 3):
print group
通过添加prints,我注意到后一个for
循环执行了3次(它在animals
列表中执行),但是chunker
函数中的for循环只执行一次。那么,为什么只有一个退货,而我能看到3个指纹?在
nosklo ^{} 函数的返回值称为生成器,该对象将在迭代时生成值。在本例中,生成器是使用generator expression创建的,它是括号之间不可分割的一段代码:
(seq[pos:pos + size] for pos in xrange(0, len(seq), size))
。在关于调用的内容,我们可以像这样重写循环代码以更好地查看:
^{pr2}$chunker
函数只调用一次并返回生成器对象,该对象存储在generator
变量中。然后,for
循环只对这个generator
对象起作用,并调用它3次。在{{cd7>的生成器不能包含在^中。但是我们可以使用^{} 语句将此生成器表达式重写为正常的generator function,这是一种更详细但也更通用的生成器形式,其中我们可以包括
print
语句,它将如您最初预期的那样工作:在这里,
chunker2
函数本身就是实际的生成器,它被调用了3次。在相关问题 更多 >
编程相关推荐