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

Python代码  
  1. def count(n):
  2. while n > 0:
  3. yield n   #生成值:n
  4. n -= 1

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

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

Python代码  
  1. c = count(5)
  2. c.next()
  3. >>> 5
  4. c.next()
  5. >>>4

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

Python代码  
  1. def count(n):
  2. print "cunting"
  3. while n > 0:
  4. yield n   #生成值:n
  5. n -= 1

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

Python代码  
  1. def count(n):
  2. print "cunting"
  3. while n > 0:
  4. print 'before yield'
  5. yield n   #生成值:n
  6. n -= 1
  7. print 'after yield'

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

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

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

Python代码  
  1. for i in count(5):
  2. print i,

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

Python代码  
  1. import time
  2. def tail(f):
  3. f.seek(0,2)#移动到文件EOF,参考:[seek](http://docs.python.org/2/library/stdtypes.html?highlight=file#file.seek)
  4. while True:
  5. line = f.readline()  #读取文件中新的文本行
  6. if not line:
  7. time.sleep(0.1)
  8. continue
  9. yield line
  10. def grep(lines,searchtext):
  11. for line in lines:
  12. if searchtext in line:
  13. yield line

调用:

Python代码  
  1. flog = tail(open('warn.log'))
  2. pylines = grep(flog,'python')
  3. for line in pylines:
  4. print line,

用yield实现斐波那契数列:

Python代码  
  1. def fibonacci():
  2. a=b=1
  3. yield a
  4. yield b
  5. while True:
  6. a,b = b,a+b
  7. yield b

调用:

Python代码  
  1. for num in fibonacci():
  2. if num > 100:
  3. break
  4. print num,

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

Python代码  
  1. def read_file(path):
  2. size = 1024
  3. with open(path,'r') as f:
  4. while True:
  5. block = f.read(SIZE)
  6. if block:
  7. yield block
  8. else:
  9. return

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

Python代码  
  1. >>> def test_return():
  2. ...      yield 4
  3. ...      return 0
  4. ...
  5. File "<stdin>", line 3
  6. SyntaxError: 'return' with argument inside generator

原文地址:http://liuzhijun.iteye.com/blog/1852369#comments

转载于:https://www.cnblogs.com/frankcoder/p/5121734.html

[转]python yield相关推荐

  1. Python yield 斐波那契数列

    原文:https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ Python yield 使用浅析 您可能听说过,带有 ...

  2. 2020-12-11 Python yield 使用浅析

    Python yield 使用浅析 您可能听说过,带有 yield 的函数在 Python 中被称之为 generator(生成器),何谓 generator ? 我们先抛开 generator,以一 ...

  3. 1、【转载】Python yield 使用浅析

    1.[转载]Python yield 使用浅析 [注:此文转载自https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/ ...

  4. Python yield generator

    http://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/, Python yield 使用浅析 这篇说的很清楚 主要看到F ...

  5. 7、【转载】python yield generator 详解

    7.[转载]python yield generator 详解 目录 generator基础 generator应用 generator基础应用 generator高级应用 注意事项: 正文 本文将由 ...

  6. Python yield 详解(嚼碎了喂你,一篇精通,无需再看其他文章)

    Python yield详解 文章目录 Python yield详解 由"斐波那契"深入理解yield案例 第一个版本 第二个版本 问题的引出 第三个版本 第四个版本 总结 细化总 ...

  7. python yield 用法详解

    python yield 生成器 文章目录 python yield 生成器 1. 背景 2. 如何生成斐波那契數列 清单 1. 简单输出斐波那契數列前 N 个数 清单 2. 输出斐波那契數列前 N ...

  8. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  9. python yield理解_对Python中Yield的理解

    看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来. 要说yield首先要说python中的生成器,那么什么是生成器? 假设有 ...

  10. python yield yield from

    1.可迭代对象 具备可迭代的能力,即enumerable,在python中指的是可以通过for-in去逐个访问元素的一些对象,比如元组tuple,列表list,字符串string,文件对象file等. ...

最新文章

  1. 刚刚,华为重磅宣布:无人驾驶正式上高速!
  2. linux 移动重命名 mv 命令简介
  3. 计算机三级数据库应用题设计题,2017年计算机三级《数据库技术》模拟应用题及答案...
  4. BSP tag in CRM and JSP tag in Hybris
  5. 使用Spring Security和OAuth 2.0保护Spring微服务架构
  6. javabean 连接mysql_连接mysql的javabean实例+简单分页
  7. 《C++ Primer 第五版》(第4.11节类型转换) ————关于无符号数和有符号数的运算探究
  8. 深入理解Tomcat和Jetty源码之第四篇tomcat系统架构上:容器是如何设计的
  9. Python2和Python3正则匹配中文时的编码问题
  10. Android编译默认英语,Android 编译系统 (一)
  11. linux sed 1的意思,linux命令(1):sed命令
  12. python之路alex_Python之路--python基础2
  13. ubuntu系统使用光盘/ISO镜像作为apt-get更新源
  14. 计算机等级一考通2021,2021驾校一考通题库
  15. 设计模式面对面之单例模式
  16. java 信号处理模块_GitHub - Astoros-Fung/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...
  17. 下载Postman并且汉化使用
  18. 安排,Java智慧农业物联网项目视频2020
  19. java实现excel合并的单元格自动换行自动调高
  20. 投资中最简单的事--阅读笔记

热门文章

  1. 几个关于money处理的函数
  2. 集成 AquaLogic BPM Suite 6.0 和 AquaLogic Service Bus
  3. 综合布线智能配线系统发展趋势
  4. Import和Assembly
  5. 一种使用蒸汽眼罩保养的方法
  6. 明天mbzuai面试的准备,严阵以待
  7. vc2008中使用boost库
  8. 【译】什么是React Hooks
  9. padavan 源码
  10. Apache PDFBox 存在高危 XXE 漏洞,建议升级至 2.0.15