Python比较难的知识点: 迭代器与生成器

news2025/1/18 19:07:05

迭代器与生成器是Python比较难的知识点, 在学Python之前, 我已经有了多年的C语言与MATLAB的使用经验了, 但是学这些知识点, 还是有一定的困难, 总觉得是一知半解的.

现在, 经过一段时间的学习和梳理, 感觉是搞懂了, 写下这篇文章与大家分享.

学习具体概念技术之前, 得知道这些知识点有什么用, 没有用的知识点不值得花费大力气去学习.

优点:

1 节省内存, 每次生成一个元素, 而不是先计算出所有的元素, 保存下来.

如果需要保存下来, 可以用个list(XXX)来实现

2 提速.

因为内存更小

3 各种花式循环, 节省代码长度.

首先, 要搞明白"Iterable"(可迭代的)这个概念.

"可迭代的"简单的来说, 是可以按顺序, 依次返回变量中的元素.

很显然, Python的各种容易是可迭代的, 字符串也是可迭代的, 因为可以依次去其中的字符.

做法为反例, 标量, 比如数字"1024", 不是可迭代的, 因为它只有一个元素.

可以通过下图的方法来检验变量是否是可迭代的:
在这里插入图片描述
上图中, 分别检验了各种容器, 字符串和标量数字是否是可迭代的, 结果符合预期.

iter: 生成迭代器(对象)

next: 作用于迭代器, 依次返回下一个元素

如果是自定义class, 可以通过函数__iter__, next, 定义这两种函数的行为.

iter只能用于可迭代的对象, 如下图, 标量数字"1024"就不能用来生成数字.
在这里插入图片描述
上图中, 试图将数字标量"1024"变成迭代器, 就会发生报错, 显示是"不可迭代的"

iter将可迭代的对象变成迭代器, 然后可以用next依次返回元素, 越界时, 会报错StopIteration, 类似于单向链表, 只能得到下一个元素, 不能返回上一个元素.
在这里插入图片描述
如上图所示, 通过iter, 将字符串"lihaitao"变成了一个迭代器, 然后通过next函数, 从左到右, 依次返回了单个字符, 最后会发现, 如果元素取完, 还要使用next函数的话, 就会报错.

为什么要这么做? 依次取出元素有什么好处?

1 节省内存, 每次生成一个元素, 而不是先计算出所有的元素, 保存下来.

2 提速. 因为内存更小

吐槽一下: 当然了, 因为这个例子特别简单, 好像无法体现出这些好处. 先记住, 以后接触到更复杂的例子, 就能体会到了.

生成器: 返回的对象是迭代器

生成器本质上定义了迭代器中元素的生成机制.

生成器分成了两种:

a 生成表达式

比如, (i * 2 for i in range(10))
在这里插入图片描述
上图的例子中, 通过for循环, 依次取得里面的元素.

好像没有什么特别的, 与列表生成器[i * 2 for i in range(10)] (注意一个是圆括号, 另一个是方括号)的结果好像是一样的.
在这里插入图片描述
结果是一样, 但是内部的原理差别很大.

(i * 2 for i in range(10))里面的原理是:

1 i 取值为0, 然后乘以2, 然后被for循环取出来, 打印.

2 i 取值为1, 然后乘以2, 然后被for循环取出来, 打印.

3 以此类推, 知道i取值为最后一个元素, 然后乘以2, 然后被for循环取出来, 打印.

[i * 2 for i in range(10)]里面的原理是:

先计算出所有的值: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

然后使用for循环, 依次取出这些值, 依次打印.

一句话概括的话, (i * 2 for i in range(10))是一边计算, 一边被取出, 而[i * 2 for i in range(10)]是先全部被计算出来, 然后被取出.

生成器的另一种形式:

b 生成函数

通过yield来返回下一个元素.

比如生成著名的斐波那契数列:

封面图片就是斐波那契数列的一个应用.

基于"生成函数", 生成斐波那契数列的代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
看起来和普通函数差不多, 没有了return, 多了个关键词yield.

yield与return不同, 碰到了return, 函数直接结束了, 只能返回"0".

而yield是决定了每次next后返回什么元素.

调用第一次next的时候, 程序运行, 直到第一次碰到yield, 此时a = 0, next的返回元素就是0, 然后会保存程序所有的当前状态,

下一次调用next的时候, 在上次保存的状态下继续运行, 直到又碰到了yield, 此时a = 1, 因此, 第二次next返回的元素是1

以此类推.

如果打个类比的话, yield的那一行可以作为断点, 碰到了断点, 程序就中断了, 直到下一个next, 就继续执行代码.直到碰到下一个断点(yield)

最后,作为一个IT的过来人,我自己整理了一些学习资料,希望对你们有帮助。

在学习python中有任何困难不懂的可以微信扫描下方CSDN官方认证二维码加入python交流学习
多多交流问题,互帮互助,这里有不错的学习教程和开发工具。

python兼职资源+python全套学习资料

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。

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

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

相关文章

c++ - 第17节 - AVL树和红黑树

1.AVL树 1.1.AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发…

Mybatis:MyBatis的逆向工程(10)

Mybaits笔记框架:https://blog.csdn.net/qq_43751200/article/details/128154837 Mybatis中文官方文档: https://mybatis.org/mybatis-3/zh/index.html Mybati的逆向工程1. 正向工程 VS 逆向工程2. 创建逆向工程的步骤(MyBatis3Simple清新简洁…

Go 1.20要来了,看看都有哪些变化-第1篇

前言 Go官方团队在2022.12.08发布了Go 1.20 rc1(release candidate)版本,Go 1.20的正式release版本预计会在2023年2月份发布。 让我们先睹为快,看看Go 1.20给我们带来了哪些变化。(文末有彩蛋!) 安装方法: $ go install golan…

[附源码]Nodejs计算机毕业设计基于web的火车订票管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

阅读器消退之际:文石造产品,掌阅塑生态

配图来自Canva可画 阅读器正在变得小众,似乎自Kindle以来营造的那种“阅读的生活方式”,已经被证明是一个伪命题:会阅读的人,无论如何都会去阅读;不会阅读的人,阅读器的归宿终究是一个“泡面盖”。于是&am…

Android原生项目接入flutter_boost4.0

折腾了好几天,经验思维导致的,记录一下踩坑。 官方接入步骤官方文档 接入原生,就3个步骤,我都能折腾好久,浪费时间。 flutter部分很简单,按文档配置就行,在pubspec.yaml依赖就好了。 &#…

Ceph性能瓶颈分析与优化(混合盘篇)

原文链接: Ceph性能瓶颈分析与优化(混合盘篇) - 知乎背景ssdhdd的混合盘场景在各个存储厂商中算是一种典型应用场景。 但是经过测试(4k随机写)发现,加了nvme ssd做ceph的wal和db后,性能提升仅一倍以内且nvme盘性能余量较大。所以希望通过对问题瓶颈进行…

目标检测数据标注案例-高清地图中障碍物(汽车)标注

计算机视觉在无人机中领域中有何作用? 无人机能够在空中识别、分类和追踪目标。无人机的摄像头和感应器可以捕获数据并进行分析,以提取重要信息。 AI可以自动提取视觉数据信息,准确识别、说明和追踪图像和视频中的目标。例如高空检测工作,…

Nacos 配置中心之长轮询--客户端

先来看下长轮询调用的链路 客户端 入口 在 NacosConfigService 初始化的时候,会初始化两个组件 一是网络组件,也就是http数据处理的 (起作用的是 ServerHttpAgent)二是客户端的长轮询ClientWorker public NacosConfigService(Properties properties) throws NacosException…

本地连接docker mysql

1.拉取镜像 docker pull mysql 2.启动mysql实例容器 docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORDmysql_pw -d mysql --name 为mysql的实例设置别名。 -p 3307为对外暴露的端口。3306是内部端口 -e MYSQL_ROOT_PASSWORD 设置mysql登录密码 -d 以守…

1.41.5 模型评估和选择,正则化和交叉验证

1.4&1.5 模型评估和选择,正则化和交叉验证模型评估和选择训练误差和测试误差过拟合正则化与交叉验证正则化交叉验证模型评估和选择 训练误差和测试误差 将预测系统的X作为输入,输入到模型里面,就可以得到预测结果。 学习到的模型&…

UNIX网络编程卷一 学习笔记 第五章 TCP客户/服务器程序示例

本章将编写一个完整的TCP客户/服务器程序,这个简单例子是执行以下步骤的一个回射服务器: 1.客户从标准输入读入一行文本,并写给服务器; 2.服务器从网络输入读入这行文本,并回射给客户; 3.客户从网络输入读入…

Spring Ioc 依赖来源-7

1. 依赖查找的来源:除容器内建和自定义Spring Bean之外,还有其他来源提供依赖查找吗? 查找来源 Spring 內建 BeanDefintion Spring 內建单例对象 当spring在注解环境下面, 这个 registerAnnotationConfigProcessors API会被调用, 它会被…

Xilinx Vivado的RTL分析(RTL analysis)、综合(synthesis)和实现(implementation)的区别?

1、一般流程 Xilinx 的开发工具Vivado其实还是比较好上手的,在左边的设计流程导航已经把FPGA的开发过程按先后顺序给排列出来了: Project Manager:项目管理器,此项是对项目的参数进行设置 IP Integrator:IP集成器&…

广域铭岛参编《数智化供应链参考架构》标准正式发布

近日,广域铭岛参编的《数智化供应链参考架构》标准正式发布。该标准由工业互联网产业联盟(以下简称“联盟/AII”)发布,是国内首个数智化供应链领域的参考架构标准,明确了新兴的数字化和智能化技术如何在供应链领域应用…

大数据进程管理

进程管理 查看进程 进程查看命令 ps la | head -5,能够观察所有系统的数据 ps axjf | head -20,连同部分程序树状态 ps l仅查看自己的bash相关的进程 ps aux观察系统所有进程 属性含义USER进程使用者PID进程标识符%CPU进程使用掉的CPU 资源百分比%MEM…

一个不错的docker支持音频的rdp桌面

docker pull danielguerra/xfce4-rdp-audio 获取该镜像后,运行 docker run -d --name xfce4_0 --shm-size 1g -p 3389:3389 danielguerra/xfce4-rdp-audio相当于开了3个不同的系统容器,端口分别的13389,23389,33389,这时用远程桌面就可以连…

记录--记一次前端CSS升级

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 目前平台前端使用的是原生CSSBEM命名,在多人协作的模式下,容易出现样式冲突。为了减少这一类的问题,提升研效,我调研了业界上主流的7种CSS解决方案&…

Java基于springboot+vue 的传统乐器培训管理系统 elementUI

此网站系统的开发方式和信息管理方式,借鉴前人设计的信息和研发。以在线乐器培训管理为主,以乐器培训管理为核心功能来进行设计和研发,把网站信息和技术整合,开发出一套网上乐器培训管理系统。主要运用现在社会公司中最新的技术框…

rocketmq源码学习-nameServer

前言 最近看了下rocketmq的源码,计划针对最近的学习,做一个笔记,先从nameServer启动的逻辑开始记录吧 在rocketmq中,有四个关键的组件 nameServerbrokerproducerconsumer 这四个组件之间的关系是这样的 关于nameSrv namese…