迭代器与生成器

章节目录:

    • 一、迭代器
      • 1.1 相关概述
      • 1.2 基本使用
      • 1.3 自定义迭代器
    • 二、生成器
      • 2.1 相关概述
      • 2.2 基本使用
      • 2.3 三种应用场景
    • 三、yield 和 class 定义的迭代器对比
    • 四、结束语

一、迭代器

1.1 相关概述

  • 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退
  • 迭代器有两个基本的方法iter()next()

1.2 基本使用

  • 字符串,列表或元组对象都可用于创建迭代器
# iter():创建迭代器。
it = iter([1, 2, 3, 4])# next():访问迭代器的下一元素。
print(next(it))
# 1
print(next(it))
# 2# 也可以 for 循环遍历下一元素。
for e in it:print(f"e={e}")# e=3# e=4
  • 另一种遍历方式
import sys# iter():创建迭代器。
it = iter([1, 2, 3, 4])while True:try:print(next(it))# 1# 2# 3# 4except StopIteration:sys.exit()

1.3 自定义迭代器

  • 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__()__next__()

  • __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成

  • __next__() 方法会返回下一个迭代器对象。

  • 代码示例

class Sample:def __iter__(self):self.n = 0return selfdef __next__(self):# 初始值。x = self.nself.n += 1return xsample = Sample()
it = iter(sample)
# 迭代两次。
print(next(it))
# 0
print(next(it))
# 1
  • 通过 StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况:
class Sample:def __iter__(self):self.n = 0return selfdef __next__(self):# 限制迭代次数。if self.n < 3:x = self.nself.n += 1return xelse:raise StopIterationsample = Sample()
it = iter(sample)for e in it:print(e)# 0# 1# 2

二、生成器

2.1 相关概述

  • 在 Python 中,使用了 yield 的函数被称为生成器generator )。
  • yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
  • 当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。
  • 然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。
  • 调用一个生成器函数,返回的是一个迭代器对象。

2.2 基本使用

  • 代码示例
def countdown(n):while n > 0:# 关键字。yield nn -= 1# 创建生成器对象。
generator = countdown(5)# 通过迭代生成器获取值。
print(f"by generator {next(generator)}")
print(f"by generator {next(generator)}")
# by generator 5
# by generator 4# 使用 for 循环迭代生成器。
for value in generator:print(f"by for {value}")# by for 3# by for 2# by for 1
  • 示例说明
    • countdown() 函数是一个生成器函数yield 语句逐步产生从 n 到 1 的倒数数字。
    • 在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行。
    • 生成器函数的优势是它们可以按需生成值避免一次性生成大量数据并占用大量内存
    • 生成器还可以与其他迭代工具( 如 for 循环 )无缝配合使用,提供简洁和高效的迭代方式。

2.3 三种应用场景

  • 定义一个容器类的可迭代对象,为该对象实现 __iter__() 接口:
class MyData:@propertydef size(self):"""可以得到数据的大小。:return:"""return self.sizedef get_value(self, index):"""假设可以通过索引按顺序得到数据。:param index::return:"""return indexdef __iter__(self):"""可迭代对象。:return:"""# index 为局部变量。index = -1# 设定完成的条件。while index < 2:index += 1yield self.get_value(index)if __name__ == '__main__':# 这里的 mydata 是可迭代对象而非迭代器。mydata = MyData()
  • 定义一个处理其它可迭代对象的迭代器
COLOR_LIST = ["red", "blue", "green"]def my_color_generate(colors):for color in colors:# 如果是红蓝绿就跳过。if color in COLOR_LIST:continue# 粉色则生成两次。elif "pink" == color:yield color * 2# 其余颜色生成一次。else:yield colorcolors = ["blue", "yellow", "pink"]
for c in my_color_generate(colors):print(c)# yellow# pinkpink
  • 定义一个不依赖数据存储的数据生成器:参考本章节 - < 2.2 基本使用的代码示例>

三、yield 和 class 定义的迭代器对比

动作class 实现的迭代器yield 生成器
定义迭代器class Iterator:
def __init__(self, *args):
def iter_fun(*args):
构建迭代器Iterator(args)iter_fun(args)
next(iterator)def __next__(self): return valueyield value
StopIterationraise StopIterationreturn
iter(iterator)def __iter__(self): return self自动实现

四、结束语


“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶

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

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

相关文章

Selenium自动化测试框架

一.Selenium概述 1.1 什么是框架? 框架&#xff08;framework&#xff09;是一个框子——指其约束性&#xff0c;也是一个架子——指其支撑性。是一个基本概念上的 结构用于去解决或者处理复杂的问题。 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及…

【Machine Learning in R - Next Generation • mlr3】

本篇主要介绍mlr3包的基本使用。 一个简单的机器学习流程在mlr3中可被分解为以下几个部分&#xff1a; 创建任务 比如回归、分裂、生存分析、降维、密度任务等等挑选学习器&#xff08;算法/模型&#xff09; 比如随机森林、决策树、SVM、KNN等等训练和预测 创建任务 本次示…

如何使用Java实现权限认证和登录jwt

这边可以关注我的博客 权限认证 轻松实现权限认证 登录拦截 轻松实现登录拦截 这样就可以了

C语言每日一题(32)环形链表

力扣网 141.环形链表 题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

LLM大模型4位量化实战【GPTQ】

权重量化方面的最新进展使我们能够在消费类硬件上运行大量大型语言模型&#xff0c;例如 RTX 3090 GPU 上的 LLaMA-30B 模型。 这要归功于性能下降最小的新型 4 位量化技术&#xff0c;例如 GPTQ、GGML 和 NF4。 在上一篇文章中&#xff0c;我们介绍了简单的 8 位量化技术和出…

GZ038 物联网应用开发赛题第10套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 &#xff08;第10套卷&#xff09; 工位号&#xff1a;______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具&#xff0c;操作安全规范&#xff1b; 2、竞赛过程中如有异议&#xff0c;可向现场考…

Spring学习③__Bean管理

目录 IOC接口ApplicationContext 详解IOC操作Bean管理基于xml方式基于xml方式创建对象基于xml方式注入属性使用set方法进行注入通过有参数的构造进行注入p 名称空间注入&#xff08;了解&#xff09; 基于xml方式注入其他类型属性xml 注入数组类型属性 IOC接口 IOC思想基于IOC…

Linux 无名管道实现文件复制

无名管道 通过一个管道&#xff08;假象&#xff09;进行传输数据&#xff0c;但是这个管道的传输方式是单工&#xff08;半双工&#xff09;的&#xff0c;就是这个管道允许进行发送和接受数据&#xff0c;不过不能同时进行。 创建无名管道 这里用到一个pipe&#xff08;&…

代码随想录算法训练营第三十九天【动态规划part02】 | 62.不同路径、63. 不同路径 II

62.不同路径 题目链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路&#xff1a; 动规五部曲 确定dp数组及其下标含义&#xff1a;dp[i][j] 表示从&#xff08;0,0&#xff09;出发&#xff0c;到&#xff08;i,j&#x…

Ubuntu16.04系统在Docker容器搭建 Gitlab 服务器

Ubuntu16.04系统在Docker容器搭建 Gitlab 服务器 从Docker Hub下载最新版本的GitLab CE镜像到您的本地Docker环境中,根据您的网络连接速度和镜像大小,这个过程可能需要一些时间。当拉取完成后,您就可以使用该镜像来运行GitLab容器了 docker pull gitlab/gitlab-ce:latest如果…

性能测试【第三篇】Jmeter的使用

线程数:10 ,设置10个并发 Ramp-Up时间(秒):所有线程在多少时间内启动,如果设置5,那么每秒启动2个线程 循环次数:请求的重复次数,如果勾选"永远"将一直发送请求 持续时间时间:设置场景运行的时间 启动延迟:设置场景延迟启动时间 响应断言 响应断言模式匹配规则 包括…

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

无线WiFi安全渗透与攻防(五) mdk4安装(kali linux)以及更新kali源

无线WiFi安全渗透与攻防(五) mdk4安装(kali linux) 一. 2021最新版kali-2021-4a 更新源Kali 系统换源1.使用leafpad编辑器打开系统源文本(也可用vim)2.填写源文本(源文本无硬性要求,这里我用的是阿里的)3.使用更新源命令进行更新源4. 下载mdk4二. WIFI泛洪攻击-基于MDK4…

​软考-高级-系统架构设计师教程(清华第2版)【第7章 系统架构设计基础知识(263~285)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第7章 系统架构设计基础知识&#xff08;263~285&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

【完整详细】IntelliJ IDEA中使用Docker插件一键部署前后端分离项目

前言:在使用Docker部署我们的前后端分离项目的时候,会涉及到一堆且重复的Docker命令,久而久之就会被这些重复性的操作感到繁琐,本篇博客教学大家如何通过IDEA自带的一款插件就可以实现一键部署前后端分离项目的操作,从头到尾我写的非常详细,大家逐步阅读即可。 博主的其他…

LeetCode(18)整数转罗马数字【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 12. 整数转罗马数字 1.题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X …

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列4

文章目录 原型网络进行分类的基本流程一、原始代码---计算欧氏距离&#xff0c;设计原型网络&#xff08;计算原型开始训练&#xff09;二、每一行代码的详细解释总结 原型网络进行分类的基本流程 利用原型网络进行分类&#xff0c;基本流程如下&#xff1a; 1.对于每一个样本…

C++中noncopyable不可拷贝类的使用

背景&#xff1a;项目中需要某个类不能被拷贝构造和赋值构造&#xff0c;下面举例说明该场景&#xff1a; 什么时候需要不可拷贝类 考虑一种情况&#xff0c;我们要实现一个含有动态数组成员的类&#xff0c;其中动态数组成员在构造函数中 new 出来&#xff0c;在析构函数中 …

Confluence 快速安装教程

安装jdk yum install -y java-1.8.0-openjdk.x86_64 java -version 安装MySQL mkdir -p /data/mysql/data chmod 777 /data/mysql/datadocker rm -f mysql docker run -d --name mysql \-p 3306:3306 \-e MYSQL_ROOT_PASSWORDfingard1 \-v /data/mysql/data:/var/lib/mysql …