Python中yield的使用小述

【Python】yield的使用方法 当你实现自己的数据结构(如图、树、链表等)时,使用。 阅读详情

Python中yield恐怕是最迷人的特性之一了,不过要想理解到位也需要费点功夫。官方有一份比较详细的介绍,是基于v2.5.2的。虽然较长,不过建议耐心看完。本文只是想说多一些个人理解。

Python支持yield,主要是为了解决C++/Java中常见的回调函数(callback)问题,不得不说,Python的yield方式比callback要优雅得多。

函数体中如果用了yield, 那么它就变成一个函数生成器,而非直接返回值(或对象)的普通函数。确切的说,它返回的是一个迭代器。迭代器的典型用法比如:

for i in iter_01:
    print i
这里,如果有C++/Java基础的同学可能更习惯于以下写法:

for i in range(3):
    print i
注意:这里range(3)返回的是一个Python列表(list),但是这个列表并不是一般意义上C++/Java那样的数组,python里的列表实现了迭代器, 我们可以打开list的帮助文档:

>>> help(list)

...

 __iter__(...)

...

看见了吧,Python的list实际上实现了迭代器。所以请记住,Python里在in 出现的对象一定是被当作一个迭代器。

这个有什么用?唔,它对yield的理解很重要。

我们看一个小例子。比如写一个递归的二叉树中序遍历函数,普通递归方法如下:

def inorder(root):
    if root:
        inorder(root.left)
        print root.val,
        inorder(root.right)
很简单对不对?它对于每次遍历到的节点直接做了标准输出。现在我们来做一些改变,如果我们希望返回一个列表,使得每个节点的使用留待外部决定,现在选择yield。

def inorder(root):
    if root:
        inorder(root.left)
        yield root.val
        inorder(root.right)

 很快改好了,简单。运行一下试试?你会发现它没有返回所有节点,仅仅返回了root的值。问题出在哪呢?是递归没有执行么?

如果我们认为每一条yield语句就返回迭代器的一个值,那么上面的代码就应该是对的。很遗憾,恰恰就错在这。yield真正的意义是使得包含yield的函数成为一个返回迭代器的生成器,而每条yield语句其实是往这个迭代器里‘push’一个元素, 这个元素就是yield后面紧跟的表达式的值。所以,在函数体内,我们要对每一次该函数的递归调用,都使用for-in语句遍历一次迭代器。改正过的函数如下:

def inorder(root):
    if root:
        for x in inorder(root.left):
            yield x
        yield root.val
        for x in inorder(root.right):
            yield x

小结:

1. 含有yield语句的函数成为一个生成器,它返回一个迭代器。

2. 对于迭代器的遍历,安全方法是for-in语句,记住in后面紧跟的表达式都被视为迭代器。

2. 对于生成器函数的递归调用,每当递归调用发生时,必须进行一次for-in遍历

python当中的yield函数具体如何使用 问题起源于初次接触scrapy时,好奇于spider子类当中的parse方法,在parse()当中为了Request next_url,而要使用yield函数。     于是乎撸了一段代码试验一下yield:import scrapy from items import Work1Item class Work1Spider(scrapy.Spider): name = 'wo 阅读详情

相关推荐

Python实战:5分钟搞定抖音无水印视频下载(附完整代码)

本文系统介绍了抖音无水印视频下载的多种技术方案,重点解析了抖音视频的获取逻辑与去水印原理。文章提供了从零代码的浏览器插件到可编程的Python脚本的完整实现路径,并附带了详细的代码示例,帮助用户快速构建自己的抖音视频下载工具箱。

weixin_29089057的博客 846

刚毕业的表弟年薪40w......程序员薪资天花板?

前不久,“腾讯2022校招-应届毕业生年薪 40 万”刷屏了… 尽管互联网大厂的薪资高不算什么新鲜事儿,但这个热搜仍然让我大受震撼。 腾讯校招官网显示,2022届腾讯校招开放技术、产品、设计等岗位共计 78 个,且以IT岗为主。 另据各大招聘平台统计数据,腾讯2022届研发岗应届生基础月薪在1.7万-2.3万之间,签字费(针对优秀人才的额外奖励)3万,股票依据不同等级从6万到20万不等,就算是最低等级的“白菜包”,年薪总包也远超40万元。 职业发展 作为一个代码打工仔,对于绝大部分程序员来说,想要成为牛

xx_nm98的博客 1791

关于mos管的压降问题(项目遇到问题总结)

在研发过程中没有出现问题的板子,到了小批时竟出现雷达一直在触发???找了大几天,没有头绪。心中疑惑颇多,加上老板催促,自考等原因,真是压力山大。4月份自考,只有差不多一个月时间了吧,没有什么大的收获,反而在查找硬件问题的过程中,发现了一个自己忽视的一个问题,就是关于Mos管的压降问题。 备考的过程崎岖不平,工作又问题多多,孰轻孰重,如何取舍?从心理来说,不想取舍什么,只是有所得就可以,过不了就过不了呗,已经毕业十五年了,没这个本科文凭不也过来了吗?只是代表了自己在这一段时间的思考,自己兴趣吧,没什么大不了

guangod的博客 2万+

【Python】yield函数

在Python中,yield关键字主要用于生成器函数(generator functions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会一次性将所有结果都加载到内存中。yield函数属性当一个函数包含yield关键字时,这个函数就变成了一个生成器函数。调用生成器函数并不会立即执行函数体内的代码,而是返回一个生成器对象。生成器对象可以被迭代,每次迭代时,生成器函数会从上次离开的地方继续执行,直到遇到下一个yield语句,然后返回一个值,并保存当前状态,以便下次继续执行。

xiaodoudouer的博客 1万+

ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

【代码】ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

weixin_47584092的博客 910

【YOLO系列】YOLOv12详解:模型结构、损失函数、训练方法及代码实现

本文提出YOLOv12,一种以注意力为中心的实时目标检测框架,通过创新性改进解决传统YOLO模型在精度与速度上的失衡问题。核心贡献包括:1)轻量混合注意力模块(LHA)结合通道与空间注意力,在不增加计算负担下提升特征提取能力;2)区域注意机制与R-ELAN网络优化特征聚合,显著改善小目标检测(AP_S提升8.3%);3)动态多光谱数据增强策略增强模型鲁棒性。实验表明,YOLOv12在COCO等基准上实现SOTA性能,同时保持2.1 TOPS/W的高能效比,适用于边缘设备部署。该工作为实时目标检测提供了新的注

一碗白开水一 1807

python中yield的用法详解——最简单,最清晰的解释

python-迭代器与生成器-笔记1前言一、什么是迭代器与生成器?1.可迭代对象2.可迭代对象有哪些?3.迭代器二、什么是列表推导式?1.列表推导式;2.yield关键 -->生成器函数使用生成器实现斐波拉契数列手动关闭当前生成器,关闭之后不能再继续生成值*3.小案例:总结 前言 提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 一、什么是迭代器与生成器? 1.可迭代对象 实现了__iter__方法,并且该方法返回一个迭代器 这样子的对象就是一个可迭代..

qq_45737042的博客 1万+

3、保险行业商业智能解决方案的理解与实施

本文详细探讨了商业智能(BI)在保险行业的应用与实施策略,涵盖了从BI环境开发的关键步骤、自下而上与自上而下的数据仓库开发方法,到决策支持工具的选择与使用。文章还分析了BI系统与互联网、内联网和外联网的结合方式,并讨论了购买与自建方案的优劣比较,最后总结了商业智能成功的关键因素及其对保险行业带来的商业价值。通过实际案例与未来趋势展望,展示了商业智能如何推动保险企业的数字化转型和竞争力提升。

moon9的博客 97

Python yield的用法

yield yield当用在函数中时,将函数变为一个generator function。意思是,如果def的函数内存在yield 则函数被调用时,是不进行执行的,除非使用next yield 可以被用作表达式(Expression)。作用是将其返回的至赋值给某个变量。 yield 被用在函数中def h(): print("你好") yield 5 print("再见")当

细心程度决定你的成败 2981

手势识别器:实现手部动作识别器

在本篇文章中,我们将使用Python来实现一个简单的手部动作识别器。然后,我们通过循环从摄像头获取每一帧图像,并对每一帧图像进行处理。我们提取手部关键点并计算手势的特征向量,然后将其添加到特征列表和标签列表中。接下来,我们再次从摄像头获取每一帧图像,并进行手势识别。我们提取手部关键点并计算手势的特征向量,然后使用训练好的分类器来预测手势,并在图像上显示出来。在这个实现中,我们将使用MediaPipe库来检测和跟踪手部关键点,然后使用K最近邻(K-Nearest Neighbors)算法对手势进行分类。

BitSlinger的博客 238

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

python中yield的用法(生成器的讲解)

0 理解说明 功能1:把yield看做return。就是在程序中yield处返回某个值,返回之后程序就不再往下运行了。他们都在函数中使用,并履行着返回某种结果的职责。 功能2:同时还是一个生成器generator,有return的普通函数直接返回所有结果,程序终止不再运行,并销毁局部变量;而有yield的函数则返回一个可迭代的生成器generator对象,你可以使用for循环或者调用next()方法,send()方法遍历生成器对象来提取结果。 1 举2个例子说明yield生成迭代器: python生成器

呆呆象呆呆的博客 2万+

YOLO环境配置+项目启动全流程(Conda+PyCharm超详解)

YOLO(You Only Look Once)是一个基于深度学习的目标检测算法,广泛应用于智能识别领域。本篇保姆级教学将手把手教你如何从零开始运行一个YOLO项目,适合完全没有基础的新手。

一键难忘的博客 1539

Python中yield使用方法

Python中yield使用方法,最简单的解释 yield可以理解为一个return操作,但是和return又有很大的区别,执行完return,当前函数就终止了,函数内部的所有数据,所占的内存空间,全部都没有了。而yield在返回数据的同时,还保存了当前的执行内容,当你再一次调用这个函数时,他会找到你在此函数中的yield关键字,然后从yield的下一句开始执行。下边上代码。 对于yield,最简单的验证程序可以写成这样 def num_print(): print('yield_1') y

qq_35699473的博客 6733

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python yield 使用浅析

如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。用计算机程序输出斐波那契數列的前 N 个数是一个非常简单的问题,许多初学者都可以轻易写出如下函数: 清单 1. 简单输出斐波那契數列前 N 个数 def fab(max): n, a, b = 0, 0, 1 while n

上帝之手 3万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python-yield使用

yield 是 Python 的一个关键字,用于从一个函数中返回一个生成器(generator)。生成器是一种特殊类型的迭代器,它允许你延迟计算结果,这在处理大数据或者创建复杂数据结构时特别有用,因为你不需要一次性将所有的数据都存储在内存中。一个使用 yield 的函数会被称为生成器函数。这种函数并不直接返回一个值,而是生成一系列的值。每次调用这个生成器函数,它会从上次离开的地方继续执行,并且可以产生许多结果,而不是单个值。

sunxunyong的博客 3145

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Python中yield的使用

1.这个东西 在Python中一个yield,关于

lkq535588的博客 2929

Python yield使用

Python yield使用 To understand what yield does, you must understand what generators are. And before you can understand generators, you must understand iterables. 套 娃 理 解 想要理解yield的用法,首先要理解generators,想理解generators就先要理解iterables 防止接下来会晕,先来理解一下这三个单词: 可迭代对象(Ite

Logan 6134

python yield 与 yield from

1、yield使用 1)函数中使用yield,可以使函数变成生成器。一个函数如果是生产一个数组,怎么必须把数据存储在内存中,如果使用生成器,则在调用的时候才生成数据,可以节省内存。 2)生成器方法调用时,不会立即执行。需要调用next()或者使用for循环来执行。使用for循环不需要自己捕获StopIteration异常。使用next()方法,当生产器方法执行结束会抛出StopIteration

一切皆有联系 1万+

python之yield

阅读别人的python源码时碰到了这个yield这个关键字,各种搜索终于搞懂了,在此做一下总结: 通常的for...in...循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 它的缺陷是所有数...

江州司马 1750

python yield函数_python之yield函数

python之yield函数

weixin_39712016的博客 2685

Python中yield详解与使用

【传统for循环】 Python的for循环中,in后面通常跟一个数组,这个数组是一个可迭代的对象,类似的还有链表,字符串,文件。可以是 list = [1, 2, 3] 也可以是 list = [x*x for x in range(3)] 缺点:内存中会加载很多数据,如果数据很大就会非常消耗内存。 【带yield的函数(生成器)】 带有yield的函数在Python中被称之为generat...

Ding_0110M的博客 1697

python yield是什么意思_python yield有什么用

yield是一个常用于python函数定义中的关键字,它的作用是返回一个可以用来迭代(for循环)的生成器,它的应用场景通常为一个需要返回一系列值的,含有循环的函数中。如果想要彻底搞懂yield关键词的用法,你务必先要搞懂如下词的意思:迭代,可迭代,迭代器,生成器。接下来我将逐一介绍这些词的含义,以及相应的用法。迭代(iteration)和可迭代(iterable)迭代是一种操作。很多数据本身就是...

weixin_32148861的博客 3345

python中yield的使用_Python中的yield使用

yield是python的一个关键字,刚接触python的时候对这个关键字一知半解,掌握之后才发现这关键字有大用,本文将对yield的使用方法好好梳理一番。1 使用yield创建生成器在python中,生成器是一种可迭代对象,但可迭代对象不一定是生成器。 例如,list就是一个可迭代对象>>> a = list(range(3))>>> for i in a:p...

weixin_39970994的博客 471
上一篇: [Android] - 如何写Instrumentation UT Manifest.xml
下一篇: [oj.leetcode] #179 - LargestNumber, 如何在7ms内跑完 221个测试用例
teaspring
博客等级 码龄19年 350粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值