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循环的内部机制相关推荐

  1. pythonfor循环语句例子_Python for循环学习总结

    for循环是Python的循环语句之一,它常用于遍历字符串.列表.元组.字典.集合等序列类型,逐个获取序列中的各个元素.小编将为大家总结for循环的学习知识点,主要包括:for循环语法.实例展示.循环 ...

  2. python循环语句知识点_Python for 循环语句【每日一个知识点第115期

    Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串. 语法: for循环的语法格式如下: for iterating_var in sequence: statements(s) ...

  3. do...while循环语句、死循环、循环的嵌套、Break、Continue

    1.do-while循环语句 格式: do{ 循环执行体 }while(循环条件); 注意该循环和while循环的区别: 当首次的循环条件结果是false,那么while循环的执行体是不执行的, 但是 ...

  4. 【C语言】循环语句(do while循环)

    简单不先于复杂,而是在复杂之后. 目录 do while循环 do 语句的用法 执行流程 do语句的特点 go to语句 do while循环 do 语句的用法 while循环和for循环都是入口条件 ...

  5. php语言while循环语句,PHP循环语句用法之while循环

    PHP循环语句用法之while循环 计算机对于重复性的工作是很有一套解决办法的,以下百分网小编整理的PHP循环语句用法之while循环的介绍吧,希望对大家有所帮助,更多信息请关注应届毕业生网! 计算机 ...

  6. Java循环语句练习(for循环、while循环、do-while循环)

    Java循环语句常见练习 for循环.while循环.do-while循环的应用 循环语句出现初衷:简化代码的书写. 一般情况下,循环结构应该有四个部分:初始化语句;条件表达式;循环体;循环变量控制语 ...

  7. c语言的循环语句试讲,C语言循环语句基础入门教学(一)

    C 循环 有的时候,我们可能需要多次执行同一块代码.一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推. 编程语言提供了更为复杂执行路径的多种控制结构. 循环语句允许 ...

  8. R语言for循环语句编程:for循环遍历向量内容并修改向量内容

    R语言for循环语句编程:for循环遍历向量内容并修改向量内容 目录 R语言for循环语句编程:for循环遍历向量内容并修改向量内容

  9. python的for语句条件_Python中的条件选择和循环语句

    Python中的条件选择和循环语句 同C语言.Java一样,Python中也存在条件选择和循环语句,其风格和C语言.java的很类似,但是在写法和用法上还是有一些区别.今天就让我们一起来了解一下. 一 ...

  10. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

最新文章

  1. Ubuntu 18 snap 占用 100%,卸载 snap
  2. 复杂基因组测序技术研究进展
  3. SAP WM高阶之Storage Type上架策略L下的Mixed Storage
  4. java db 程序_JAVA连接数据库的简单程序
  5. mysql 5.6.34 二进制下载_linux下安装mysql二进制版本(5.6.34)
  6. 小度智能屏X10正式发布:10.1英寸超大屏 售价999元
  7. lombok原理_十分钟搞懂Lombok使用与原理
  8. 我对架构的理解-概念篇
  9. node.js-session问题
  10. 如何确认guest账户是空密码_Mac OS X如何访问Windows局域网文件共享
  11. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  12. 32位的PLSQL登录64位的ORA11g有关问题
  13. 一年中所有节日的排列顺序_中国传统节日有哪些 按顺序排列全部
  14. 光环PMP 三模模拟题
  15. word转pdf转换器2015注册码
  16. 玲珑学院-1014-Absolute Defeat【思维】
  17. (2.3)【遥控型木马-灰鸽子】原理、使用方法
  18. [Other]规范的邮件签名格式及HTML代码
  19. 人工智能界专家:现在我们的机器智商还不及老鼠
  20. 现在网络安全员工资一般多少(网络安全员平均工资)

热门文章

  1. java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话
  2. mac 大写锁定延迟_延迟分析中的案例研究:锁定与同步
  3. jboss eap 7.0_是时候抛弃Java 7 – JBoss EAP 6.4了!
  4. javadoc 标签_新的Javadoc标签@ apiNote,@ implSpec和@implNote
  5. ejb运行程序_在哪里可以运行EJB?
  6. 高效的企业测试-单元和用例测试(2/6)
  7. 创建自定义Maven原型
  8. 将可见的电子签名添加到PDF
  9. 如何在Java中转义JSON字符串-Eclipse IDE技巧
  10. SpringHibernate3