3.4、生成器

 g=(x*x for x in range(0.10))  generator生成器

next(g)通过next()查看,或者通过循环语句:for n in g:

def fib(max):
    a, b = 0, 1
    for n in range(max):
        print(b)
        a, b = b, a + b
    return 'done'

def fib(max):
    a, b = 0, 1
    for n in range(max):
        yield b
        a, b = b, a + b
m=fib(6)
for x in m:
    print(x)

print(b)改成yield b 即可将函数变成生成器

函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

def f(n):
    t=[]
    s=[1,1]
    for i in range(n):
        t.append(1)   
        if i>1:
            for j in range(1,i):
                t[j]=s[j]+s[j-1]
            s=t
        yield t

m=f(5)
for k in m:
    print(k)

错误原因:s=t,t是一个动态变量,每次执行for循环,s都会跟随t变化,导致后面for循环结果不对

 直接采用 ’ = ’ 赋值方式会使得两个变量占用同一地址,也就是说a 与 b 是同一个对象。而采用切片方式赋值则不会

def f(n):
    t=[]
    s=[1,1]
    for i in range(n):
        t.append(1)   
        if i>1:
            for j in range(1,i):
                t[j]=s[j]+s[j-1]
            s=t[:]
        yield t
m=f(7)
for k in m:
    print(k)

 

原文地址:https://www.cnblogs.com/soberkkk/p/12620474.html