Python进阶内容--迭代器和生成器

什么是迭代器

在 Python 中,迭代器(Iterator)是一个访问集合元素的对象,它能够实现遍历集合的所有元素,而无需了解集合底层结构和细节。Python 中所有可迭代的对象(如 列表、元组、字符串、字典、集合等)都可以通过内置函数 iter() 获取对应的迭代器,然后使用内置函数 next() 逐个获取元素。当集合中的所有元素被遍历完成后,再次使用 next() 函数会抛出 StopIteration 异常。

什么是可迭代对象

在 Python 中,可迭代对象(Iterable)是指可以被迭代的对象,也就是包含多个元素并且支持使用 for 循环语句进行遍历的对象。Python 中许多内置的数据类型都属于可迭代对象,包括列表、元组、字符串、字典、集合等。

我们可以使用isinstance()方法和collections.abc中的Iterable类型来检查一个东西是否为可迭代对象。
例:

from collections.abc import Iterable
a = {1:"1",2:[1,2,3]}
print(isinstance(a,Iterable))
True

返回值为True

python内置类型中自带的迭代器

python中有很多内置类型就是可迭代对象,可迭代对象就说明这个东西可以通过iter()方法变为迭代器,举一个列表的例子。

a = [1,2,3]

a这个列表就是一个可迭代对象,我们先通过instance()方法检查这个列表是否为可迭代对象。

print(isinstance(a,Iterable))
True
for i in a:
	print(i)

在这里插入图片描述
这里其实就用到了可迭代对象的特性

注意:python在进行for 语句遍历循环的时候,会隐式的把需要遍历的对象转换成迭代器,并不断调用迭代器中的__next__()魔法函数,把迭代器中的对象一个一个的返回出来。

自定义可迭代器

class Iterable(object):
    def __init__(self):
        pass
    
    def __iter__(self):
        return self
    
    def __next__(self):
        pass
    
if __name__ == '__main__':
    i = Iterable()
        

这个是自定义迭代器的一个基本模板,除了初始化方法__init__()之外还有__iter__、next__两个魔法方法,这两个方法前者负责返回自身,所以它的返回值必须是self,而__next()方法负责迭代器主要的业务逻辑,需要根据不同的情况编写。

这里举一个经典的斐波那契额数列的例子:

class Fib:
    def __init__(self):
        self.prev,self.cur = 0,1

    def __iter__(self):
        return self

    def __next__(self):
        self.cur,self.prev = self.cur + self.prev,self.cur
        return self.cur


def fib():
    cur,prev = 1,0
    while 1:
        yield cur
        cur,prev = cur + prev,prev

if __name__ == '__main__':
    fib = Fib()
    for i in range(10):
        print(next(fib))

这段代码中的带yield的fib()函数是生成器函数

什么是生成器

生成器(Generator)是一种特殊的迭代器,它使用 yield 语句来产生值。与普通的迭代器相比,生成器更加简洁、高效,能够在遍历元素的同时动态生成新的元素,而不会像列表解析那样一次性占用大量内存空间。

def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4

for item in my_generator():
    print(item) # 依次输出 1, 2, 3, 4

控制台会依次输出 1, 2, 3, 4

在这里插入图片描述

构建生成器的两种方式

上述代码是构建生成器的两种方式之一,也就是用函数来构建。

  • 生成器函数
    函数用yield返回值,这种函数叫生成器函数。函数被调用时会返回一个生成器对象。
def my_generator():
    yield 1
    yield 2
    yield 3
    yield 4

# for item in my_generator():
#     print(item) # 依次输出 1, 2, 3, 4
print(my_generator())
<generator object my_generator at 0x0000018F46583C10>

当打印这个执行函数时,控制台会返回这个信息,这个信息说明该函数返回的是一个generator (也就是生成器)对象。

生成器对象可以在当他被遍历的时候,自动调用__iter__()方法和__next__()方法,而且生成器是用一种懒加载的模式生成值,所以不需要担心生成器生成的值会一次性写入内存中,它会一个一个的写入内存。

  • 生成器表达式
g = (i for i in range(5))

用类似这样的表达式就能生成一个生成器,现在g就是一个迭代器,同时也是生成器。

from collections.abc import Iterable 
g = (i for i in range(5))
print(isinstance(g,Iterable))  # 返回值为True
print(iter(g))  # <generator object <genexpr> at 0x00000125451E3C10>

注意:生成器也可以是一个可迭代对象,因此我们可以遍历它:

for i in g:
    print(i)

在这里插入图片描述

yield与return的区别

  • 包含 return 的方法会以 return 关键字为最终返回,每次执行都返回相同的结果
  • 而包含yield方法的生成器每次执行时遇到 yield 就返回 yield 后的结果,但内部会保留上次执行的状态,下次继续迭代时,会继续执行 yield 之后的代码,直到再次遇到 yield 后返回

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcodeTmp

文章目录 39. 组合总和33. 搜索旋转排序数组153. 寻找旋转排序数组中的最小值49. 字母异位词分组53. 最大子数组和55. 跳跃游戏56. 合并区间62. 不同路径 39. 组合总和 39. 组合总和 DFS排列&#xff1a;每个元素可选0次&#xff0c;1次以及多次 public List<List<Int…

元宇宙:虚拟仿真技术的全面提升

在当今数字化的世界中&#xff0c;我们经常听到虚拟现实、增强现实、混合现实等技术的名词&#xff0c;这些技术的应用越来越成熟。其中&#xff0c;虚拟仿真技术是一种通过计算机技术来模拟实际场景和对象的过程&#xff0c;它为我们提供了更多的可能性。而最近备受瞩目的元宇…

加密的本质:数学的不对称性

文章目录 引言I 预备知识1.1 加密和授权1.2 非对称的特性II 椭圆曲线加密的方法2.1 椭圆曲线2.2 椭圆曲线的性质引言 不对称有时却自有其妙处与美感,比如黄金分割就是不对称的。 可以通过加密和授权,兼顾保护信息不外泄,而且某些得到授权的人还能使用信息。 I 预备知识 …

亚马逊云科技为全球的可持续发展进程做出贡献

可持续发展是一个涉及经济、环境和社会三个方面的复杂问题。经济发展必须在保护环境和社会公正的前提下进行&#xff0c;这样才能实现真正的可持续发展。为了实现这一目标&#xff0c;人们需要借助技术手段&#xff0c;更好地理解和解决环境和社会问题。 亚马逊云科技是全球领…

(大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

索引 完全分布式模式守护进程布局集群搭建准备总纲配置文件格式化集群启动集群 集群控制命令集群启停进程查看启动日志查看集群常见问题 案例演示&#xff1a;WordCount 完全分布式模式 分布式文件系统中&#xff0c;HDFS相关的守护进程也分布在不同的机器上&#xff0c;如&am…

tp5实现导入excel表到数据库

hello&#xff0c;大家好&#xff0c;好长时间没有更新文章了。最近一直在忙着做项目。所以断更了。 那么好&#xff0c;各位老铁是否想要实现导入导出的功能 请关注我&#xff0c;解密如何实现导入导出&#xff0c; 那么今天先来讲一下用thinkphp5.0 如何实现Excel表格导入数据…

js 事件流程

描述 JavaScript 的执行是单线程的&#xff0c;后面的任务需要等待前面的任务完全完成后&#xff0c;再去执行。DOM 事件&#xff08;文件的加载等&#xff09;、定时器、网络请求等事件&#xff0c;并不会消耗 CPU&#xff0c;这些事件无需等候&#xff0c;所以出现了异步。主…

【Unity VR开发】结合VRTK4.0:创建一个按钮(Option Button)

语录&#xff1a; 如同天上降魔主&#xff0c;真是人间太岁神。 前言&#xff1a; 选项按钮是一种提供多项选择选项的方法&#xff0c;其中只有一个按钮可以处于激活状态&#xff0c;激活另一个按钮时将确保组中的所有其他按钮都已停用。我们可以使用嵌套在预制件中的预制件来实…

C++命名空间域namespace与域作用限制符: :,cin,cout输入输出简单介绍

TIPS C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等C总计63个关键字&#xff0c;C语言32个关键字&#xff0c;具体没有必要先不去管它 域&#xff0c;命名空间域与namespace关键字 cpp需要解决的第一…

数据库中的视图及三级模式结构

文章目录 一、视图二、数据库三级模式结构 一、视图 简单地说&#xff0c;视图可以看成是一个窗口&#xff0c;它所反映的是一个表或若干表的局部数据&#xff0c;可以简化查询语句。视图一经定义&#xff0c;用户就可以把它当作表一样来查询数据。 但视图和基本表不同&#…

400以内的蓝牙耳机哪款好?400以内蓝牙耳机排行榜

谈起TWS&#xff0c;无论是传统的音频厂商还是手机厂商&#xff0c;都是其不可或缺的重要产品线&#xff0c;现在很多许多蓝牙耳机都不是千篇一律得形状&#xff0c;市场也鲜有商家在外观上下功夫&#xff0c;下面分享几款400元以内&#xff0c;内外兼具的耳机品牌。 一、南卡…

Pytorch实现图像风格迁移(一)

图像风格迁移是图像纹理迁移研究的进一步拓展&#xff0c;可以理解为针对一张风格图像和一张内容图像&#xff0c;通过将风格图像的风格添加到内容图像上&#xff0c;从而对内容图像进行进一步创作&#xff0c;获得具有不同风格的目标图像。基于深度学习网络的图像风格迁移主要…

LeetCode热题HOT100:76. 最小覆盖子串,84.柱状图中最大的矩形、96. 不同的二叉搜索树

LeetCode 热题 HOT 100 76. 最小覆盖子串 题目&#xff1a;给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字…

ADManager Plus:简化 Active Directory 管理的完美工具

在企业中&#xff0c;Active Directory&#xff08;AD&#xff09;是一个非常重要的组件&#xff0c;用于管理和控制所有计算机和用户的访问权限。然而&#xff0c;AD的管理和维护需要一定的技术能力和时间成本。为了简化这个过程&#xff0c;ManageEngine 推出了 ADManager Pl…

Leetcode-二叉树

1.中序-后序构建二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 1. 首先根据后序&#xff08;左右中&#xff09;确定顶点元素&#xff1b; 2. 根据顶点元素划分中序序列&#xff1b; 3. 根据划分中序序列中-左子树的长度&#xff0c;进…

数据类型及变量的定义、使用和注意事项

数据类型 计算机存储单元 变量的定义格式&#xff1a; 数据类型 变量名数据值; 我们知道计算机是可以用来存储数据的&#xff0c;但是无论是内存还是硬盘&#xff0c;计算机存储设备的最小信息单元叫“位( bit ) "&#xff0c;我们又称之为“比特位”&#xff0c;通常用…

除了Java,还可以培训学习哪些IT技术?

除了Java&#xff0c;还可以培训学习哪些IT技术&#xff1f; 转行IT学Java似乎已经成为很多人的首选&#xff0c;原因无非是开发技术含量高、开发有前景、开发是一个互联网企业的核心岗位&#xff0c;最重要的是开发薪资待遇高。但其实只单纯因为薪资选择Java的话&#xff0c;小…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

什么是机器学习?

目录 简介 机器学习可以做什么 机器学习未来的趋势 总结 简介 机器学习是一种人工智能领域中的技术&#xff0c;其主要目的是让计算机能够自动进行模式识别、数据分析和预测。 机器学习的起源可以追溯到20世纪50年代&#xff0c;当时美国的Arthur Samuel在一篇论文中提出了相关…

静态时序分析Static Timing Analysis4——多时钟域和多时钟时序检查

文章目录 前言一、多时钟域时序分析1、慢时钟域到快时钟域1.1 建立时间检查1.2 保持时间检查1.3 多周期检查 2、快时钟域到慢时钟域2.1 建立时间检查2.2 保持时间检查2.3 合理的约束 3、总结 二、多时钟1、整数倍关系2、非整数倍关系 三、相位移动 前言 2023.4.12 这里讲的多时…