Python入门——yield生成器和iter迭代器

yield生成器

yield 的作用

  • 生成器函数yield 将一个普通的函数变成一个生成器函数。生成器函数与普通函数的区别在于,普通函数使用 return 一次性返回结果并终止,而生成器函数使用 yield 返回一个值后,会记住函数的执行状态,暂停执行,待下一次被调用时继续执行。
  • 惰性计算:生成器不会一次性生成所有结果,而是按需生成。这种方式称为“惰性计算”(lazy evaluation),非常节省内存,尤其适用于处理大数据或流式数据的场景。

yield 的工作原理

当生成器函数包含 yield 时,每次调用生成器对象的 next() 方法时,生成器会执行到 yield 语句,返回当前值并暂停。下一次调用 next() 时,生成器从上次暂停的位置继续执行,直到遇到下一个 yield 或函数结束。

基本用法

当一个函数包含 yield 关键字时,该函数不再是普通的函数,而是一个生成器函数。调用生成器函数时,它不会立即执行,而是返回一个生成器对象,允许你通过迭代的方式来逐步获取值。

示例:

def simple_generator():print("First value:")yield 1  # 第一次暂停并返回值1print("Second value:")yield 2  # 第二次暂停并返回值2print("Third value:")yield 3  # 第三次暂停并返回值3# 调用生成器函数,返回一个生成器对象
gen = simple_generator()# 通过 next() 获取生成器中的值
print(next(gen))  # 输出: First value: 1
print(next(gen))  # 输出: Second value: 2
print(next(gen))  # 输出: Third value: 3

yieldreturn 的区别:

  • return:函数遇到 return 后,直接返回值,并终止函数的执行。
  • yield:函数遇到 yield 后,会返回一个值给调用者,同时函数的状态会被“冻结”,即函数在 yield 处暂停,等待下一次调用时继续执行,而不是从头开始。

使用场景:

  1. 惰性求值:当处理大量数据时,生成器可以惰性计算,不必一次性将所有数据加载到内存中。
  2. 流式处理:当数据源的数据量过大,或数据是实时产生的(如读取文件、网络流等),生成器可用来逐步产生数据。
  3. 协程:在 Python 中,yield 也被用于协程中来实现异步操作。

示例:生成一个范围内的数字

def number_generator(n):for i in range(n):yield igen = number_generator(5)for number in gen:print(number)

优点

  1. 节省内存:相比一次性加载所有数据,生成器通过 yield 逐步生成数据,避免了占用大量内存。
  2. 效率高:适合处理大量数据或流式数据的场景,且生成器函数编写简单明了。
  3. 易于实现复杂的迭代逻辑:生成器允许在多次调用之间保存函数的执行状态,使其能够简洁地实现复杂的迭代逻辑。

总结

  • yield 关键字让你可以创建生成器函数,用于逐步生成值,而不是一次性生成所有值。
  • 生成器可以用于高效处理大量数据或实现惰性求值。

iter迭代器

在 Python 中,迭代器(Iterator)是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完毕后结束。迭代器只能往前走,不能回退。

迭代器的核心概念

迭代器协议: 任何实现了 __iter__()和 __next__()方法的对象都是迭代器。__iter__(): 返回迭代器对象本身。
__next__(): 返回容器的下一个元素,直到没有元素时抛出 `StopIteration` 异常。

示例:

# 自定义一个简单的迭代器
class MyIterator:def __init__(self, data):self.data = dataself.index = 0  # 用来记录当前访问的位置def __iter__(self):return self  # 迭代器的 __iter__ 方法返回自身def __next__(self):if self.index < len(self.data):value = self.data[self.index]self.index += 1return valueelse:raise StopIteration  # 当没有更多元素时,抛出 StopIteration 异常# 使用该迭代器
my_list = [1, 2, 3, 4]
my_iter = MyIterator(my_list)for item in my_iter:print(item)		# 结果 1'\n' 2.. 3.. 4..
"""
解释:
这个 MyIterator 类实现了 __iter__() 和 __next__() 方法,因此它是一个迭代器。
在 for 循环中,Python 自动调用 __iter__() 方法来获取迭代器对象,并在每次循环时调用 __next__() 来获取下一个元素。
当所有元素都遍历完后,__next__() 方法抛出 StopIteration,循环就会结束。
"""

内置迭代器

Python 的许多内置数据类型都是可迭代的,比如列表、元组、字符串、字典和集合等。你可以通过 iter() 函数将这些对象转换为迭代器。

my_list = [1, 2, 3, 4]
my_iter = iter(my_list)print(next(my_iter))  # 输出: 1
print(next(my_iter))  # 输出: 2
print(next(my_iter))  # 输出: 3
print(next(my_iter))  # 输出: 4
print(next(my_iter))  # 抛出 StopIteration 异常
# Traceback (most recent call last):File "<stdin>", line 1, in <module>
StopIteration

迭代器与可迭代对象的区别

  • 可迭代对象(Iterable):实现了 __iter__() 方法,返回一个迭代器对象的对象。如列表、元组、字典、集合等。
  • 迭代器(Iterator):实现了 __iter__()__next__() 方法的对象。

可迭代对象可以通过 iter() 函数得到一个迭代器,迭代器可以用 next() 函数不断获取元素直到抛出 StopIteration 异常。

迭代器的应用场景

迭代器适用于遍历数据,不要求将所有数据一次性加载到内存中,特别适合处理大量数据或流数据。

文件读取示例

with open('test.txt', 'r') as file:for line in file:  # 文件对象是一个迭代器,每次读取一行print(line.strip())

总结

  • 迭代器是一种可以记住访问位置的对象,遵循迭代器协议(__iter__()__next__() 方法)。
  • 迭代器可以高效地处理数据流,避免将整个数据集一次性加载到内存中。
  • 许多内置对象都是可迭代的,并且可以通过 iter() 转换为迭代器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

铜业机器人剥片 - SNK施努卡

SNK施努卡有色行业电解车间铜业机器人剥片 铜业机器人剥片技术是针对传统人工剥片效率低下、工作环境恶劣及生产质量不稳定的痛点而发展起来的自动化解决方案。 面临人工剥片的诸多挑战&#xff0c;包括低效率、工作环境差、人员流动大以及产品质量控制不精确等问题。 人工剥片…

电机学习-空间矢量合成

一、标量转换理论 设三相标量为 x a , x b , x c x_a,x_b,x_c xa​,xb​,xc​,且满足 x a x b x c 0 x_ax_bx_c 0 xa​xb​xc​0&#xff0c;则有变换&#xff1a; X o u t x a a x b a 2 x c &#xff0c; 其中 a e j 2 3 π , a 2 e − j 2 3 π X_{out}x_aax_ba^2…

深度学习调参大法

目录 trick 1&#xff1a;深度学习调参核心点trick 2&#xff1a;关于 深度学习Model选型问题trick 3&#xff1a;关于数据trick 4&#xff1a;关于调参 4.1 关于 Loss function 调参策略4.2 关于 Learning rate 和 batch size 调参策略4.3 关于 Epoch number 和 early stoppi…

华为ensp静态路由,浮动路由,缺省路由讲解及配置

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年10月24日0点15分 祝大家程序员节快乐~ 路由的选择与管理至关重要。静态路由…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup&#xff08;bs4&#xff09;解析复杂 HTML&#xff1a;详解与示例 在 Web 开发和数据分析中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML&#xff0c;其中最受欢迎的就…

ElasticSearch备考 -- index rollover

一、题目 给索引my-index-000001&#xff0c;创建别名my-index&#xff0c;并设置rollover&#xff0c;满足以下三个条件的 The index was created 7 or more days ago.The index contains 5 or more documents.The index’s largest primary shard is 1GB or larger. 二、思考…

nodejs包管理器pnpm

简介 通常在nodejs项目中我们使用npm或者yarn做为默认的包管理器&#xff0c;但是pnpm的出现让我们的包管理器有了更多的选择&#xff0c;pnpm相比npm具有以下优势&#xff1a; 速度更快&#xff0c;pnpm在安装依赖时&#xff0c;会将依赖包缓存到全局目录&#xff0c;下次安…

vue3当中vscode给ref定义的变量使用时自动加上.value

vue3当中vscode给ref定义的变量使用时自动加上.value 1.在扩展中找到vue-office进行安装 2.安装完成后点击设置找到“dot value”勾起即可

Flutter 状态管理框架Get

状态管理框架 Get的使用 目录 状态管理框架 Get的使用 GetMaterialApp 路由的注册 路由的跳转 middlewares的使用 组件使用 defaultDialog bottomSheet snackbar 状态刷新有很多种方式 ValueBuilder Obx 基础使用 是时候引入GetxController, 也是Get里面的常用的 G…

香港国际金融市场的多元化投资策略与风险管理

香港国际金融市场长期以来以其开放性和稳健性闻名&#xff0c;吸引了全球众多投资者。随着全球经济日益互联&#xff0c;投资者在香港市场可以获得多样化的资产选择&#xff0c;包括股票、债券、基金、外汇等多元化金融产品。本文将探讨香港国际金融市场的投资策略和风险管理措…

远程IO控制器ZLAN6808-3 使用JSON定时下发执行DO通断

一.使用场景 对于数据采集控制点是按照线性分布的场景&#xff0c;比如智慧园区的路灯、桥梁、路灯、数字化工厂、停车场车位监测、智慧停车场、智能停车架、楼宇自动控制系统等场景&#xff0c;采用以太网/4G远程I0模块要比采用PLC节省更多的成本。远程IO控制器在很多场景中作…

【无人机设计与控制】基于Astar算法无人机路径规划,优化路径平滑

摘要 本文提出了一种基于A算法的无人机路径规划方法&#xff0c;并通过路径平滑优化提升路径的可行性和安全性。传统A算法在生成路径时&#xff0c;常因路径节点分布不规则导致路径不平滑&#xff0c;影响无人机的飞行效率和安全性。本文通过引入贝塞尔曲线对A*算法生成的路径…

【自动化测试之oracle数据库】MacOs如何安装oracle- client

操作系统为Mac OS&#xff0c;本地在pycharm上跑自动化脚本时&#xff0c;因为有操作oracle数据库的部分&#xff0c;所以需要安装oracle数据库的客户端&#xff0c;并install cx_oracle,本文主要介绍如何在macOS上完成安装&#xff0c;并在python自动化测试代码中配置&#xf…

WPF入门_06资源和样式

目录 1、资源基础介绍 2、静态资源和动态资源区别 3、资源字典 4、共享资源的方法 5、在Custom Control Library中定义和使用共享资源 6、样式 7、样式触发器 1、资源基础介绍 尽管每个元素都提供了Resources属性,但通常在窗口级别上定义资源,如下定义一个字符串资源…

哥德巴赫猜想渐行渐远

我现在的工作&#xff0c;表明经典分析可能出了问题&#xff0c;如此则连Vinogradov的三素数定理都不成立了&#xff0c;更别说基于L-函数方程的陈氏定理“12”了。事实上即使L-函数方程成立&#xff0c;由于我指出Siegel定理不成立&#xff0c;陈景润和张益唐的工作就不成立。…

使用Python和Matplotlib模拟3D海浪动画

使用Python和Matplotlib模拟3D海浪动画 在计算机图形学和动画领域&#xff0c;模拟逼真的海洋表面一直是一个具有挑战性的问题。本文将介绍如何使用Python的Matplotlib库和Gerstner波浪模型&#xff0c;创建一个动态的3D海浪动画。通过叠加多个波浪&#xff0c;我们可以生成复…

【iOS】YYModel初学习

前言 YYModel是一个OC的开源库&#xff0c;用于处理json数据和iOS应用中的数据的相互转换&#xff0c;在使用场景中非常的实用。 常用方法 // 字典转模型(nullable instancetype)yy_modelWithDictionary:(NSDictionary *)dictionary; // json转模型(nullable instancetype)y…

【Fargo】14: sockaddr_in 、 sockaddr 、sockaddr_storage 区别及转换

sockaddr_in 和 sockaddr struct recv_addr_; uv_ip4_addr(ip.c_str(), port, &recv_addr); 这里libuv用的是sockaddr_in ,mediasoup用的是sockaddr,二者有什么区别,可以直接转换么sockaddr 看起来更为通用 差异和特定的用途 在网络编程中,sockaddr_in 和 sockaddr 是…

HarmonyOS ArkTS与C++数据类型转换

1. HarmonyOS ArkTS与C数据类型转换 本文介绍了C与TS各自数据类型与互相之间的数据类型转换&#xff0c;在需要使用C模块时可以快速上手对各种数据类型进行转换。 1.1. 概述 HarmonyOS的主力开发语言是ArkTS&#xff0c;也提供了C语言的支持&#xff0c;对于一些能力&#xff…