生成器,迭代器,可迭代对象

Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。

可迭代对象使用iter()函数后就变成了一个迭代器

比如说str类型,它可以迭代,但是他不是一个迭代器,使用iter(str)可以把str类型转换成str_iter类型的迭代器.(同理,list会变成list_iter)

迭代器可以调用next()函数(或者.__next__()方法,效果一致),参数为其本身,获取下一次迭代的值.

--------------------------------------------------------------------------------------------------------------------------------------------

生成器:(yield,生产,产生的意思),生成器一定是迭代器,反之不成立.

a = [x*x for x in range(10)] 是列表生成式,返回列表

如果我要生成的列表很大很大,占用内存空间,一次性生成不太现实,那么我就需要使用生成器

a = (x*x for x in range(10))  生成器表达式(generator expression) 

使用next(a)一次只生成一个值

生成器可以再函数中加入yield关键字,后面接一变量名实现,把这个函数变成生成器,比如一个实现斐波那契数列的函数,节省内存空间

每次调用这个函数后会执行到yield行,返回变量值.函数停止,下次再调用这个函数会从上次中断的地方继续执行到下个yield处.如此反复.

要注意的是 yield 并没有返回值,如果

temp = yield a

temp一直是为None的

要使yield有返回值,请使用生成器的.send(参数)方法

send()方法不能在还没开始迭代的时候传递non-None参数

猜你喜欢

转载自www.cnblogs.com/xuefyre/p/9461884.html