生成器中的 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
所以最近我们在讲座中讨论了生成器,这是我老师的例子:
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