You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

map、filter是否为iterator子类?迭代器类关系与实现查询

关于Python迭代器相关类型的疑问解答

一、map/filter/zip与迭代器的关系

你看到map/filter返回<class 'map'>/<class 'filter'>这类专属类型,但文档说它们是迭代器,核心原因是:这些类实现了迭代器协议,而非直接继承自某个名为iterator的具体类。

在Python里,判断一个对象是不是迭代器,看的不是继承关系,而是它有没有实现两个关键方法:

  • __iter__():返回对象自身(迭代器本身就是可迭代对象)
  • __next__():返回下一个元素,无元素时抛出StopIteration异常

map、filter、zip都满足这个协议,所以它们的实例都是迭代器。你可以用isinstance验证:

from collections.abc import Iterator

x = [1,2,3,4]
print(isinstance(map(lambda i:i*2, x), Iterator))  # 输出True
print(isinstance(filter(lambda i:i>2, x), Iterator))  # 输出True

二、list_iterator/tuple_iterator等的继承关系

这些专属迭代器类,确实都遵循同一个抽象基类——collections.abc.Iterator(Python 3.3+引入)。这个抽象类定义了迭代器的标准协议,所有符合迭代器要求的类,不管是内置的还是自定义的,都会被它识别。

验证代码如下:

from collections.abc import Iterator

x = [1,2,3,4]
list_iter = iter(x)
print(isinstance(list_iter, Iterator))  # 输出True

tuple_iter = iter((1,2,3,4))
print(isinstance(tuple_iter, Iterator))  # 输出True

str_iter = iter("1234")
print(isinstance(str_iter, Iterator))  # 输出True

需要注意的是,这些具体迭代器类(比如list_iterator)是Python底层用C实现的,不会直接显示继承关系,但逻辑上完全符合Iterator抽象基类的规范。

三、查看map和list_iterator的实现

这类内置迭代器相关类大多是Python的C扩展实现,不是纯Python代码,要查看具体实现需要找Python的官方源码:

  1. map类的实现:在源码的Objects/mapobject.c文件中
  2. list_iterator类的实现:在源码的Objects/listobject.c文件中,搜索list_iter相关的结构体和函数即可找到

如果想通过纯Python代码理解逻辑,也可以自己写一个简化版的模拟实现,比如模拟map的行为:

class MyMap:
    def __init__(self, func, iterable):
        self.func = func
        self.iterable = iter(iterable)
    
    def __iter__(self):
        return self
    
    def __next__(self):
        item = next(self.iterable)
        return self.func(item)

内容的提问来源于stack exchange,提问作者Bassel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:50:29