摘录自廖雪峰的python3生成器(generator)
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000
tip:generator和函数的区别,函数是顺序执行,遇到return语句或者最后一行语句就返回;
generator每次条用next()的时候执行,遇到yield语句返回,再次执行从上次返回的yield语句处继续执行,执行完所有yield后继续用next()执行就会报错。
练习:
杨辉三角定义如下:
1
/ \
1 1
/ \ / \
1 2 1
/ \ / \ / \
1 3 3 1
/ \ / \ / \ / \
1 4 6 4 1
/ \ / \ / \ / \ / \
1 5 10 10 5 1
把每一行看做一个list,试写一个generator,不断输出下一行的list:
n = 0
K = [ ]
while n < 10:
L = [ ]
a = 0
for i in K:
L.append(a+i)
a = i
L.append(1)
yield(L)
n = n+1
K = 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,其它数据的产生都是上一层数据的相加得来的,如左下图所示,所以这里定义了两个列表,L表示当前要产生列表,K表示了上一层的列表。
L列表的产生是对应K列表前两个数相加得到的(这是该数据特征的规律),那我们就对K列表进行遍历,把前两个数相加得出L列表,这里i表示遍历K列表的当前数字,a表示前一个数字。
然后再分析首尾两个1是否遵循这个规律,首位数字1可以看成上层数字加0产生,如右下图所示,这样就继续遵循了上述规律,只需要把前一个数字a赋0即可
而末位数字无法遵循,因为L列表的产生是基于K列表的数据遍历,而K列表数字比L列表少1位,所以无法遍历,所以我们这里单纯的补数字1就好了,即 L.append(1)