可迭代对象和生成器

参考:

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))的效果是一样的

 

原文地址:https://www.cnblogs.com/lxgbky/p/12712361.html