对生成器函数使用next()

2024-03-28 08:41:56 发布

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

我有这个发电机功能:-你知道吗

>>> def gen():
...     for i in range(3):
...             yield i*i

现在,当我在gen()上调用next()时,它每次都给出第一个元素。你知道吗

>>> next(gen())
0
>>> next(gen())
0

但当我在for循环中使用它时,它就像预期:-你知道吗

>>> for i in gen():
...     print(i)
... 
0
1
4

有人能解释这种影响的原因吗?还有我在这里所缺少的概念??你知道吗


Tags: in功能概念元素fordefrange原因
2条回答

每次调用函数时,它都返回一个生成器对象。每次调用next时,您都会得到第一个项,它是0 * 0,因为您不是在同一个对象上调用next(每次都是一个新对象)。但在第二种情况下,您在一个生成器对象上循环,它将继续使用生成器,直到它到达StopIteration。你知道吗

为了更好地演示,您可以从生成器函数创建两个迭代器对象,并同时在它们上循环:

In [17]: g = gen()

In [18]: k = gen()

In [19]: for i, j in zip(g, k):
    ...:     print(i, j)
    ...:     
0 0
1 1
4 4

每次调用gen()时,函数都会返回一个新的生成器。你知道吗

我认为最简单的理解方法是对比你在做什么:

>>> next(gen())
0
>>> next(gen())
0

有了这个:

>>> my_gen = gen()
>>> next(my_gen)
0
>>> next(my_gen)
1
>>> next(my_gen)
4
>>> next(my_gen)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

在后一种情况下,我将从相同的生成器中获取新值。你知道吗

相关问题 更多 >