发电机内的for循环?

时间:2015-02-02 20:33:23

标签: python python-3.x for-loop while-loop 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):
    # ...

这两者的运作方式是否相似?

1 个答案:

答案 0 :(得分:3)

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

你可以使用你喜欢的任何循环结构,就像在'普通'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