生成器中的 for 循环?

A for loop inside a generator?

所以最近我们在讲座中讨论了生成器,这是我老师的例子:

from predicate import is_prime 
def primes(max = None):
    p = 2
    while max == None or p <= max:
        if is_prime(p):
            yield p
        p += 1

如果我们运行

a = primes(10)
print(next(a) --> 2
print(next(a) --> 3
...

所以这个特定的生成器示例使用了一个 while 循环并且 运行 是基于该循环的函数,但是生成器也可以有一个 for 循环吗?喜欢说

for i in range(2, max+1):
    # ...

这两个操作是否相似?

生成器的唯一特殊之处在于 yield 关键字,它们在调用生成器 next() 函数之间 暂停

您可以使用任何您喜欢的循环结构,就像在 'normal' python 函数中一样。

使用 for i in range(2, max + 1):while 循环的工作方式相同,前提是 max 设置为 None 以外的值:

>>> def primes(max):
...     for p in range(2, max + 1):
...         if is_prime(p):
...             yield p
... 
>>> p = primes(7)
>>> next(p)
2
>>> next(p)
3
>>> next(p)
5
>>> next(p)
7
>>> next(p)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration