Day10 python高级特性-- 生成器 Generator
这种一边循环一边计算的机制,在Python中称为生成器:Generator。
方法一: 把一个列表生成式的[] 改成(),就创建了一个生成器。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> a = [ x * x for x in range(1,10) ]
>>> a #a是一个list
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> a = ( x * x for x in range(1,10) )
>>> a #a是一个generator
<generator object <genexpr> at 0x7f2523f8bdb0>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
打印generator中的元素,可使用next() 函数获得generator的下一个返回值。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> next(a)
1
>>> next(a)
4
……
………………
>>> next(a)
64
>>> next(a)
81
>>> next(a) #计算到最后一个元素后,没有更多的元素时,就会抛出错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用next()函数获取generator元素的方式并不好用,正确的方法是使用for循环,generator也是可迭代对象。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> a = ( x * x for x in range(1,10) )
>>> for n in a:
... print(n)
...
4
9
16
25
36
49
64
81
>>>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
但是当推算算法比较复杂时,for循环可能无法实现算法,可以用函数来实现。
斐波那契数列中,除第一个和第二个数之外,任意一个数字都可以由前两个数相加得到。这个逻辑用列表生成式写不出来,但是用函数会很容易:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> def fb(long):
... #L = []
... n, a, b = 0, 0, 1
... while n < long:
... print(b) #L.append(b)
... a, b = b, a + b
... n = n + 1
... return 'End' #return print(L)
...
#>>> fb(20)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] #注释部分是直接生成一个list
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在这里注意一下,赋值语句的逻辑
a, b = b, a + b
=> t = ( b, a + b )
a = t[0]
b = t[1]
方法二: 既然生成了list,就距离generator很近了。要把fb()函数变成generator,只需要把print(b) 改为 yield b 就可以了:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> def fb2(long):
... n, a, b = 0, 0, 1
... while n < long:
... yield b
... a, b = b, a + b
... n = n + 1
... return 'End'
...
>>> fb2(100)
<generator object fb2 at 0x7f2523f8bd58>
>>> a = fb2(100)
>>> next(a)
1
>>> next(a)
1
>>> next(a)
2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
了解一下yield
先做一个测试函数
>>> def test():
... print(1)
... yield 1
... print(2)
... yield 2
... print(3)
... yield 3
...
>>> o = test()
>>> next(o)
1
1
>>> next(o)
2
2
>>> next(o)
3
3
>>> next(o)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
可以看到,在generator执行中,遇到yield就中断了,下次又会接着继续执行。当执行了3次之后,已经没有更多yield可以执行时,再次调用next() 就会抛出错误。
因此在正常循环调用yield过程中,需要给循环设置一个条件来退出循环,不然就会产生一个无限的数列出来。
同样的,在改成generator后,基本上不会用next()来获取下一个返回值,而是用for循环来迭代:
>>> for i in fb2(10):
... print(i)
...
1
1
2
3
5
8
13
21
34
55
但是for循环迭代generator时,拿不到generator的return语句的返回值。(参见fb2()函数定义内容,与上面对fb2() 进行for迭代的结果)
如果要拿到返回值,就必须捕获StopIteration错误,返回值包含在StopIteration的Value中:
>>> def fb2(long):
... n, a, b = 0, 0, 1
... while n < long:
... yield b
... a, b = b, a + b
... n = n + 1
... return 'End'
...
>>> b = fb2(10)
>>> while True:
... try:
... x = next(b)
... print('b:', x)
... except StopIteration as err:
... print('Generator return value:',err.value)
... break
...
b: 1
b: 1
b: 2
b: 3
b: 5
b: 8
b: 13
b: 21
b: 34
b: 55
Generator return value: End
练习: 输出杨辉三角形。
思路:
每一行的首尾都是1,
每一行去掉首尾的1之后会发现,n[1] = up[0] + up[1] , n[2] = up[1] + u[p2] ,也就是 n = up[a] + up[a + 1]
a = [1]
m = 0
while n > m:
yield a
a = [1] + [a[i] + a[i + 1] for i in range(len(a)-1)] + [1]
m = m + 1
return
for i in triangles(7):
print(i)
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
Day10 python高级特性-- 生成器 Generator的更多相关文章
- Python高级特性——生成器(generator)
通过上节的学习,我们知道使用列表生成式,可以直接创建一个列表.但是,有些时候,受到内存的限制等实际情况,列表生成式无法满足.比如,一个长度为1000万的列表,普通内存根本就不够,又或者实际处理的过程中 ...
- python高级特性-生成器
在python中一边循环一边计算的机制成为生成器(generator) 在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行. 生成list > ...
- 三、python高级特性(切片、迭代、列表生成器、生成器)
1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3] #即为['Mli','add','sal'] 从索引0开始 ...
- python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...
- Python高级特性之:List Comprehensions、Generator、Dictionary and set ...
今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力. Python高级特性之:List Comprehensions.Generator.Dictionary an ...
- python高级之生成器&迭代器
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
- 第三篇:python高级之生成器&迭代器
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
- Python高级特性(1):Iterators、Generators和itertools(转)
译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
随机推荐
- 入坑 docsify,一款神奇的文档生成利器!
layout: postcategory: javatitle: 入坑 docsify,一款神奇的文档生成利器!tagline: by 沉默王二tags: - java Guide 哥是我认识的一个非 ...
- Python基础数据类型与for循环
数据类型:int,bool,str,list, tuple元组,dict字典. 1.数字:12,3,4 在使用print打印数字时,在终端界面中无法判断出打印的是什么类型,当我们需要知道一个值是什么类 ...
- [LeetCode题解]21. 合并两个有序链表 | 递归
解题思路 使用递归实现: 定义函数功能:合并两个有序链表,并返回链表的头 结束条件:两个链表其中一个为空,返回另一个链表 递推公式: l1.val < l2.val:l1.next = Merg ...
- ABBYY FineReader 14新建任务窗口给我们哪些帮助?
当您启动ABBYY FineReader时, 新任务 将打开一个窗口,在其中您可以轻松打开.扫描.创建或对比文档. 如果您没有看到此 内置任务 窗口(比如,如果您关闭了该窗口,或者您通过在 Windo ...
- Camtasia绿幕素材的视频合成
随着科技和互联网的快速发展,让越来越多的人喜欢上了视频的各项制作,那么怎么让两个视频进行合成并一起播放呢?操作很简单,下面来讲解具体的操作步骤.小编选用的是Camtasia2019版本的视频编辑软件进 ...
- 巧妙运用Camtasia 旅行Vlog轻松get
旅行时,除了要欣赏当地的美丽风景.享受当地美食外,当然还要将旅行中的各种小细节记录下来.以前我们可能更多地使用相机拍照,现在呢,越来越多的人采用视频拍摄的方式制作Vlog.这种兼具影像与叙事的视频表现 ...
- 如何合理的安排Folx的下载任务
搭配使用Folx专业版的智能速控与任务计划功能,用户可以实现更加自动化.智能化的下载功能.通过使用任务计划功能,用户以时间表的方式安排Folx的下载任务:而智能速控的功能又能确保用户在下载的同时,有足 ...
- [工具推荐]制作基于Dash的本地文档方便搜索文档api和内容
[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近在看es的文档,发现查起api来真的很麻烦,很多现在开源的文档都没有查询 ...
- 浅析Nginx与Apache的区别
Nginx相对于Apache的优势: 1.轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源 2.抗并发,nginx以epoll and kqueue作为开发模型,处理请求是异步非阻塞的 ...
- Mybatis【2.1】-- 从读取流到创建SqlSession发生了什么?
目录 1.Resources.getResourceAsStream("mybatis.xml")到底做了什么? 2. new SqlSessionFactoryBuilder() ...