iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >深入学习python的yield和generator
  • 343
分享到

深入学习python的yield和generator

pythonyieldgenerator 2022-06-04 19:06:54 343人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

前言 没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中,别人问到了协程,顿时语塞,死活想不起来曾经看过

前言
没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中,别人问到了协程,顿时语塞,死活想不起来曾经看过的东西,之后突然想到了yield,但为时已晚,只能说概念不清,所以本篇先缕缕Python的生成器和yield关键字。

什么是生成器
1、生成器是一个特殊的程序,可以被用作控制循环的迭代行为
2、生成器类似于返回值为数组的一个函数,这个函数可以接收参数,可以被调用,但是,不同于一般的函数会一次性返回包含了所有数值的数组,生成器一次只产生一个值,这样消耗的内粗数量大大减少,而且允许调用函数可以很快的开始处理前几个返回值。因此,生成器看起来像一个函数但是表现的却像一个迭代器。
python中的生成器
python提供了两种基本的方式。

1)、生成器函数:也是用def来定义,利用关键字yield一次返回一个结果,阻塞,重新开始
2)、生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果
下面详细讲解。

1、生成器函数
为什么叫生成器函数?因为他随着时间的推移生成了一个数值队列。一般的函数在执行完毕之后会返回一个值然后退出,但是生成器函数会自动挂起,然后重新拾起继续执行,他会利用yield关键字关起函数,给调用者返回一个值,同时保留了当前的足够多的状态,可以使函数继续执行。生成器和迭代协议是密切相关的,可迭代的对象都有一个__next()__成员方法,这个方法要么返回迭代的下一项,要么引起异常结束迭代。
为了支持迭代协议,拥有yield语句的函数被编译为生成器,这类函数被调用时返回一个生成器对象,返回的对象支持迭代接口,即成员方法__next()__继续从中断处执行执行。
看下面的例子:


# codes
def create_counter(n):
 print "create counter"
 while True:
  yield n
  print 'increment n'
  n += 1

cnt = create_counter(2)
print cnt
print next(cnt)
print next(cnt)

# output
<generator object create_counter at 0x0000000001D141B0>
create counter
2
increment n
3

分析一下这个例子:

在create_counter函数中出现了关键字yield,预示着这个函数每次只产生一个结果值,这个函数返回一个生成器(通过第一行输出可以看出来),用来产生连续的n值 在创造生成器实例的时候,只需要像普通函数一样调用就可以,但是这个调用却不会执行这个函数,这个可以通过输出看出来 next()函数将生成器对象作为自己的参数,在第一次调用的时候,他执行了create_counter()函数到yield语句,返回产生的值2 我们重复的调用next()函数,每次他都会从上次被挂起的地方开始执行,直到再次遇到了yield关键字

为了更加深刻的理解,我们再举一个例子。


#coding
def cube(n):
 for i in range(n):
  yield i ** 3

for i in cube(5):
 print i

#output
0
1
8
27
64

所以从理解函数的角度出发我们可以将yield类比为return,但是功能确实完全不同,在for循环中,会自动遵循迭代规则,每次调用next()函数,所以上面的结果不难理解。

2、生成器表达式
生成器表达式来自于迭代和列表解析的组合,关于列表解析的概念和用法可以参见我之前的博客,生成器表达式和列表解析类似,但是他使用尖括号而不是方括号括起来的。如下代码:


>>> # 列表解析生成列表
>>> [ x ** 3 for x in range(5)]
[0, 1, 8, 27, 64]
>>> 
>>> # 生成器表达式
>>> (x ** 3 for x in range(5))
<generator object <genexpr> at 0x000000000315F678>
>>> # 两者之间转换
>>> list(x ** 3 for x in range(5))
[0, 1, 8, 27, 64]

就操作而言,生成器表如果使用大量的next()函数会显得十分不方便,for循环会自动出发next函数,所以可以按下面方式使用:


>>> for n in (x ** 3 for x in range(5)):
 print('%s, %s' % (n, n * n))

 
0, 0
1, 1
8, 64
27, 729
64, 4096
>>> 

两者比较
一个迭代既可以被写成生成器函数,也可以被协程生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。

总结
想起了初中时候老师经常说的,眼观千遍,不如手动一遍。

--结束END--

本文标题: 深入学习python的yield和generator

本文链接: https://www.lsjlt.com/news/15193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入学习python的yield和generator
    前言 没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中,别人问到了协程,顿时语塞,死活想不起来曾经看过...
    99+
    2022-06-04
    python yield generator
  • 由浅入深讲解python中的yield与generator
    前言 本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,genera...
    99+
    2022-06-04
    由浅入深 python generator
  • Python深度学习 深度学习入门基于
    《Python深度学习》由Keras之父、现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。书...
    99+
    2023-01-31
    深度 入门 Python
  • Python struct模块-深入学习
    Python struct模块 用处struct模块中的函数格式化字符串 对齐方式格式符code使用示例Python参考手册struct模块链接 转载请标明出处(http://blog.csdn.net/lis_12/a...
    99+
    2023-01-31
    模块 Python struct
  • python生成器generator:深度学习读取batch图片的操作
    在深度学习中训练模型的过程中读取图片数据,如果将图片数据全部读入内存是不现实的,所以有必要使用生成器来读取数据。 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含...
    99+
    2022-06-02
    python 生成器generator 读取batch图片
  • opencv深入浅出了解机器学习和深度学习
    目录机器学习kNN算法图解kNN算法用kNN算法实现手写数字识别SVM算法图解SVM算法使用SVM算法识别手写数据k均值聚类算法图解k均值聚类算法使用k均值聚类算法量化图像颜色深度学...
    99+
    2022-11-13
  • vue3深入学习 nextTick和historyApiFallback
    目录1、nextTick2、historyApiFallback1、nextTick  官方解释:将回调推迟到下一个 DOM 更新周期之后执行。在更改了一些数据以等待 DO...
    99+
    2022-11-13
    vue3  nextTick vue3  historyApiFallback
  • 深度学习入门:从Python开始
    近年来,深度学习已成为机器学习领域的热门话题之一,其应用范围也越来越广泛。作为一名人工智能专家,程序员,软件架构师和CTO,我想通过这篇文章为读者介绍深度学习的入门知识,以便他们能够更好地理解和掌握深...
    99+
    2023-10-04
    深度学习 python 人工智能
  • python类属性学习深入讲解
    class MyClass(): # 直接将属性定义在类中,这种属性称为 类属性 # 类属性可以通过实列对象和类对象访问,但是只能通过类对象修改 # 类属性都是用来保...
    99+
    2022-11-11
  • 深入学习Python中的装饰器使用
    装饰器 vs 装饰器模式 首先,大家需要明白的是使用装饰器这个词可能会有不少让大家担忧的地方,因为它很容易和设计模式这本书里面的装饰器模式发生混淆。曾经一度考虑给这个新的功能取一些其它的术语名称,但是装饰器...
    99+
    2022-06-04
    Python
  • 深入学习JavaScript中的promise
    目录为什么要用Promise?使用Promise解决异步控制问题Promise的结构回调函数为什么异步代码一定是回调函数结构?刨析Promise原型方法——c...
    99+
    2022-11-13
  • 深入学习Android中的Intent
    Intent提供了一种通用的消息系统,它允许在你的应用程序见传递Intent来执行动作和产生事件,使用Intent可以激活Android应用的三种类型的核心组件:活动Activ...
    99+
    2022-06-06
    intent Android
  • 深入学习java8 中的CompletableFuture
    目录1 前言2 简单使用3 异步处理3.1 thenApply3.2 thenAccept 和 thenRun3.3 exceptionally 异常处理3.4 whenComple...
    99+
    2022-11-13
  • 深入学习JS XML和Fetch请求
    目录1.HTTP 简介HTTP/0.9 ( 1991 )HTTP/1.0 (1996 )HTTP/1.1(1997)常用状态码header请求头header响应头Content-Ty...
    99+
    2022-11-13
  • Python-OpenCV深度学习入门示例详解
    目录0.前言1.计算机视觉中的深度学习简介1.1深度学习的特点1.2深度学习大爆发2.用于图像分类的深度学习简介3.用于目标检测的深度学习简介4.深度学习框架keras介绍与使用4....
    99+
    2022-11-12
  • 深入学习Golang的流程控制
    目录1. 条件语句1.1 if 语句1.2 switch 语句2. 循环语句2.1 for 语句2.2 range 语句3. 跳转语句3.1 break 语句3.2 continue...
    99+
    2023-05-18
    Golang流程控制 Golang流程
  • 一篇文章带你深入学习Python函数
    目录函数的特性:函数是对象:函数可以删除:总结函数的特性: 函数是对象函数可以删除函数名字和函数本身完全是分开的函数因为是对象,可以结合数据结构使用函数因为是对象,可以作为函数参数函...
    99+
    2022-11-13
  • pyTorch深入学习梯度和Linear Regression实现
    目录梯度线性回归(linear regression)模拟数据集加载数据集定义loss_function梯度 PyTorch的数据结构是tensor,它有个属性叫做requires_...
    99+
    2022-11-12
  • python数学建模是加深Numpy和Pandas学习
    目录前言Numpy 学习1-numpy.array2-numpy.empty3-numpy.zeros4-numpy.ones NumPy 从已有的数组创建数组1-nump...
    99+
    2022-11-11
  • python深度学习tensorflow入门基础教程示例
    目录正文1、编辑器2、常量3、变量4、占位符5、图(graph)例子1:hello world例子2:加法和乘法例子3:矩阵乘法正文 TensorFlow用张量这种数据结构来表示所有...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作