4.2 列表生成式、迭代器与生成器
一、列表生成式
用列表生成式可以很快捷的用for循环或if判断语句快速生成想要的列表,使原本需要多行的操作简化为一行
例:
a=[i**2 for i in range(4)]=[0,1,4,9]
若正常生成为:
a=[]
for i in range(4):
a.append(i**2)
二、生成器(generator)
若列表有上百万个元素,不仅占用很大的空间,且如果我们只需访问前面几个元素,则后面元素白白占用空间了
生成器是将列表元素按某种推算法则,在循环过程中不断推算后续元素的计算机制
1、生成器的创建方式:
【1】将列表生成式的()改为[]
【2】在函数中插入yield x
2、生成器的取值方法:
只有一个方法:__next__()
只记录当前的位置,无法取之前的值,无法跳跃取值,只能一个一个取值
三、用生成器实现生产者消费者模型
原理:在函数中插入yield实现暂时切出函数,待后续返回值时再从函数暂停的地方继续执行,并且可以通过send()往函数传值
例:
def produce():
a=0
while a<100:
a+=1
yield a #通过函数不断生成a
return("down")
def consummer():
num=0
while num<100:
num=yield #通过生成器每次循环从外部获得num
print("get:"+str(num))
p=produce()
c=consummer()
c.__next__()
for i in range(100):
c.send(p.__next__()) #赋值给断点处
四、迭代器
1、可以直接作用于for循环的对象统称为可迭代对象:Iterable,可以使用isinstance判断一个对象是否为可迭代对象
例:
isinstance([],Iterable)
True
2、可以被next函数调用并不断返回下一个值的对象称为迭代器:Iterator,可以使用isinstance判断一个对象是否为迭代器对象
例:
isinstance([],Iterator)
False
3、生成器就是迭代器,但列表、字典等虽然是可迭代对象,但是不是迭代器
4、用iter()可以将可迭代对象变成迭代器