当前位置:首页 > Python > 正文

掌握Python迭代器(从零开始理解可迭代对象与迭代协议)

在学习Python迭代器之前,你可能已经用过for循环遍历列表、字符串或字典。但你是否想过,为什么这些对象可以被遍历?背后的机制是什么?本文将带你从零开始,深入浅出地理解Python迭代器可迭代对象以及相关的内置函数如iter()next()

什么是可迭代对象(Iterable)?

在Python中,任何实现了__iter__()方法的对象,或者实现了__getitem__()方法并支持整数索引的对象,都被称为可迭代对象(Iterable)。常见的可迭代对象包括:

  • 列表(list)
  • 元组(tuple)
  • 字符串(str)
  • 字典(dict)
  • 集合(set)

例如:

# 列表是可迭代对象my_list = [1, 2, 3]for item in my_list:    print(item)  

什么是迭代器(Iterator)?

迭代器是一个实现了迭代器协议的对象。迭代器协议要求对象必须实现两个方法:

  • __iter__():返回迭代器自身(通常用于支持for循环)
  • __next__():返回容器中的下一个元素;如果没有更多元素,则抛出StopIteration异常
掌握Python迭代器(从零开始理解可迭代对象与迭代协议) Python迭代器 可迭代对象 iter函数 next函数 第1张

iter() 和 next() 函数

Python提供了两个内置函数来操作迭代器:

  • iter(obj):将一个可迭代对象转换为迭代器
  • next(iterator):从迭代器中获取下一个元素

来看一个例子:

my_list = [10, 20, 30]# 使用 iter() 获取迭代器it = iter(my_list)# 使用 next() 逐个获取元素print(next(it))  # 输出: 10print(next(it))  # 输出: 20print(next(it))  # 输出: 30# 再次调用 next() 会抛出 StopIteration 异常# print(next(it))  # 报错!  

手动创建一个迭代器

我们也可以通过定义类来创建自己的迭代器。下面是一个简单的计数器迭代器:

class CountDown:    def __init__(self, start):        self.start = start    def __iter__(self):        return self    def __next__(self):        if self.start <= 0:            raise StopIteration        self.start -= 1        return self.start + 1# 使用自定义迭代器cd = CountDown(3)for num in cd:    print(num)# 输出:# 3# 2# 1  

总结

- 可迭代对象是可以被遍历的对象,如列表、字符串等。
- 迭代器是实际执行遍历的对象,它知道如何逐个返回元素。
- 使用iter()可以从可迭代对象获取迭代器。
- 使用next()可以从迭代器中取出下一个值。
- 当没有更多元素时,next()会抛出StopIteration异常,for循环会自动处理这个异常。

理解Python迭代器可迭代对象iter函数和next函数,不仅能让你写出更高效的代码,还能帮助你深入理解Python的底层机制。希望这篇教程能为你打下坚实的基础!