yield:生成器 ----------------

news/2024/12/23 2:25:11/

yield:生成器

任何使用yield的函数都称之为生成器,如:

def count(n):while n > 0:yield n   #生成值:nn -= 1

另外一种说法:生成器就是一个返回迭代器的函数,与普通函数的区别是生成器包含yield语句,更简单点理解生成器就是一个迭代器。

使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用next()方法返回序列值。

c = count(5)
c.next()
>>> 5
c.next()
>>>4

生成器函数只有在调用next()方法的时候才开始执行函数里面的语句,比如:

def count(n):print "cunting"while n > 0:yield n   #生成值:nn -= 1

在调用count函数时:c=count(5),并不会打印"counting"只有等到调用c.next()时才真正执行里面的语句。每次调用next()方法时,count函数会运行到语句yield n处为止,next()的返回值就是生成值n,再次调用next()方法时,函数继续执行yield之后的语句(熟悉Java的朋友肯定知道Thread.yield()方法,作用是暂停当前线程的运行,让其他线程执行),如:

def count(n):print "cunting"while n > 0:print 'before yield'yield n   #生成值:nn -= 1print 'after yield'

上述代码在第一次调用next方法时,并不会打印"after yield"。如果一直调用next方法,当执行到没有可迭代的值后,程序就会报错:

Traceback (most recent call last):
File “”, line 1, in
StopIteration

所以一般不会手动的调用next方法,而使用for循环:

for i in count(5):print i,

实例: 用yield生成器模拟Linux中命令:tail -f | grep python 用于查找监控日志文件中出现有python字样的行。

import time
def tail(f):f.seek(0,2)#移动到文件EOF,参考:[seek](http://docs.python.org/2/library/stdtypes.html?highlight=file#file.seek)while True:line = f.readline()  #读取文件中新的文本行if not line:time.sleep(0.1)continueyield linedef grep(lines,searchtext):for line in lines:if searchtext in line:yield line

调用:

flog = tail(open('warn.log'))
pylines = grep(flog,'python')
for line in pylines:print line,

用yield实现斐波那契数列:

def fibonacci():a=b=1yield ayield bwhile True:a,b = b,a+byield b

调用:

for num in fibonacci():if num > 100:breakprint num,

yield中return的作用:
作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中return 某个值,包括None值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的return,表示结束该语句。
通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:

def read_file(path):size = 1024with open(path,'r') as f:while True:block = f.read(SIZE)if block:yield blockelse:return

如果是在函数中return 具体某个值,就直接抛异常了

>>> def test_return():
...      yield 4
...      return 0
...File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator

与yield有关的一个很重要的概念叫协程,下次好好研究研究。

参考:
http://www.cnblogs.com/huxi/archive/2011/07/14/2106863.html
http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
《Python 参考手册》


http://www.ppmy.cn/news/1535870.html

相关文章

23.2 prometheus为k8s做的4大适配工作

本节重点介绍 : k8s监控中的4大采集类型总结prometheus为k8s监控做的4大适配工作 k8s关注指标分析 在监控每个细分的领域时&#xff0c;我们都要先思考下到底需要关注哪些方面的指标。k8s中组件复杂&#xff0c;我们主要专注的无外乎四大块指标&#xff1a;容器基础资源指标…

AR技术在电商行业的应用及优势有哪些?

AR&#xff08;增强现实&#xff09;技术在电商行业的应用广泛且深入&#xff0c;为消费者带来了全新的购物体验&#xff0c;同时也为商家带来了诸多优势。以下是AR技术在电商行业的主要应用场景及其优势&#xff1a; 一、应用场景 1、虚拟商品展示与试用 家具AR摆放&#x…

B 私域模式升级:开源技术助力传统经销体系转型

一、引言 1.1 研究背景 随着市场竞争加剧&#xff0c;传统经销代理体系面临挑战。同时&#xff0c;开源技术发展迅速&#xff0c;为 B 私域升级带来新机遇。在当今数字化时代&#xff0c;企业面临着日益激烈的市场竞争。传统的经销代理体系由于管理效率低下、渠道局限、库存压…

eNSP网络配置指南:IP设置、DNS、Telnet、DHCP与路由表管理

1.eNSP基本操作和路由器IP配置命令 登录设备&#xff1a;通过Console口或通过eNSP的Telnet/SSH客户端登录到设备。进入特权模式&#xff1a;输入system-view进入系统视图。接口配置&#xff1a; 进入接口视图&#xff0c;例如interface GigabitEthernet0/0/0。配置IP地址和子网…

黑马头条(10-1开始学习)

文章目录 开始序列化将对象与字符串相加&#xff08;例如 对象 ""&#xff09;和序列化对象&#xff08;如 JSON 序列化&#xff09;之间有几个主要的区别&#xff1a;1. **用途**2. **输出格式**3. **适用场景**4. **性能**5. **灵活性**总结 项目手机验证码Thread…

编写高质量dbt模型实践指南

数据建模是越来越受关注的话题&#xff0c;尤其是在分析工程领域。数据建模和流行的数据转换工具dbt是相辅相成的。虽然数据建模概念已经存在很长时间&#xff0c;但dbt让它更具体、更易实现。 可以将数据模型理解为一系列转换&#xff0c;这些转换将数据从原始形式转化为最终可…

物联网 IOT 与工业物联网 IIOT 极简理解

物联网 IOT IOT&#xff08;全称 Internet of Things&#xff09;指物联网&#xff0c;它是指通过互联网连接&#xff0c;将各种物体&#xff08;例如&#xff0c;传感器、设备、车辆等&#xff09;和人进行互联互通的网络系统 物联网的核心是将各种物体连接到互联网&#xff…

Github 2024-10-03Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-10-03统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1快速且可扩展的多平台Web服务器 创建周期:3551 天开发语言:Go协议类型:Apache License 2.0Star数量:57434 个Fork数…