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
生成器-廖雪峰的官方网站
迭代器-廖雪峰的官方网站