python的循环语句机制_Python-for循环的内部机制
Python中,使用for循环可以迭代容器对象中的元素,这里容器对象包括是列表(list)、元组(tuple)、字典(dict)、集合(set)等。但是,为什么这些对象可以使用for循环进行操作呢?
首先,定义一个简单的类尝试一下:
class TestRange:
def __init__(self, num):
self.num = num
for i in TestRange(10):
print(i)
# 输出
Traceback (most recent call last):
File "", line 1, in
TypeError: 'TestRange' object is not iterable
错误信息提示,'TestRange' object 不是可迭代的对象。那么,什么才是可迭代的对象呢?
在可迭代的对象中,需要实现一个__iter__魔法方法,而且这个方法的返回值需要是一个迭代器。那么,什么是迭代器呢?
迭代器只需要实现__next__魔法方法。
以列表(list)为例:
>>> nums = [13,12,33]
>>> iter_ret = nums.__iter__() # x有此方法,说明list是可迭代的,而且该方法返回一个迭代器
>>> iter_ret
>>> iter_ret.__next__()
13
>>> iter_ret.__next__()
12
>>> iter_ret.__next__()
33
>>> iter_ret.__next__()
Traceback (most recent call last):
File "", line 1, in
StopIteration
分析:
如上所示,列表nums中实现了__iter__方法,而且返回一个迭代器(iterator),迭代器中实现了__next__方法。在不断调用__next__的过程中,就是在不断返回nums中的元素,直到出现StopIteration的错误。
其实,for语句的作用与此类似。for语句的内部机制为:
先判断对象是否为可迭代对象,即是否存在__iter__方法,如果存在则调用__iter__方法,返回一个迭代器;否则,直接抛出TypeError异常;
不断地调用迭代器的__next__方法,每次调用按顺序迭代获取当前的值;
迭代完所有元素,就抛出异常 StopIteration,这个异常 python 解释器自己会处理;
前面的 TestRange 报错是因为它没有实现迭代器协议里面的这两个方法,现在继续改进:
class TestRange:
def __init__(self, _max):
self.i = 0
self._max = _max
def __iter__(self):
return self
def __next__(self):
if self.i < self._max:
i = self.i
self.i += 1
return i
else:
# 达到停止条件时,抛出此异常
raise StopIteration()
# 进行测试
for i in TestRange(3):
print(i)
# 输出
0
1
2
分析:
因为这个类中,已经实现了__next__方法,所以基于这个类所创建的对象,本身就是一个迭代器。又因为可迭代对象需要有__iter__方法,而且返回一个迭代器,所以__iter__返回对象本身self即可。
总结
到此这篇关于Python-for循环的内部机制的文章就介绍到这了,更多相关python for 循环内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!
python的循环语句机制_Python-for循环的内部机制相关推荐
- pythonfor循环语句例子_Python for循环学习总结
for循环是Python的循环语句之一,它常用于遍历字符串.列表.元组.字典.集合等序列类型,逐个获取序列中的各个元素.小编将为大家总结for循环的学习知识点,主要包括:for循环语法.实例展示.循环 ...
- python循环语句知识点_Python for 循环语句【每日一个知识点第115期
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. 语法: for循环的语法格式如下: for iterating_var in sequence: statements(s) ...
- do...while循环语句、死循环、循环的嵌套、Break、Continue
1.do-while循环语句 格式: do{ 循环执行体 }while(循环条件); 注意该循环和while循环的区别: 当首次的循环条件结果是false,那么while循环的执行体是不执行的, 但是 ...
- 【C语言】循环语句(do while循环)
简单不先于复杂,而是在复杂之后. 目录 do while循环 do 语句的用法 执行流程 do语句的特点 go to语句 do while循环 do 语句的用法 while循环和for循环都是入口条件 ...
- php语言while循环语句,PHP循环语句用法之while循环
PHP循环语句用法之while循环 计算机对于重复性的工作是很有一套解决办法的,以下百分网小编整理的PHP循环语句用法之while循环的介绍吧,希望对大家有所帮助,更多信息请关注应届毕业生网! 计算机 ...
- Java循环语句练习(for循环、while循环、do-while循环)
Java循环语句常见练习 for循环.while循环.do-while循环的应用 循环语句出现初衷:简化代码的书写. 一般情况下,循环结构应该有四个部分:初始化语句;条件表达式;循环体;循环变量控制语 ...
- c语言的循环语句试讲,C语言循环语句基础入门教学(一)
C 循环 有的时候,我们可能需要多次执行同一块代码.一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了更为复杂执行路径的多种控制结构. 循环语句允许 ...
- R语言for循环语句编程:for循环遍历向量内容并修改向量内容
R语言for循环语句编程:for循环遍历向量内容并修改向量内容 目录 R语言for循环语句编程:for循环遍历向量内容并修改向量内容
- python的for语句条件_Python中的条件选择和循环语句
Python中的条件选择和循环语句 同C语言.Java一样,Python中也存在条件选择和循环语句,其风格和C语言.java的很类似,但是在写法和用法上还是有一些区别.今天就让我们一起来了解一下. 一 ...
- python的for语句用法_python中list循环语句用法实例
本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...
最新文章
- Ubuntu 18 snap 占用 100%,卸载 snap
- 复杂基因组测序技术研究进展
- SAP WM高阶之Storage Type上架策略L下的Mixed Storage
- java db 程序_JAVA连接数据库的简单程序
- mysql 5.6.34 二进制下载_linux下安装mysql二进制版本(5.6.34)
- 小度智能屏X10正式发布:10.1英寸超大屏 售价999元
- lombok原理_十分钟搞懂Lombok使用与原理
- 我对架构的理解-概念篇
- node.js-session问题
- 如何确认guest账户是空密码_Mac OS X如何访问Windows局域网文件共享
- 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
- 32位的PLSQL登录64位的ORA11g有关问题
- 一年中所有节日的排列顺序_中国传统节日有哪些 按顺序排列全部
- 光环PMP 三模模拟题
- word转pdf转换器2015注册码
- 玲珑学院-1014-Absolute Defeat【思维】
- (2.3)【遥控型木马-灰鸽子】原理、使用方法
- [Other]规范的邮件签名格式及HTML代码
- 人工智能界专家:现在我们的机器智商还不及老鼠
- 现在网络安全员工资一般多少(网络安全员平均工资)
热门文章
- java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话
- mac 大写锁定延迟_延迟分析中的案例研究:锁定与同步
- jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!
- javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
- ejb运行程序_在哪里可以运行EJB?
- 高效的企业测试-单元和用例测试(2/6)
- 创建自定义Maven原型
- 将可见的电子签名添加到PDF
- 如何在Java中转义JSON字符串-Eclipse IDE技巧
- SpringHibernate3