Iterable_generator

Iterable

可直接作用于for循环的数据类型有以下几种:
一类是list, tuple, dict, set, str等集合数据类型;
一类是generator,包括生成器和带yield的generator function。

可以直接作用与for循环的对象叫做iterable。利用isinstance()判断是否是iterable对象

from collections import Iterable
isinstance([], Iterable)    #return True
isinstance({}, Iterable)    #return True
isinstance('abc', Iterable) #return True

而可以使用next函数不断调用并返回一个值,直到最后抛出StopIteration错误的是迭代器Iterator

生成器都是Iterator对象,但是list,dict等数据对象却不是Iterator,但是可以使用iter()函数将Iterable变成Iterator
例如iter('abc')或者iter([])都是Iterator

generator

生成器是迭代器,但是只能遍历他们一次
因为他们不把所有的值存在内存中,他们即时的生成数据。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

把列表生成式的[]换成()就可以产生一个生成器。不可以把for i in mygenerator进行第二遍,因为生成器只可以使用一次,他们产生了0,然后忘了0产生1,然后忘了1产生4…

yield

yield类似于return,但是函数返回值是一个generator

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4
当调用函数时,函数体并没有运行,函数只是返回了一个generator

然后每次for循环一次,mygenerator运行到yield,然后返回一个值后暂停。

参考

What does the yield keyword do in Python
生成器-廖雪峰的官方网站
迭代器-廖雪峰的官方网站

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值