Python 发电机内部的for回路?

Python 发电机内部的for回路?,python,python-3.x,for-loop,while-loop,generator,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 因此,生成器的这个特定示例使用while循环并基于该循环运行函数,但是生成器也可以有for循环吗?喜欢说 for i in

最近我们在讲座中讨论了发电机,这是我老师的例子:

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
因此,生成器的这个特定示例使用while循环并基于该循环运行函数,但是生成器也可以有for循环吗?喜欢说

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

这两个函数的操作是否类似?

生成器唯一的特殊之处是yield关键字,它们在调用生成器下一个函数之间暂停

您可以使用任何喜欢的循环构造,就像在“普通”python函数中一样

使用范围2中的i,max+1:将与while循环工作相同,前提是max设置为None以外的值:


对为什么不呢?@ColonelThirtyTwo在讲座中,我的老师说使用生成器最常用的方法之一是for循环,而while循环的使用应该避免在更大的函数中混淆两者。@Tyler:也许你误解了?这里的while循环用于允许生成器是无止境的,而不是区分事物。@泰勒:此外,在循环中使用生成器与在生成器中使用循环不同。旁白:max是一个非常方便的内置函数的名称,因此不是一个很好的参数名称。上限或其他更好的办法。
for i in range(2, max+1):
    # ...
>>> 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