-
生成器:generator
与列表生成器类似,区别在于生成器是一边循环一边计算,具有“惰性”。
1.创建方法是:把一个列表生成式外层的[]
改成()
2.1)通过next(g)方法打印出generator中元素,到计算最后一个元素时出现StopIteration
的错误
2.2)通过for循环打印generator元素,不考虑StopIteration
的错误
3.斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b #注意:tuple = (b,a+b),a=t[0],b=t[1]
n = n + 1 # b = a+b 中的 a 是未被t[0]赋值的原始a
return 'done'
4.通过函数创建generator,将上函数中的print(b)
改为yield b
5.generator和函数的执行流程区别:
函数是顺序执行,遇到return语句或者最后一行函数语句就返回;generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
6.for循环调用generator时,无return语句的返回值。需通过须捕获StopIteration错误得到。
7.杨辉三角函数,还没写出来,我需要想想。。
>>> def triangles():
... L = [1]
... while True:
... yield L
... L = [1] + [L[i]+L[i+1] for i in range(0, len(L)-1)] + [1]
... L.append(1)
...
>>> n = 0
>>> for t in triangles():
... print(t)
... n += 1
... if n == 10:
... break
-
迭代器
1.凡是可作用于for循环的对象都是可迭代对象(Iterable)
如:集合数据类型(list、tuple、dict、set、str
)和`generator
#判断是否为Iterable类型
>>> from collections import Iterable
>>> isinstance([], Iterable)
True
2.凡是可作用于next()函数的对象都是迭代器(Iterator),表示惰性计算的序列;
如:generator都是、使用iter()函数变成生成器的list、dict、str
#判断是否为Iterator类型
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
————————————————————————
#使用iter()函数变成生成器的list
>>> isinstance(iter([]), Iterator)
True
小白的我需要注意:调用generator时,首先要生成一个generator对象(理解为:需要给它个名字)。
如:g = (x * x for x in range(10)) , next(g)
o = odd(), next(o)
其中odd()函数为含有yield
关键词的generator function