Python 3 中生成器函数yield表达式的使用
生成器函数或生成器方法中包含了一个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表达式的使用的更多相关文章
- Python中生成器和yield语句的用法详解
Python中生成器和yield语句的用法详解 在开始课程之前,我要求学生们填写一份调查表,这个调查表反映了它们对Python中一些概念的理解情况.一些话题("if/else控制流" ...
- Python入门篇-生成器函数
Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...
- c#中匿名函数lamb表达式
c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...
- Python基础(9)_生成器(yield表达式形式)、面向过程编程
一.yield表达式形式 1 #装饰器,初始化含yield表达式的生成器 def init(func): def wrapper(*args,**kwargs): g=func(*args,**kwa ...
- Python进阶-VI 生成器函数进阶、生成器表达式、推导式
一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...
- python迭代器与生成器及yield
一.迭代器(itertor) 1.可迭代: 在Python中如果一个对象有__iter__()方法或__getitem__()方法,则称这个对象是可迭代的(iterable). 其中__iter__( ...
- 生成器函数yield
先看一个栗子: # -*- coding:UTF-8 -*- __autor__ = 'zhouli' __date__ = '2018/12/6 21:08' # 生成器函数,函数里只要有yield ...
- python基础之生成器、三元表达式、列表生成式、生成器表达式
生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 pri ...
- 浅析python迭代器及生成器函数
1. 什么是迭代协议? 迭代协议主要包括两方面的协议集,一种是迭代器协议,另一种是可迭代协议.对于迭代器协议来说,其要求迭代器对象在能够在迭代环境中一次产生一个结果.对于可迭代协议来说,就是一个对象序 ...
随机推荐
- UVA - 11292 Dragon of Loowater 贪心
贪心策略:一个直径为X的头颅,应该让雇佣费用满足大于等于X且最小的骑士来砍掉,这样才能使得花费最少. AC代码 #include <cstdio> #include <cmath&g ...
- 通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 短信服务:通知类和验证码短信,全国三网合一通道,5秒内到达,费用低 ...
- eclipse调试hadoop2.2.0源码笔记
在hadoop1.x版本时使用的是在Windows下编译Eclipse插件,远程调试集群.换成2.2.0,没有eclipse-plugin文件. hadoop2.2.0"远程调试集群&quo ...
- 网络基础tcp/ip协议五
传输层的作用: ip层提供点到点的链接. 传输层提供端到端的链接. 传输层的协议: TCP: 传输控制协议可靠的,面向链接的协议,传输效率低. UDP: 用户数据报协议,不可靠,无连接的服务,传输效率 ...
- js将汉字转为相应的拼音
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- canvas API总结
从简单的基本图形,到复杂炫酷的动画,通过canvas元素获取的2D图形渲染上下文CanvasRenderingContext2D,能够使用丰富的API来进行图形绘制.这篇文章将会总结在之前的canva ...
- php替换文件指定行的内容
//第一种 利用file 函数 读取文件,每一行都是一个数组元素 $arr = file($file); $arr[$line] = "hello"; file_put_conte ...
- error: No curses/termcap library found的解决办法
mysql版本:5.1.30 已经不记得这次是第几次安装mysql了,遇到这个问题倒是第一次. 之前在tar,./configure,make,make install 经典四步时,从来没有想过其中的 ...
- apache在window server 2003下的安全配置
在window server2003下安装apache apache 默认有system权限.所以要先对apache进行降权. 添加用户.我的电脑右击 ->管理->本地用户和组
- “玲珑杯”ACM比赛 Round #4 B Best couple
一眼的KM,但是建图的时候记得不用的点设为0,点少的一边补齐,这个非常重要,因为KM追求完全匹配,如果无法完全匹配会非常慢 #include<bits/stdc++.h> using na ...