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)