python | 你知道for...in是底层原理是什么样的么?探寻python迭代器

简介: python | 你知道for...in是底层原理是什么样的么?探寻python迭代器

image.png

面试官: 听说你熟悉python,那么你能简单阐述一下python的装饰器、生成器以及迭代器么?


我: emm, 我不清楚,我只是了解过python最基本的代码。

上述是弟弟前段时间去面试运维开发,遇到的问题,emmm,运维是一个很杂的职业,在小公司,总结一句话就是宽而浅,痛定思痛,决定来了解一下python特性,于是乎,就有了这篇文章。


这篇文章,我们将介绍python迭代器,使用环境为: Python 3.6.8


image.png



什么是迭代器


什么是python迭代器呢? 举一个最简单的例子:


image.png


这就是python迭代器,好了,讲完了,手工。

image.png


是的,使用for...in的方式,底层都是使用的是迭代器,你是不是之前写的时候,从来没有好奇过,为什么遍历不同的数据类型,都可以使用for...in通用呢?


弟弟我也是一样的,没有想过,为什么可以这样写。迭代器语法我们已经讲了,接下来,我们来剥开迭代器的面纱吧。



为什么需要迭代器


只要符合python迭代器条件的,都可以使用for...in来遍历元素,即: 使用相同的代码,遍历不同的数据容器。 我认为这是根本原因。


如果上述描述还不清晰的话,我们可以使用cpython来遍历一下数组 和 字符串,就能清晰的了解了。

image.png


如上代码,是c语言遍历数组"pdudo","hello","juejin"和字符串pdudohellojuejin,我们需要自己写遍历条件的临界值。

而如何使用python来写呢? 来看下呢。

image.png

只需要定义数组和字符串,而后使用for...in便结束了。

我想,如上例子,就足以证明为什么要使用迭代器的原因了,因为真的很爽。



迭代器是如何工作的


在经历了前2个段落的铺垫,我猜你肯定很想知道迭代器是如何工作的吧?现在它来了。


在使用for...in语句时,它会调用inter()对象,该函数会返回一个迭代器对象。该对象又定义了__next__()方法,该方法一次返回一个容器元素,当没有更多元素可以返回的时候,会抛一个StopIteration异常来表明for终止循环。


是不是还是不懂?没关系,我们再写一个案例来说明一下。

image.png


如上代码,定义了一个列表,其值为: "pdudo","hello","juejin",而后调用iter方法,它将返回一个迭代器,而后调用next方法来返回下一个元素,但是我们定义的列表长度为3,而调用了4次next方法,可见,最后一次会抛异常。


我们执行后,效果如下:

image.png

可见,和我们上述猜想的一致,在for...in语句中,也是调用inter()容器对象,使用__next__返回后续可迭代的对象,如此类推,直至遇到异常StopIteration,循环结束。


好了,知道迭代器是如何工作了吧? 那么,我们再抛出一个问题,看你能否接住呢? 如何判断一个数据类型是能够被迭代的呢?



如何创建一个迭代器


我们已经学会了如何使用迭代器,以及知晓了迭代器是如何工作的,本段落将介绍如何创建一个迭代器,在看这个之前,我们思考一个问题,如下代码是否会报错呢?

image.png

我们使用for...in来遍历一个int类型的数据。

如上代码,当然会报错,借此引出我们的知识点:什么样的数据类型才能被迭代呢?


是这样的,能否被迭代,取决于该方法是否有__iter__方法。

可以看下如下例子,我们自定义了一个迭代器,用于倒叙输出数据。

image.png


执行后,结果为:

image.png


可见,创建一个迭代器,至少需要 __iter__方法 和 有__next__方法。

好了,有了这个基础案例,我们来写一个链表?

image.png


如上代码,我们先创建节点Node,它有2个值,val是记录的值,而nextNode是记录下一个Node的指针,而后定义了类Lists,调用时候,需要传入一个Node,它会将currentNodes来记录当前的Node 重点看__next__,当当前节点为空的时候,则返回StopIteration告知for迭代器结束了,否则的话,取出当前节点的val并且返回,且将其下滑到下一个节点。


如上代码,运行后,结果如下:

image.png


总结


本篇文章,我们首先介绍了什么迭代器,什么是迭代器呢? 最简单的for...in就是迭代器,接着便介绍了为什么需要迭代器,我们通过c输出数组和字符串来和pythonfor...in语法做比较,迭代器写法更为简单,迭代器的核心是使用相同的代码,遍历不同的数据容器。 接着便介绍了迭代器是如何工作的,其对象方法必须要有__iter____next__方法,才能被for...in所调用,最后我们实现了一个类,实现了上述的2个方法,从而实现了迭代器。



相关文章
|
6月前
|
运维 监控 算法
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
MSET-SPRT是一种结合多元状态估计技术(MSET)与序贯概率比检验(SPRT)的混合框架,专为高维度、强关联数据流的异常检测设计。MSET通过历史数据建模估计系统预期状态,SPRT基于统计推断判定偏差显著性,二者协同实现精准高效的异常识别。本文以Python为例,展示其在模拟数据中的应用,证明其在工业监控、设备健康管理及网络安全等领域的可靠性与有效性。
801 13
时间序列异常检测:MSET-SPRT组合方法的原理和Python代码实现
|
20天前
|
传感器 数据采集 监控
Python生成器与迭代器:从内存优化到协程调度的深度实践
简介:本文深入解析Python迭代器与生成器的原理及应用,涵盖内存优化技巧、底层协议实现、生成器通信机制及异步编程场景。通过实例讲解如何高效处理大文件、构建数据流水线,并对比不同迭代方式的性能特点,助你编写低内存、高效率的Python代码。
96 0
|
6月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
223 7
|
2月前
|
人工智能 测试技术 编译器
从 Python 演进探寻 AI 与云对编程语言的推动
Python 自 2008 年发布 3.0 版本以来,经历了持续演进与革新。十六年间,从 Python 3.0 到即将发布的 3.14,语言设计、性能优化、类库生态及虚拟机技术等方面均有显著提升。字符串处理、异步编程、类型系统等核心功能不断现代化,Faster CPython 和 JIT 编译技术推动运行效率飞跃。同时,AI、云计算等新兴技术成为其发展的重要驱动力。本文全面回顾了 Python 的演进历程,并展望未来发展方向。
|
2月前
|
存储 数据安全/隐私保护 开发者
Python深浅拷贝全解析:从原理到实战的避坑指南
在Python开发中,深浅拷贝是处理对象复制的关键概念。直接赋值仅复制引用,修改副本会影响原始数据。浅拷贝(如切片、copy方法)创建新容器但共享嵌套对象,适用于单层结构或需共享子对象的场景;而深拷贝(copy.deepcopy)递归复制所有层级,确保完全独立,适合嵌套结构或多线程环境。本文详解二者原理、实现方式及性能考量,帮助开发者根据实际需求选择合适的拷贝策略,避免数据污染与性能浪费。
175 1
|
2月前
|
传感器 算法 数据挖掘
Python时间序列平滑技术完全指南:6种主流方法原理与实战应用
时间序列数据分析中,噪声干扰普遍存在,影响趋势提取。本文系统解析六种常用平滑技术——移动平均、EMA、Savitzky-Golay滤波器、LOESS回归、高斯滤波与卡尔曼滤波,从原理、参数配置、适用场景及优缺点多角度对比,并引入RPR指标量化平滑效果,助力方法选择与优化。
391 0
|
3月前
|
数据采集 网络协议 前端开发
Python多线程爬虫模板:从原理到实战的完整指南
多线程爬虫通过并发请求大幅提升数据采集效率,适用于大规模网页抓取。本文详解其原理与实现,涵盖任务队列、线程池、会话保持、异常处理、反爬对抗等核心技术,并提供可扩展的Python模板代码,助力高效稳定的数据采集实践。
142 0
|
4月前
|
机器学习/深度学习 算法 测试技术
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
本文探讨了基于图的重排序方法在信息检索领域的应用与前景。传统两阶段检索架构中,初始检索速度快但结果可能含噪声,重排序阶段通过强大语言模型提升精度,但仍面临复杂需求挑战
124 0
图神经网络在信息检索重排序中的应用:原理、架构与Python代码解析
|
10月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
534 3
|
10月前
|
机器学习/深度学习 算法 数据挖掘
线性回归模型的原理、实现及应用,特别是在 Python 中的实践
本文深入探讨了线性回归模型的原理、实现及应用,特别是在 Python 中的实践。线性回归假设因变量与自变量间存在线性关系,通过建立线性方程预测未知数据。文章介绍了模型的基本原理、实现步骤、Python 常用库(如 Scikit-learn 和 Statsmodels)、参数解释、优缺点及扩展应用,强调了其在数据分析中的重要性和局限性。
546 3

推荐镜像

更多