生成器函数或生成器方法中包含了一个yield表达式。调用生成器函数时,会返回一个迭代子,值从迭代子中每次提取一个(通过调用其__next__()方法)。每次调用__next__()时,生成器函数的yield表达式的值(如果未指定就是None)都会返回。如果生成器函数结束或执行一个return,就产生StopIteration异常。

上面的说法有点官方,下边是一些个人的理解:

1、当一个函数中包含有yield表达式时,在调用这个调用这个函数时,函数的代码并不会运行,而是返回一个迭代子,或者说是一个可用于迭代的容器(相当于一个数组的序列数)。如下面这个例子,当调用a()时并没有运行代码

>>> def a():

            print('a')

            yield 'x'

>>> a()

<generator object a at 0x0000027BBFB380F8>

>>>

2、要想使这个函数运行起来,就需要一个迭代器来读取这个容器内的内容,比如说for语句,如下:

>>> for i in a():
i a
'x'
>>>

3、一个yield表达式只会产生“一个“迭代子,再解释一下,这个迭代子就同于序列[‘a’,’b’,’c’]中‘a’,’b’,’c’的位置参数0,1,2。如果有多个迭代子,当调用迭代器时,就会有多次迭代:

def b():

    print('a')

    yield 1

    print('b')

    yield 3

for i in b():

    print(i)

a

1

b

3

>>>

例子中的for循环执行了两次,第一次迭代的是yield 1产生的迭代子(也可以简单的把它理解为序列的第一个序列号0),返回了结果1和yield 表达式前边的print(‘a’) 的结果,第二次迭代的是yield 3表达式产生的迭代子,结果为yield 3表达式的返回值3和它前边的语句print(‘b’)的结果。

4、yield在一定程度上也有return的作用——都会返回一个值(即上面函数的‘x’)但yield不会终止函数,而是使函数暂停,直到所有的迭代子都被使用后,就会产生一个StopIteration异常,从而终止函数

5、用iter函数来查看可迭代结构的具体过程。

用a=iter(iterable结构)可以获取一个迭代子,在每次循环时可用next(a)方法获取下一个数据项,当结尾时会产生一个StopIteration异常。

函数b()相当于一个包含了两个迭代子的容器;

>>> c=iter(b())

>>> next(c)

a

1

>>> next(c)

b

3

>>> next(c)

Traceback (most recent call last):

File "<pyshell#6>", line 1, in <module>

next(c)

StopIteration

>>>

第一次和第二次迭代分别返回两个迭代子的结果,当所有的迭代子都已使用时,第三次迭代就产生了一个StopIteration。

6、yield返回的就是迭代子的值,yield可以将任意内容设置为迭代子。大多数情况下我们理解的迭代子都是0,1,2,3,4...这样的自然位置迭代,而yield就把它设置为任意的值,a()函数生成的迭代子为 ‘x’,b()函数生成的迭代子为1,3。

Python 3 中生成器函数yield表达式的使用的更多相关文章

  1. Python中生成器和yield语句的用法详解

    Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...

  2. Python入门篇-生成器函数

    Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...

  3. c#中匿名函数lamb表达式

    c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...

  4. Python基础(9)_生成器(yield表达式形式)、面向过程编程

    一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...

  5. Python进阶-VI 生成器函数进阶、生成器表达式、推导式

    一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...

  6. python迭代器与生成器及yield

    一.迭代器(itertor) 1.可迭代: 在Python中如果一个对象有__iter__()方法或__getitem__()方法,则称这个对象是可迭代的(iterable). 其中__iter__( ...

  7. 生成器函数yield

    先看一个栗子: # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/6 21:08' # 生成器函数,函数里只要有yield ...

  8. python基础之生成器、三元表达式、列表生成式、生成器表达式

    生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...

  9. 浅析python迭代器及生成器函数

    1. 什么是迭代协议? 迭代协议主要包括两方面的协议集,一种是迭代器协议,另一种是可迭代协议.对于迭代器协议来说,其要求迭代器对象在能够在迭代环境中一次产生一个结果.对于可迭代协议来说,就是一个对象序 ...

随机推荐

  1. 如何使用 VS2015 进行远程调试?

    VisualStudio\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger 直接复制 Remote Debugger 文件,里面包含了 ...

  2. HDU - 4545 字符串处理

    思路:对于每个字符,如果它能被替换一定要优先替换,其次再进行删除.遵循这个策略即可. 证明: 对于这题的第一个测试数据: abba addba 1 d b 当匹配到'b'  和 'd'时应该优先替换而 ...

  3. 在SpringBoot中添加Logback日志处理

    前言 SpringBoot项目中在官方文档中说明,默认已经依赖了一些日志框架.而其中推荐使用的就是Logback,所以这一次我将在我的模版中加入Logback日志的配置,说明一下,SpringBoot ...

  4. WeakHashMap回收时机结合JVM 虚拟机GC的一些理解

    一直很想知道WeakHashMap的使用场景,想来想去只能用在高速缓存中,而且缓存的数据还不是特别重要,因为key(key不存在被引用的时候)随时会被回收 所以研究了一下WeakHashMap的回收时 ...

  5. Nashorn——在JDK 8中融合Java与JavaScript之力

      从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...

  6. Oracle总结【PLSQL学习】

    PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL... SQL99是什么 (1)是操作所有关系型数据库的 ...

  7. js中的Object.defineProperty()和defineProperties()详解

    ECMAS-262第5版在定义只有内部采用的特性时,提供了描述了属性特征的几种属性.ECMAScript对象中目前存在的属性描述符主要有两种,数据描述符(数据属性)和存取描述符(访问器属性),数据描述 ...

  8. 常用u-boot命令详解(全) 2

    (8) USB 操作指令 指令 功能 usb reset 初始化USB控制器 usb stop [f] 关闭USB控制器 usb tree 已连接的USB设备树 usb info [dev] 显示US ...

  9. Eviews 9.0新功能——估计方法(ARDL、面板自回归、门限回归)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 9.2 估计功能 eviews9.0下载链接: ...

  10. Flex中的FusionCharts 2D柱形图

    1.2D柱形图源码 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:f ...