Python魔法函数和迭代器

文章目录

    • 引入
    • 魔法函数 和for循环原理
    • iter和next函数

刷完这60个标准库模块,成为Python骨灰级玩家

引入

每个Pythoner对for...in这种循环都很熟悉,其使用方法如下

for i in [1,2,3,4,5]:
    print(i)

输出如下

1 2 3 4 5 1\\2\\3\\4\\5 12345

上述代码非常符合直觉,就是把 [ 1 , 2 , 3 , 4 , 5 ] [1,2,3,4,5] [1,2,3,4,5]中的数据挨个挑出来,然后打印。但问题在于,for…in到底有什么能力,把 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5从列表中拿出来,for…in又怎么知道 [ 1 , 2 , 3 , 4 , 5 ] [1,2,3,4,5] [1,2,3,4,5]是一个列表的?

这就涉及到了列表中的两个重要的魔术方法__iter__和__next__。

魔法函数 和for循环原理

为了说明这一点,可以做一个简单的粒子

class Test:
    def __init__(self, N):
        self.N = N
        self.index = -1
    def __iter__(self):
        return self
    def __next__(self):
        if self.index < self.N-1:
            self.index += 1
        else:
            raise StopIteration
        return self.index

上面这个类中规中矩,除了重写了两个魔法函数之外,没有任何值得关注的地方。

但是,一经for…in的调用,就会明白__iter__和__next__的含义

>>> test = Test(5)
>>> for t in test:
...   print(t)
...
0
1
2
3
4

其原理大致为

test = Test(5)
tmp = test.__iter__()
while True:
    try:
        print(test.__next__())
    except:
        break

即在进入for循环之后,先调用__iter__创建一个迭代器,然后不断地调用迭代器中的__next__函数,直到抛出StopIteration这个错误。

iter和next函数

在Python中,对__iter__和__next__这两个魔法函数,提供了外部的调用函数,即iternext

>>> test = Test(3)
>>> tmp = iter(test)
>>> next(tmp)
0
>>> next(tmp)
1
>>> next(tmp)
2
>>> next(tmp)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in __next__
StopIteration
>>> next(test)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in __next__
StopIteration

可见在弹出 0 , 1 , 2 0,1,2 0,1,2之后,再去调用next,弹出了迭代终止的错误。

但对于列表这种数据结构,并不能直接next,只有在iter之后,才能调用

>>> x = [1,2,3]
>>> next(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'list' object is not an iterator
>>> y = iter(x)
>>> next(y)
1

换言之,对于一个类而言,__iter__和__next__并不需要同时具备,但一般来说__iter__返回的对象需要带有__next__魔法函数。其实现逻辑大致如下

class NextTest:
    def __init__(self, N):
        self.N = N
        self.index = -1
    def __next__(self):
        if self.index < self.N-1:
            self.index += 1
        else:
            raise StopIteration
        return self.index

class IterTest:
    def __init__(self, N):
        self.N = N
    def __iter__(self):
        return NextTest(self.N)

测试一下

test = IterTest(5)
for t in test:
    print(t)

结果为

0 1 2 3 4 0\\1\\2\\3\\4 01234

这其实也是range这个迭代器的调用逻辑。

在这里插入图片描述

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

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

相关文章

未发表!基于主从博弈的多主体微网/综合能源系统利益分摊与能量管理程序代码!

适用平台&#xff1a;MatlabYalmipCplex 程序首先建立了综合能源运营商、新能源用户、电动汽车充电商的多主体园区&#xff0c;分析了三种市场交易主体的属性和市场交易机制。其次建立基于主从博弈的三方市场主体能量管理与收益分摊方案&#xff0c;利用改进粒子群算法进行求解…

【GitHub项目推荐--十六进制编辑器】【转载】

一款名为 ImHex 的十六进制编辑器获得了 15.3k 的 Star。十六进制编辑器可以让你以十六进制的形式查看或编辑文件的二进制数据&#xff0c;并用较为友好的界面来编辑二进制数据&#xff0c;和常见的十六进制编辑器 GNOME Hex Editor 等不一样&#xff0c;ImHex 功能非常强大&am…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

AtCoder Beginner Contest 338D - Island Tour【枚举】

原题链接&#xff1a;https://atcoder.jp/contests/abc338/tasks/abc338_d Time Limit: 2 sec / Memory Limit: 1024 MB Score: 425 points 问题陈述 AtCoder 群岛由 N 座岛屿组成&#xff0c;这些岛屿由 N 座桥梁连接。这些岛屿的编号从1到N&#xff0c;i(1≤i≤N−1)桥双…

Qt WebEngine模块使用(开发环境安装和程序开发)

一、Qt WebEngine Qt WebEngine_hitzsf的博客-CSDN博客 Qt WebEngine模块提供了一个Web浏览器引擎&#xff0c;可以轻松地将万维网上的内容嵌入到没有本机Web引擎的平台上的Qt应用程序中。Qt WebEngine提供了用于渲染HTML&#xff0c;XHTML和SVG文档的C 类和QML类型&#xff…

(南京观海微电子)——OLED生产与技术

一、OLED的分类 以下是几种OLED&#xff1a;被动矩阵OLED、 主动矩阵OLED、透明OLED、顶部发光OLED、可折叠OLED、白光OLED等。 每一种OLED都有其独特的用途。接下来&#xff0c;我们会逐一讨论这几种OLED。首先是被动矩阵和主动矩阵OLED。 被动矩阵OLED(PMOLED) 被动矩阵OLED结…

【新书推荐】3.6 enum枚举类型

本节必须掌握的知识点&#xff1a; 示例十一 代码分析 汇编解析 3.6.1 示例十一 enum定义枚举类型&#xff0c;它本质是一种整数类型&#xff08;等同int&#xff09;。所谓枚举就是一一列举的意思。在实际应用中&#xff0c;一个星期有七天&#xff0c;一年有十二个月等。如果…

java 基础学习1

目录 一.注释 二.关键字 三.字面量 四.变量和标识符 五.键盘录入 六.运算符 一.注释 1.单行注释&#xff1a;//注释信息 2.多行注释&#xff1a;/* 注释信息*/ 3.文档注释&#xff1a;/** 注释信息*/ 注:文档注释暂时用不上 二.关键字 关键字: 被Java赋予了特定…

AcWing 1015.摘花生(DP路线问题)(图解)

[路线问题] Hello Kitty想摘点花生送给她喜欢的米老鼠。 她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。 地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所…

obsidian阅读pdf和文献——与zotero连用

参考&#xff1a; 【基于Obsidian的pdf阅读、标注&#xff0c;构建笔记思维导图&#xff0c;实现笔记标签化、碎片化&#xff0c;便于检索和跳转】 工作流&#xff1a;如何在Obsidian中阅读PDF - Eleven的文章 - 知乎 https://zhuanlan.zhihu.com/p/409627700 操作步骤 基于O…

简单了解AJAX

文章目录 1、什么是AJAX2、AJAX快速入门3、Axios异步框架3.1、Axios 快速入门3.2、Axios 请求方式别名 1、什么是AJAX 概念&#xff1a;AJAX(Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML AJAX作用&#xff1a; 与服务器进行数据交换&#xff1a;通…

2024獬豸杯完整Writeup

文章目录 手机手机基本信息- 1、IOS手机备份包是什么时候开始备份的。&#xff08;标准格式&#xff1a;2024-01-20.12:12:12)手机基本信息- 2、请分析&#xff0c;该手机共下载了几款即时通讯工具。&#xff08;标准格式&#xff1a;阿拉伯数字&#xff09;手机基本信息- 3、手…

go 实现暴力破解数独

一切罪恶的来源是昨晚睡前玩了一把数独&#xff0c;找虐的选了个最难的模式&#xff0c;做了一个多小时才做完&#xff0c;然后就睡不着了..........程序员不能受这委屈&#xff0c;今天咋样也得把这玩意儿破解了 破解思路&#xff08;暴力破解加深度遍历&#xff09; 把数独…

【NodeJS JS】动态加载字体的各方式及注意事项;

首先加载字体这个需求基本只存在于非系统字体&#xff0c;系统已有字体不需要加载即可直接使用&#xff1b; 方案1&#xff1a;创建 style 标签&#xff0c;写入 font-face{font-family: xxx;src: url(xxx)} 等相关字体样式&#xff1b;将style标签添加到body里&#xff1b;方…

2024017期传足14场胜负前瞻

2024017期赛事由亚洲杯2场、英总杯2场、德甲2场、意甲4场、西甲4场组成。售止时间为1月28日&#xff08;周日&#xff09;19点00分&#xff0c;敬请留意&#xff1a; 本期深盘场次同样适中&#xff0c;1.5以下赔率3场&#xff0c;1.5-2.0赔率6场&#xff0c;其他场次基本皆是平…

武汉大学齐民友教授简介

齐民友&#xff08;1930年2月—2021年8月8日&#xff09;&#xff0c;男&#xff0c;出生于安徽省芜湖市&#xff0c;中国共产党优秀党员&#xff0c;数学家、教育家、偏微分方程专家&#xff0c;武汉大学原校长、数学与统计学院教授、博士生导师 。 齐民友于1948年考入武汉大…

(南京观海微电子)——OLED驱动与调试

一、OLED DDIC分类 OLED DDIC的技术方向可以分为3类&#xff1a;带Ram【内存】的IC、Ram-less IC和TDDI【显示&触控集成的IC】 1、带Ram的OLED DDIC OLED DDIC有两个Ram&#xff0c;分别是Demura Ram和Display Ram。 1、带Ram的OLED DDIC 1-1&#xff09;Demura Ram&a…

课时6:编程语言逻辑

1.2.2 编程语言逻辑 学习目标 这一节&#xff0c;我们从 语言分类、编程逻辑、小结 三个方面来学习。 语言分类 语言分类 低级编程语言&#xff1a;机器&#xff1a;- 二进制的0和1的序列&#xff0c;称为机器指令。- 一般人看不懂汇编&#xff1a;- 用一些助记符号替代机…

Linux ---- Shell编程之函数与数组

目录 一、函数 1、函数的基本格式 2、查看函数列表 3、删除函数 4、函数的传参数 5、函数返回值 实验&#xff1a; 1.判断输入的ip地址正确与否 2. 判断是否为管理员用户登录 6、函数变量的作用范围 7、函数递归&#xff08;重要、难点&#xff09; 实验&#xff1…

山西电力市场日前价格预测【2024-01-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-28&#xff09;山西电力市场全天平均日前电价为280.26元/MWh。其中&#xff0c;最高日前电价为556.88元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…