时间:2021-05-22
Python中,使用for循环可以迭代容器对象中的元素,这里容器对象包括是列表(list)、元组(tuple)、字典(dict)、集合(set)等。但是,为什么这些对象可以使用for循环进行操作呢?
首先,定义一个简单的类尝试一下:
class TestRange: def __init__(self, num): self.num = numfor i in TestRange(10): print(i)# 输出Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'TestRange' object is not iterable错误信息提示,'TestRange' object 不是可迭代的对象。那么,什么才是可迭代的对象呢?
在可迭代的对象中,需要实现一个__iter__魔法方法,而且这个方法的返回值需要是一个迭代器。那么,什么是迭代器呢?
迭代器只需要实现__next__魔法方法。
以列表(list)为例:
>>> nums = [13,12,33]>>> iter_ret = nums.__iter__() # x有此方法,说明list是可迭代的,而且该方法返回一个迭代器>>> iter_ret<list_iterator object at 0x100f32198>>>> iter_ret.__next__()13>>> iter_ret.__next__()12>>> iter_ret.__next__()33>>> iter_ret.__next__()Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration分析:
如上所示,列表nums中实现了__iter__方法,而且返回一个迭代器(iterator),迭代器中实现了__next__方法。在不断调用__next__的过程中,就是在不断返回nums中的元素,直到出现StopIteration的错误。
其实,for语句的作用与此类似。for语句的内部机制为:
前面的 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 循环内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
概述最近学习python,发现python是支持多继承的,这让我想起Java是通过内部类实现的这套机制。这篇文章不是讲如何通过内部类实现多继承,而是总结一下内部
Python引入了一个机制:引用计数。引用计数python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被
简介本文主要介绍python数组循环语法。主要方式有元素遍历,索引遍历,enumerate,zip,list内部等。普通循环list1=['item1','it
从三个方面来说,主要有方面的措施:对象的引用计数机制、垃圾回收机制、内存池机制。一、对象的引用计数机制Python内部使用引用计数,来保持追踪内存中的对象,所有
一.垃圾回收机制Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。在Python中,如果一个对象的引用数为0,Python