码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-16 23:44:11      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:nbsp   com   --   注意   表达式   效果   使用   lis   alt   

技术分享图片

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参数

 

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

标签:nbsp   com   --   注意   表达式   效果   使用   lis   alt   

原文地址:https://www.cnblogs.com/xuefyre/p/9461884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!