本节内容:
1、生成器
2、迭代器
----------------------------------------------------------------------------/---------------------------------------------------------------
1、生成器
1.1 列表生成式
>>> [i*2 for i in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
相当于
a = [ ]
for i in range(10):
a.append(i*2)
1.2 生成器概述
1.2.1 生成器的目的:省空间,如果有数据量很大的有规律的列表,很占空间,而生成器是使用到哪一个元素才生成该元素
1.2.2 生成器的关键方法: __nex__t( ) send( )
1.2.3 生成器一次只能取一个数,而且不能跨步,只能一个一个元素往下取
1.3 制作生成器
#方式1:把列表生成式的[]改为(),就变成了一个生成器
>>> (i*2 for i in range(10))
<generator object <genexpr> at 0x03A85690>
#方式2 函数里面使用 yeild 关键字
def fib(max): 斐波那契数列生成器
n,a,b = 0,0,1
while n < max:
#print(b)
yield b
a,b = b,a+b
n += 1
return 'done'
#
a,b = b,a+b等价如下:
t = (b,a+b)
a=t[0]
b=t[1]
1.4用生成器实现单线程下的多线程效果
import
time
def
consumer
(name):
print
(
"%s 准备吃馒头啦!"
%name)
while True
:
mantou =
yield
print
(
"馒头[%s]来了,被[%s]吃了!"
%(baozi
,
name))
def
mantou
(
name
):
c = consumer(
'A'
)
c2 = consumer(
'B'
)
c.
__next__
()
c2.
__next__
()
print
(
"馒头店开始准备做馒头啦!"
)
for
i
in
range
(
10
):
time.sleep(
1
)
print
(
"做了1个馒头,分两半!"
)
c.send(i)
c2.send(i)
mantou(
"James"
)
2、迭代器
可迭代对象:可以直接用for循环的对象称为可迭代对象
:Iterable
迭代器:
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
迭代器肯定是可迭代的,但是可迭代的不一定是迭代器,如list、tuple、dictionary等是可迭代对象,但是不是迭代器
可迭代对象可以通过iter()函数变为一个迭代器
迭代器的好处是可以存储无限大的数据,因为迭代器是惰性运算,即使用到该元素才生成该元素。