Python入门篇-生成器函数
Python入门篇-生成器函数
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.生成器概述
1>.生成器generator
生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象
2>. 生成器函数
函数体中包含yield语句的函数,返回生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算,惰性求值的 包含yield语句的生成器函数生成生成器对象的时候,生成器函数的函数体不会立即执行 next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行 再次调用next函数,和上一条一样的处理过程
没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常
3>.编写一个生成器函数样例
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
关于生成器函数的相关说明: 在生成器函数中,使用多个yield语句,执行一次后会暂停执行,把yield表达式的值返回 再次执行会执行到下一个yield语句 return 语句依然可以终止函数运行,但return语句返回值不能被捕获到 return 会导致无法继续获取下一个值,抛出StopIteration异常 如果函数没有显示的return语句,如果生成器函数执行到结尾,一样会抛出StopIteration异常哟 """
def gen():
print('line 1')
yield 1
print('line 2')
yield 2
print('line 3')
return 3 next(gen()) next(gen()) g = gen() print(next(g))
print(next(g)) # print(next(g)) #报错:StopIteration: 3,因为已经没有多余的yield语句啦,上面已经被调用两次了 print(next(g, 'End')) #如果没有元素就给个缺省值 #以上代码执行结果如下:
line 1
line 1
line 1
1
line 2
2
line 3
End
二.生成器应用
1>.无限循环
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def counter():
i = 0
while True:
i += 1
yield i def inc(c):
return next(c) c = counter() #这是一个生成器对象 print(inc(c))
print(inc(c)) #以上代码输出结果如下:
1
2
2>.计数器
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def inc():
def counter():
i = 0
while True:
i += 1
yield i
c = counter()
return lambda : next(c) #这里返回的是匿名函数 foo = inc()
print(foo())
print(foo()) #以上代码输出结果如下:
1
2
3>.处理递归问题
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def fib():
x = 0
y = 1
while True:
yield y
x, y = y, x+y foo = fib() for _ in range(5):
print(next(foo)) for _ in range(100):
next(foo) print(next(foo)) #以上代码输出结果如下:
1
1
2
3
5
6356306993006846248183
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com pre = 0
cur = 1
print(pre,cur,end=" ") def fib(n,pre=0,cur=1):
pre,cur = cur,pre + cur
print(cur,end=" ")
if n == 2:
return
fib(n-1,pre,cur) fib(106)
以上代码改写成递归方式戳我~
4>.协程(coroutine)
(1)生成器的高级用法 (2)比进程,线程轻量级 (3)是在用户空间调度的一种实现 (4)Python3 asyncio就是协程实现,已经加入到标准库 (5)Python3.5 使用async,await关键字直接原生支持协程
协程调度器实现思路:
有2个生成器A,B
next(A)后,A执行到了yield语句暂停,然后去执行next(B),B执行到yield语句也暂停,然后再次调用next(A),再调用next(B),周而复始,就实现了调度的效果
可以引入调度的策略来实现切换的方式 (6)协程就是一种非抢占式调度
三.yield from
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com def inc():
for x in range(1000):
yield x foo = inc()
print(next(foo))
print(next(foo))
print(next(foo)) print("*" * 20 + "我是分割符" +"*" * 20) """
以上代码可以使用yield from代码改写,等价于下的代码:
"""
def inc():
yield from range(1000) bar = inc()
print(next(bar))
print(next(bar))
print(next(bar)) #以上代码输出结果如下:
0
1
2
********************我是分割符********************
0
1
2
#!/usr/bin/env python
#_*_coding:utf-8_*_
#@author :yinzhengjie
#blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
#EMAIL:y1053419035@qq.com """
yield from是Python 3.3出现新的语法 yield from iterable 是 for item in iterable: yield item 形式的语法糖 """ #从可迭代对象中一个个拿元素
def counter(n):
for x in range(n):
yield x def inc(n):
yield from counter(n) foo = inc(10)
print(next(foo))
print(next(foo)) #以上代码执行结果如下:
0
1
yield from是Python 3.3出现新的语法
Python入门篇-生成器函数的更多相关文章
- Python入门篇-匿名函数
Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...
- Python入门篇-函数、参数及参数解构
Python入门篇-函数.参数及参数解构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数概述 1>.函数的作用即分类 函数 数学定义:y=f(x) ,y是x的函数,x ...
- Python入门篇-高阶函数
Python入门篇-高阶函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.高级函数 1>.First Class Object 函数在Python中是一等公民 函数也 ...
- Python入门篇-解析式、生成器
Python入门篇-解析式.生成器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.列表解析式(List Comprehension) 1>.列表解析式语法 语法 [ 返回 ...
- Python入门篇-面向对象概述
Python入门篇-面向对象概述 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.语言的分类 面向机器 抽象成机器指令,机器容易理解 代表:汇编语言 面向过程 做一件事情,排出个 ...
- Python入门篇-类型注解
Python入门篇-类型注解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数定义的弊端 1>.动态语言很灵活,但是这种特性也是弊端 Python是动态语言,变量随时可 ...
- Python入门篇-内建函数
Python入门篇-内建函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常见的内建函数案例 1>.标识id 返回对象的唯一标识,CPython返回内存地址. #!/ ...
- Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict)
Python入门篇-封装与解构和高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.封装和结构 #!/usr/bin/env pytho ...
- Python入门篇-文件操作
Python入门篇-文件操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.文件IO常用操作 open:打开 read:读取 write:写入 close:关闭 readlin ...
随机推荐
- [转]casperjs截图出现黑色背景
原文地址:https://my.oschina.net/tuxpy/blog/879509?utm_medium=referral 如果默认没有指定 body的background-color就会出现 ...
- C# HashSet集合类型使用介绍
1.HashSet集合 使用HashSet可以提高集合的运算.使用HashSet集合不自带排序方法,如果需要排序的需求可以参考使用List<T>集合配合Sort方法. HashSet的优势 ...
- WinForm自动记录从上次关闭位置启动窗体
次功能主要是通过在注册表中读写窗体的Location属性来实现的.在窗体关闭前处理窗体的FormClosed事件,将窗体的Location属性值写入注册表,然后在窗体的Load事件中从注册表中读取保存 ...
- (CSDN 迁移) jFinal找不到或无法加载主类
错误: 找不到或无法加载主类 com.demo.common.DemoConfig 项目上右键 -> Build Path -> Order and Export 修改顺序: 从上到下依次 ...
- PHP Imagick文字加阴影(外发光)
PHP Imagick文字加阴影(外发光)<pre>$canvas = new \Imagick(); $canvas->newImage(500, 200, 'white'); $ ...
- JAVA 8 的新特性
Java8的新特性有:默认方法.函数式接口.lambda表达式.方法引用.Stream.Optional.日期API. 一.默认方法: 接口中的方法可以有方法体,但是必须要有static或者defau ...
- layui 上传图片 实现过程
layui.user一个页面只能有一个,写多了会实现js效果 上传图片官方文档有很多功能,但是演示的代码只是一个一个功能演示,如果要综合起来js代码不是简单的拼凑,需要放在指定位置,比如下面的限制文件 ...
- python学习-35 文件处理
1.简单的打开文件 f=open('test.txt',encoding='utf-8') # 打开了名字为test.txt的文件里的内容 data=f.read() # 读取里面的内容 print( ...
- JavaWeb项目之多条件过滤
相信很多同学在学习java基础之后,面对各种项目还是相当头疼,那今天我将手把手教你学会JavaWeb项目中的多条件过滤,希望你能在与我实战的过程中积累经验,更进一步. 分页查询 需求分析:在列表页面中 ...
- kafka学习笔记(一)——概述
1.kafka是什么? 官方说明是: Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域. 提到了两个概念: 发布/订阅模式 消息队列 下边来理解一下这两个名词. 2. ...