一文搞懂Python迭代器(通俗易懂)
python迭代器是一个相对难以理解的概念,Up在初次接触时也觉得晦涩。本文尽可能用通俗易懂的语言和例子,解释清楚python迭代器。
注:本文长期有效,持续迭代完善,建议收藏。
提前划重点
- 两个概念:迭代器对象和可迭代对象
- 例子:代码实现迭代器对象和可迭代对象
- 拆解for循环
两个概念:迭代器对象和可迭代对象
可迭代对象:实现了__iter__()
方法的对象
迭代器对象:实现了__iter__()
和__next__()
方法的对象称为迭代器对象
通过定义可以知道,迭代器对象一定是可迭代对象。
简单解释一下这两个方法
__iter__()
方法要返回一个迭代器对象,你可以使用iter() 函数来触发它。
__next__()
方法用于从迭代器中返回下一个值,如果没有可返回值了,抛出 StopIteration
异常。你可以使用next() 函数来触发它。
这么说还是有点抽象,下面用一个例子来理解一下:
例子:代码实现迭代器对象和可迭代对象
# 可迭代类
class MyIterable:
def __init__(self, data_list):
self.data_list = data_list # 存储数据
def __iter__(self):
return MyIterator(self) # __iter__方法要返回一个迭代器对象,且每次调用返回新的对象
# 迭代器类
class MyIterator:
def __init__(self, my_iterable):
self.my_iterable = my_iterable
self.index = 0 # 用于跟踪当前的位置
def __iter__(self):
return self # 一般迭代器类的__iter__方法都返回self,因为自己就是迭代器对象
def __next__(self):
if self.index >= len(self.my_iterable.data_list):
raise StopIteration # 如果没有更多元素,则抛出StopIteration异常
result = self.my_iterable.data_list[self.index]
self.index += 1
return result
#### 使用示例
my_list = [1, 2, 3, 4, 5]
# my_iterable是一个可迭代对象
my_iterable = MyIterable(my_list)
# my_Iterator是一个迭代器对象
# iter(Object)会执行 Object.__iter__(),返回一个迭代器对象
my_Iterator = iter(my_iterable)
# next(Object)会执行 Object.__next__(),返回下一个值
print(next(my_Iterator)) # 打印 1
print(next(my_Iterator)) # 打印 2
一个值得关注的点:迭代器对象是有状态的,比如这里的index会一直增大。所以每次调用可迭代对象的__iter__()
,都返回一个新的迭代器对象。
大家是不是觉得,这么这个用法似曾相识?是的,这不就是for循环干的事儿吗,一直next直到没有值返回了。没错,接下来我们就来拆解一下for循环的本质!
拆解for循环
这个是我们熟悉的for循环用法:
numbers = [1, 2, 3, 4, 5]
for num in numbers:
print(num)
那底层是怎么实现的呢
numbers = [1, 2, 3, 4, 5] # numbers数组是一个可迭代对象,python中list,dict,tuple,set都是可迭代对象
numbers_iterator = iter(numbers) # 返回一个numbers专属的迭代器对象
while True:
try:
# 调用next获取下一个元素
item = next(iterator)
print(item)
except StopIteration:
# 没有更多元素时退出循环
break
for循环的语法相当于把这些底层的实现隐藏起来,让用户可以用更简单的写法表达循环。其实搞懂了可迭代对象和迭代器对象的原理,也就很容易理解for循环的本质。
在python中list,dict,tuple,set都是可迭代对象,所以都可以用for循环遍历,iter方法都会返回一个专属的迭代器对象。
下期预告
有一个很特殊的迭代器yield,也是一个不太好理解的概念。下期我们也尽可能通俗易懂拆解一下yield。听说点赞越多,Up更得越快。感谢支持,下期见!
标签:__,迭代,Python,self,iter,对象,搞懂,my From: https://blog.csdn.net/weixin_45536837/article/details/144151575