生成器的函数是包含关键字yield
的函数,它在被调用时返回一个生成器,即一种特殊的迭代器。
要与活动的生成器交互,可使用方法send
、throw
和close
。
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。
yield意味着应生成一个值,而return意味着生成器应停止执行。(即不再生成值:仅当在生成器调用return时,才能不提供任何参数)
# 八皇后问题
def conflict(state, nextX):
nextY = len(state)
for i in range(nextY):
if abs(state[i]-nextY) in (0, nextY-i): # 元组,两个值
return True
return False
def queens(num=8, state=11):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num-1:
yield (pos, )
else:
for result in queens(num, state+(pos, )):
yield (pos, 1+result)
对于逐步得到结果的复杂递归算法,非常适合使用生成器来实现。
(最近更新:2019年05月20日)