首先杨辉三角长这个样子

python杨辉三角递归结束的条件 python3杨辉三角_for循环


首先来看代码部分

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中的每一行打印出来,结果如下:

python杨辉三角递归结束的条件 python3杨辉三角_生成器_02