博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python函数(十一)-生成器
阅读量:2259 次
发布时间:2019-05-09

本文共 1844 字,大约阅读时间需要 6 分钟。

首先看一下什么是列表生成式

>>> [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)...>>> a[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

这一句代码就实现了三句代码的效果,这一句代码就是列表生成式

列表如果存的数据太多,就会占用很大的存储空间

如果只取列表中的一些数据,那么其它不用的数据占用的存储空间就白占了

生成器也能存储数据,但是它只记录当前数据,剩下的数据都还没生成,这样就不会占用太多的存储空间

怎么创建一个生成器呢?

>>> [i*2 for i in range(10)][0, 2, 4, 6, 8, 10, 12, 14, 16, 18]>>> (i*2 for i in range(10))
at 0x0000021C9C2E5258>

这样就是一个生成器了,没有直接生成数据

要取一个数据就生成一个数据

那么怎么获取生成器里的数据呢?

>>> b = (i*2 for i in range(10))>>> b
at 0x0000021C9C2E5308>>>> b.__next__()0>>> b.__next__()2>>> b.__next__()4>>> next(b)6>>> next(b)8>>> next(b)10

生成器使用next()方法获取数据,next(b),这是Python3和Python2通用的方法

Python3中还可以用__next__()方法,b.__next__()

Python2中用next()方法,b.next()

但是用next()方法一次次取数据太麻烦,所以通常都用for循环来打印数据

>>> c = (i*2 for i in range(10))>>> for n in c:...     print(n)...024681012141618

如果函数里有yield关键字,这个函数就是生成器

# -*- coding:utf-8 -*-__author__ = "MuT6 Sch01aR"def test(n):    m = 0    b = 0    while m

运行结果

运行过程:

首先是调用test()函数

然后执行while循环

到__next__()方法的时候,跳到test()函数

执行完yield后,没继续执行下面的语句,而是返回到__next__()方法后的语句

执行完该语句后继续执行while循环,执行__next__()方法

然后又跳转到yield后的语句

生成器调用next()方法的时候执行,执行到生成器中的yield的时候返回,然后执行next()方法后的语句,再执行到next()方法的时候,就会跳到执行yield的语句,之后执行yield后的语句

用生成器实现单线程多并发

# -*- coding:utf-8 -*-__author__ = "MuT6 Sch01aR"import timedef consumer(name):    print('%s准备吃包子' %name)    while True:        baozi = yield        print('%s包子来了,被%s吃了' %(baozi,name))def producer():    c = consumer('张三')    c2 = consumer('李四')    c.__next__()    c2.__next__()    print('我开始准备做包子了')    for i in range(10):        time.sleep(1)        print('我做了2个包子')        c.send('肉') #调用yield,并传值        c2.send('菜')if __name__ == '__main__':    producer()

send方法不仅可以调用yield,还给yield传值

运行结果

实现了单线程多并发的效果

转载于:https://www.cnblogs.com/sch01ar/p/8410599.html

你可能感兴趣的文章
springMVC和其注解方式
查看>>
统计一个含有英文单词的文本文件中的单词个数以及指定单词个数
查看>>
JavaScript DOM操作
查看>>
如何让表单文本框左边标签文本右对齐---label
查看>>
document对象集合和方法
查看>>
jQuery DOM操作之属性操作
查看>>
jQuery DOM操作之插入节点
查看>>
Java--IO流之字节流介绍--InputStream和OutputStream
查看>>
Java--File 类的常用方法
查看>>
String类以及常用的方法
查看>>
StringBuffer操作字符以及其常用的方法
查看>>
String类和StringBuffer类的区别
查看>>
抽象类和接口的区别
查看>>
Coding如何生成SSH公匙密匙?
查看>>
Vue环境搭建
查看>>
Flex弹性布局之flex-basis、flex-grow、flex-shrink分析
查看>>
常见的flex属性和其解释
查看>>
为什么js代码块有时候不起作用,需要放在body标签中
查看>>
css主流浏览器引擎前缀
查看>>
Git版本回退
查看>>