刚开始对生成器(generator)并不是很明白,编程的时候就一直报错……其实生成器就是记住数产生的算法逻辑,需要调用的时候再进行计算,简单逻辑的生成器可以直接用小括号表示,较为复杂的生成器可以通过构建函数并利用“yield”构造generator。
注意:generator和函数的执行顺序不同。函数是顺序执行,遇到return或最后一条执行语句时才返回(把所有工作都做完了才结束);generator每次生成一个值(yield)的时候就返回该值,若需要生成下一个值时才从yield下一条指令继续执行(有种推一下做一下的感觉)。
练习题:
杨辉三角定义如下:
1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / \ 1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
(依旧是我啰嗦的代码。。。)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Donna5126
# 杨辉三角
def triangles():
n = 1
l_list = [1]
while True:
yield l_list
n += 1
i = 0
l_temp = l_list
l_list = []
for i in range(0, n):
if i == 0 or i == n-1:
l_list.append(1) # 此处由于忘记list的命令对l_list直接赋值导致报错“list assignment index out of range”
else:
l_list.append(l_temp[i-1]+l_temp[i])
n = 0
for t in triangles():
print(t)
if n == 10:
break
else:
n+=1
生成结果:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
围观大神的代码:
def triangles():
L = [1]
while True:
yield L
L.append(0) # 想一想还是觉得很巧妙呀,在最后一个加上0,不管是第一个数或是最后一个数都是1+0
L = [L[i - 1] + L[i] for i in range(len(L))]
生成结果:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
[1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
这差距真的是T-T
多注意数字之间的关系,多转弯多动脑。。。