可迭代对象和生成器
参考:
https://blog.csdn.net/alvine008/article/details/43410079
https://www.xncoding.com/2015/12/01/python/iterable.html
一、迭代器iterables
>>> mylist1 = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3
>>> mylist2 = [x*x for x in range(3)]
>>> for i in mylist:
... print(i)
0
1
mylist1和mylist2都是 <class 'list'>, 它是迭代器iterables的一种。
任何可用 for in 来迭代读取的都是迭代容器,例如lists,strings,files.这些迭代器数据都会提前进入内存,非常消耗内存,单其中很多值都完全没有必要每次都保持在内存中。
二、Generators(生成器)
#先对比迭代器
mylist = [x*x for x in range(3)]
print(type(mylist))
输出:<class 'list'>
print(mylist)
输出:[0, 1, 4]
#对比生成器
mygenerator = (x*x for x in range(3))
print(type(mygenerator))
输出: <class 'generator'>
print(mygenerator)
输出:<generator object test1.<locals>.<genexpr> at 0x7fc2ea09efc0>
for i in mygenerator:
print(i)
输出:
0
1
4
生成器几乎和迭代器是相同的,除了符号[]变为(),但生成器不会直接生成list,而是一个object,每次只取一个值。
生成器可以用Yield实现,Yield的用法有点像return,除了它返回的是一个生成器,例如:
def createGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i*i
和mygenerator = (x*x for x in range(3))的效果是一样的