博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python yield 使用浅析(转载)
阅读量:6471 次
发布时间:2019-06-23

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

hot3.png

Python yield 使用浅析

以下是理解归纳

###如何生成斐波那契數列

def fab(max): 	n, a, b = 0, 0, 1 	while n < max:     	print b     	a, b = b, a + b     	n = n + 1

执行

fab(5)

问题是print太多了

解决问题,用list一次打出来

def fab(max): 	n, a, b = 0, 0, 1 	L = [] 	while n < max:     	L.append(b)     	a, b = b, a + b     	n = n + 1 	return L

问题是如果max很大,那么L就很大,占内存

解决占内存问题(通过 iterable 对象来迭代)

class Fab(object): 	def __init__(self, max):     	self.max = max     	self.n, self.a, self.b = 0, 0, 1 	def __iter__(self):    		return self 	def next(self):     	if self.n < self.max:         	r = self.b         	self.a, self.b = self.b, self.a + self.b         	self.n = self.n + 1    			return r   		raise StopIteration()

执行

for n in Fab(5):    	print n

iterable每次只占next的时候的内存

问题:感觉代码太多,没有第一版的 fab 函数来得简洁

使用yield,代码就简洁了

def fab(max): 	n, a, b = 0, 0, 1 	while n < max:     	yield b     	# print b     	a, b = b, a + b     	n = n + 1

执行

for n in fab(5):	print n

###参考博客文字

简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

其他归纳

(iterable和generator)一般不会手动的调用next方法,而使用for循环,如果一直使用next,当到最后一个没有的时候,就会抛异常;

有yield的时候,因为yield相当于另外的返回值,不能直接return具体值(不过在3.0之后的python就可以在yield之前return一个值),会抛SyntaxError: 'return' with argument inside generator异常

转载于:https://my.oschina.net/jiemachina/blog/184763

你可能感兴趣的文章
SpringBoot 实战 (十七) | 整合 WebSocket 实现聊天室
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
12 Go语言map底层浅析
查看>>
vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
查看>>
以主干开发作为持续交付的基础
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
传统运维团队转型应该注意哪些问题?
查看>>
JavaScript函数(二)
查看>>
Airbnb改进部署管道安全性,规范部署顺序
查看>>
腾讯最大规模裁撤中层干部,让贤年轻人
查看>>
当我们谈性能的时候,我们实际上在谈什么?
查看>>
Spring Boot 2.0将会增强Actuator端点的特性
查看>>
i4o开源项目增强LINQ索引功能
查看>>
蔡超:入门 Go 语言必须跨越的五个思维误区
查看>>
使用Akka Actor和Java 8构建反应式应用
查看>>
curl常用命令详解
查看>>
saltstack 添加计划任务
查看>>
Puppet module命令参数介绍(六)
查看>>
《UNIX网络编程》中第一个timer_server的例子
查看>>
CISCO 路由器(4)
查看>>