Python入门篇-生成器函数

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.生成器概述

1>.生成器generator

  生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象

2>. 生成器函数

  函数体中包含yield语句的函数,返回生成器对象生成器对象,是一个可迭代对象,是一个迭代器生成器对象,是延迟计算,惰性求值的

  包含yield语句的生成器函数生成生成器对象的时候,生成器函数的函数体不会立即执行

  next(generator)会从函数的当前位置向后执行到之后碰到的第一个yield语句,会弹出值,并暂停函数执行

  再次调用next函数,和上一条一样的处理过程    没有多余的yield语句能被执行,继续调用next函数,会抛出StopIteration异常  

3>.编写一个生成器函数样例

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #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/
 5 #EMAIL:y1053419035@qq.com
 6
 7 """
 8 关于生成器函数的相关说明:
 9
10     在生成器函数中,使用多个yield语句,执行一次后会暂停执行,把yield表达式的值返回
11
12     再次执行会执行到下一个yield语句
13
14     return 语句依然可以终止函数运行,但return语句返回值不能被捕获到
15
16     return 会导致无法继续获取下一个值,抛出StopIteration异常
17
18     如果函数没有显示的return语句,如果生成器函数执行到结尾,一样会抛出StopIteration异常哟
19
20 """
21 def gen():
22     print('line 1')
23     yield 1
24     print('line 2')
25     yield 2
26     print('line 3')
27     return 3
28
29 next(gen())
30
31 next(gen())
32
33 g = gen()
34
35 print(next(g))
36 print(next(g))
37
38 # print(next(g))              #报错:StopIteration: 3,因为已经没有多余的yield语句啦,上面已经被调用两次了
39
40 print(next(g, 'End'))         #如果没有元素就给个缺省值
41
42
43
44 #以上代码执行结果如下:
45 line 1
46 line 1
47 line 1
48 1
49 line 2
50 2
51 line 3
52 End

二.生成器应用

1>.无限循环

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #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/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 def counter():
 9     i = 0
10     while True:
11         i += 1
12         yield i
13
14 def inc(c):
15         return next(c)
16
17 c = counter()           #这是一个生成器对象
18
19 print(inc(c))
20 print(inc(c))
21
22
23
24 #以上代码输出结果如下:
25 1
26 2

2>.计数器

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #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/
 5 #EMAIL:y1053419035@qq.com
 6
 7 def inc():
 8     def counter():
 9         i = 0
10         while True:
11             i += 1
12             yield i
13     c = counter()
14     return lambda : next(c)  #这里返回的是匿名函数
15
16 foo = inc()
17 print(foo())
18 print(foo())
19
20
21
22 #以上代码输出结果如下:
23 1
24 2

3>.处理递归问题

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #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/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 def fib():
 9     x = 0
10     y = 1
11     while True:
12         yield y
13         x, y = y, x+y
14
15 foo = fib()
16
17 for _ in range(5):
18     print(next(foo))
19
20 for _ in range(100):
21     next(foo)
22
23 print(next(foo))
24
25
26 #以上代码输出结果如下:
27 1
28 1
29 2
30 3
31 5
32 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 + curprint(cur,end=" ")if n == 2:returnfib(n-1,pre,cur)fib(106)

以上代码改写成递归方式戳我~

4>.协程(coroutine)

(1)生成器的高级用法(2)比进程,线程轻量级(3)是在用户空间调度的一种实现(4)Python3 asyncio就是协程实现,已经加入到标准库(5)Python3.5 使用async,await关键字直接原生支持协程
协程调度器实现思路:有2个生成器A,Bnext(A)后,A执行到了yield语句暂停,然后去执行next(B),B执行到yield语句也暂停,然后再次调用next(A),再调用next(B),周而复始,就实现了调度的效果可以引入调度的策略来实现切换的方式(6)协程就是一种非抢占式调度

三.yield from

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #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/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 def inc():
 9     for x in range(1000):
10         yield x
11
12 foo = inc()
13 print(next(foo))
14 print(next(foo))
15 print(next(foo))
16
17 print("*" * 20 + "我是分割符" +"*" * 20)
18
19 """
20     以上代码可以使用yield from代码改写,等价于下的代码:
21 """
22 def inc():
23     yield from range(1000)
24
25 bar = inc()
26 print(next(bar))
27 print(next(bar))
28 print(next(bar))
29
30
31
32 #以上代码输出结果如下:
33 0
34 1
35 2
36 ********************我是分割符********************
37 0
38 1
39 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 xdef inc(n):yield from counter(n)foo = inc(10)
print(next(foo))
print(next(foo))#以上代码执行结果如下:
0
1

yield from是Python 3.3出现新的语法

转载于:https://www.cnblogs.com/yinzhengjie/p/10962910.html

Python入门篇-生成器函数相关推荐

  1. Python入门篇-匿名函数

    Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...

  2. Python入门篇-高级数据类型集合(set)和字典(dict)

    Python入门篇-高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集合(set) 1>.集合的特点 约定set 翻译为集合c ...

  3. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.partial方法 1>.partial概述 偏函数,把函数部分的参数固定下来,相当 ...

  4. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...

  5. 〖Python零基础入门篇㉛〗- 函数的定义与使用

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  6. 【python入门篇——16】Python函数详解(函数定义,参数种类、返回值、作用域等)

    一 函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 1.代码重用2.保持一致性3.可扩展性 二 函数的创建 2.1 格式: Pyt ...

  7. python入门系列:函数

    引言 将一段代码集中到一块,起一个名字,下次可以根据这个名字再次使用这个代码块. 作用: 方便代码重用 分解任务,简化程序逻辑 使代码更加模块化 函数的参数 所有的传参方式都是传引用,注意列表做参数和 ...

  8. 学习python(入门篇)

    俺这里想给大家初步介绍一下Python编程. 各位能看英文的, 最好是去看www.python.org上的其原作者Guido van Rossum 的入门介绍. (Python看成自1.6版以后就能处 ...

  9. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇

    写在前面 本文对知乎上关于Python入门方面的问答.文章.专栏做了一定的收集和整理,希望对各位Python学习者能有帮助,至少可以节省大家一点时间. 这一篇主要针对的是零基础或初学Python,包括 ...

最新文章

  1. PCB相关的基础知识
  2. Window Operations(窗口函数的使用)
  3. VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例
  4. android 加载过程,Android View (2) View的加载过程
  5. Android四大组件之间的交互,Android四大组件每个组件的作用?它们都可以开启多进程吗?...
  6. android packagemanager源码,Android源码个个击破之PackageManager
  7. 全球与中国高密度聚乙烯塑料桶市场深度研究分析报告
  8. android srgb模式,一加3固件官方更新:加入屏幕边缘防误触和sRGB显示模式功能
  9. 同事篇(12年至今)
  10. 软件测试速记口诀(一)<软件测试基础>
  11. 解决:win10下teamviewer检测为商业用途
  12. sqlserver存储过程调试方法
  13. 最新家庭亲戚关系计算器微信小程序源码
  14. 封装的含义、封装的作用、如何封装、什么情况下封装?
  15. 计算物体自由下落的距离:一个物体从100米的高度自由落下求它在前三秒内下落的垂直距离。重力加速度为10m/s^2。
  16. 办公自动化(OA),你真的了解吗?
  17. 常见的网站程序的数据库配置文件路径
  18. GitHub重磅官宣!抖音四面被拒,再战头条终获offer
  19. window server 2019 将服务器加入域控中
  20. 为什么工厂管理那么难?

热门文章

  1. (计算机组成原理)第七章输入和输出系统-第四节3:I/O方式之DMA方式
  2. 6-2-1:STL之string——string的快速入门、常用接口
  3. RCF - C ++的进程间通信
  4. Qt中设置窗体固定大小的方法
  5. yum提示Another app is currently holding the yum lock; waiting for it to exit...
  6. oracle 导入导出指定表
  7. jquery中的ajax方法参数——$.ajax()方法详解
  8. Train Problem II 卡特兰裸题(入门题)
  9. T_SQL的 FOR XML PATH 用法
  10. SilverLight MD5加密