1.生成器
一边循环,一边计算的机制,称为生成器:generator
创建一个generator 只需要把list的 [ ] 换成 () 即可称为一个generator
next() 函数可以获得generator的下一个值,但是很多一个个很麻烦,一般用for循环遍历generator。
- 比较复杂的需要写成函数如斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到
这个时候要把它变成generator只需要把print(c)改为yield。 - 有yield关键字的函数就是generator。函数执行时遇到yield 返回,再次调用时从上次的yield中断处继续执行。
第一次调用返回1,第二次调用才开始对下面的b,c做处理。
但是用for
循环调用generator时,发现拿不到generator的return
语句的返回值。如果想要拿到返回值,必须捕获StopIteration
错误,返回值包含在StopIteration
的value
中
【具体为啥,我现在还不知道
杨辉三角的程序
下一行比上一行多一个元素,所以先加一个0;然后下面根据上一行的值计算新的一行的值,
2.迭代器
就是可以被next()调用,并且不断返回值的对象是迭代器:iterator
生成器都是iterator;
list str dict 都是可迭代对象(iterable)但是不是iterator
将list str dict 变为Iterator 需要用iter 函数
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。