前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >一文搞懂Python迭代器(通俗易懂)

一文搞懂Python迭代器(通俗易懂)

原创
作者头像
蜘蛛侠在写码
发布2024-11-30 11:21:52
发布2024-11-30 11:21:52
11800
代码可运行
举报
运行总次数:0
代码可运行

python迭代器是一个相对难以理解的概念,Up在初次接触时也觉得晦涩。本文尽可能用通俗易懂的语言和例子,解释清楚python迭代器。

注:本文长期有效,持续迭代完善,建议收藏。

提前划重点

  • 两个概念:迭代器对象和可迭代对象
  • 例子:代码实现迭代器对象和可迭代对象
  • 拆解for循环

两个概念:迭代器对象和可迭代对象

可迭代对象:实现了__iter__()方法的对象

迭代器对象:实现了__iter__()__next__()方法的对象称为迭代器对象

通过定义可以知道,迭代器对象一定是可迭代对象

简单解释一下这两个方法

__iter__()方法要返回一个迭代器对象,你可以使用iter() 函数来触发它。

__next__()方法用于从迭代器中返回下一个值,如果没有可返回值了,抛出 StopIteration异常。你可以使用next() 函数来触发它。

这么说还是有点抽象,下面用一个例子来理解一下:

例子:代码实现迭代器对象和可迭代对象

代码语言:PYTHON
复制
# 可迭代类
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循环用法:

代码语言:python
代码运行次数:0
复制
numbers = [1, 2, 3, 4, 5]

for num in numbers:
    print(num)

那底层是怎么实现的呢

代码语言:python
代码运行次数:0
复制
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更得越快。感谢支持,下期见!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 提前划重点
  • 两个概念:迭代器对象和可迭代对象
    • 例子:代码实现迭代器对象和可迭代对象
    • 拆解for循环
    • 下期预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档