Python-11-生成器
2019-07-24 09:21:27来源:博客园 阅读 ()
一、定义
可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用__iter__方法),所以生成器就是一种迭代器。
二、生成器的两种形式
1. 生成器函数
使用yield代替return返回结果,yield语句一次返回一个结果,返回一个结果后,挂起函数的状态,下次从yield的位置继续执行。
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done' f = fib(10) print(next(f)) print(next(f)) print(next(f)) print(next(f))
# 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。 def odd(): print('step 1') yield 1 print('step 2') yield(3) print('step 3') yield(5) >>> o = odd() >>> next(o) step 1 1 >>> next(o) step 2 3 >>> next(o) step 3 5 >>> next(o) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
def test(): print('开始啦') first = yield 1 print('第一次', first) yield 2 print('第二次') yield 3 print('第三次') # yield 1相当于return,控制的是函数的返回值 # yield可以接收send传过来的值 t = test() res = t.__next__() print(res) t.send('hello')
2. 生成器表达式
# 三元表达式 name = 'alex' res = 'SB' if name == 'alex' else '123' print(res) SB # 列表解析 l1 = ['鸡蛋%s' % i for i in range(1, 10)] l2 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5] # l3 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5 else i] # 没有四元表达式 print(l1) print(l2) ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] ['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9'] # 生成器表达式 g = ('鸡蛋%s' % i for i in range(1, 10) if i > 5) print(next(g)) print(next(g)) print(next(g)) print(next(g)) 鸡蛋6 鸡蛋7 鸡蛋8 鸡蛋9
三、特性
-
延迟计算,一次产生一个数据,也就是说不会一次产生全部结果,对于大量数据的处理非常有用。
sum([x for x in range(1000000000)]) # 一次计算全部结果,占用大量内存 sum(x for x in range(1000000000)) # 一次计算一个结果,几乎不占内存
-
有效提高代码可读性
- 生成器只能遍历一次
原文链接:https://www.cnblogs.com/lsf123456/p/11178544.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:Python-13-模块和包
- Python学习日记(十) 生成器和迭代器 2019-08-13
- python3基础之“函数(2)” 2019-08-13
- 进程相关 2019-08-13
- xadmin进行全局配置(修改模块名为中文以及其他自定义的操作 2019-07-24
- Python-19-元类 2019-07-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash