首先杨辉三角长这个样子
首先来看代码部分
def t():
n=[1]
while True:
yield n
n=[1]+[n[i]+n[i+1] for i in range(len(n)-1)]+[1]
t1=t()
r=[]
a=1
for x in t1:
r.append(x)
a=a+1
if a==11:
break
for y in r:
print(y)
接下来是对这个代码的解析
generator(生成器)和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
这里的杨辉三角代码其实就是一个生成器,而yield的作用就是惰性生成一行杨辉三角并且输出,对于生成器需要调用next()时,才会继续执行语句。但是实际操作过程中,我们通常用for循环来代替next(),让生成器不断生成下一行。
在这里只需要理解,虽然def t()中有while true,但是有yield惰性生成下一行,是不会无限生成杨辉三角的,而是每循环一次输出一行。 代码中就有这个循环
for x in t1:
r.append(x)
a=a+1
if a==11:
break
然后来看def t()的具体过程
def t():
n=[1]
#这是n的初始值,也是杨辉三角的第一行
while True:
yield n #返回这次生成的这一行杨辉三角
n=[1]+[n[i]+n[i+1] for i in range(len(n)-1)]+[1]
#当杨辉三角只有一行,也就是n=[1]的时候,len(n)=1
此时循环就是for i in range(0),
我们可以写一段代码
for n in range(0):
print(n)
会发现不会输出任何东西
所以这里,n是[1]+[1],也就是杨辉三角的第二行
经过循环,再次由yield返回后,来到杨辉三角的第三行
可以发现循环变成下面这样
for n in range(1):
print(a[n])
print(a[n+1])
结果是输出两个1,相加之后就变成了2,再加上开头结尾的[1],就变成了[1,2,1]
也就是杨辉三角的第三行
最后借助
for y in r:
print(y)
把r中的每一行打印出来,结果如下: