抽搐鸡

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()可以将可迭代对象变成迭代器

posted on 2018-08-22 18:09  抽搐鸡  阅读(122)  评论(0编辑  收藏  举报

导航