返回状态中的for循环

2024-06-16 15:43:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在研究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个指纹?在


Tags: the函数inposmostforsizeis
1条回答
网友
1楼 · 发布于 2024-06-16 15:43:07

nosklo ^{}函数的返回值称为生成器,该对象将在迭代时生成值。在本例中,生成器是使用generator expression创建的,它是括号之间不可分割的一段代码:(seq[pos:pos + size] for pos in xrange(0, len(seq), size))。在

>>> def chunker(seq, size):
...     return (seq[pos:pos + size] for pos in xrange(0, len(seq), size))
... 
>>> result = chunker([1, 2, 3], 2)
>>> print(result)
<generator object <genexpr> at 0x10581e1e0>
>>> next(result)
[1, 2]
>>> next(result)
[3]

关于调用的内容,我们可以像这样重写循环代码以更好地查看:

^{pr2}$

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

{{cd7>的生成器不能包含在^中。但是我们可以使用^{}语句将此生成器表达式重写为正常的generator function,这是一种更详细但也更通用的生成器形式,其中我们可以包括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次。在

相关问题 更多 >