一、何为生成器?
- 生成器是一种用普通的函数语法定义的迭代器
- 在Python中,一边循环一边计算的机制称为生成器
- 生成器是一个包含
yield
关键字的函数。当它被调用时,在函数体中的代码不会被执行,而会返回一个迭代器。每次请求一个值,就会执行生成器中的代码,直到遇到一个yield
或者return
语句。yield
语句意味着应该生成一个值。return
语句意味着生成器要停止执行。
二、创建生成器
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
def generator(lst):
for subLst in lst:
for i in subLst:
yield i
if __name__ == '__main__':
x = [[1, 2], [3, 4], [5]]
print(list(generator(x)))
三、熟悉递归
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
def fact(n):
'''递归法求阶乘'''
if n == 1:
return 1
else:
return n * fact(n-1)
def factOpt(n,acc=1):
'''尾递归优化'''
if n == 0:
return acc
else:
return factOpt(n-1,n*acc)
if __name__ == '__main__':
print(fact(10))
print(factOpt(10))
四、递归生成器
- 递归:基本情况 + 递归情况
- 循环与递归:当循环次数未知时,可以使用递归
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
def generator_rec(lst):
try:
for subLst in lst:
for element in generator_rec(subLst): # 生成器需要遍历获取值
yield element
except TypeError:
yield lst
if __name__ == '__main__':
y = [[[1], 2], 3, 4, [5, [6, 7]], 8]
print(list(generator_rec(y)))
五、八皇后问题
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
def conflict(state, col):
'''冲突函数;
判断新皇后与前面每一行的皇后是否冲突;
冲突为列相同或行列差相等'''
row = len(state)
for i in range(row):
if abs(state[i] - col) in (0, row - i):
return True
return False
def queens(num=8, state=()):
'''生成器函数'''
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,) + result
if __name__ == '__main__':
print(len(list(queens())))