Python的可迭代对象与不可迭代对象详解

 更新时间:2025年07月18日 09:39:30   作者:Tipriest_  
Python中可迭代对象需实现__iter__或__getitem__,如列表、字符串、字典等;不可迭代对象如整数、浮点数等,可用iter()或isinstance()判断,迭代器需实现__next__,可由可迭代对象转换

在Python中,可迭代对象(Iterable) 是指可以被遍历(例如用 for 循环逐项访问)的对象,而 不可迭代对象(Non-Iterable) 无法直接遍历。以下是详细分类和示例:

一、可迭代对象(Iterable)

可迭代对象需要实现 __iter__() 方法,或支持通过索引访问的 __getitem__() 方法。常见类型包括:

1.基础容器类型

  • 列表(list):[1, 2, 3]
  • 元组(tuple):(1, 2, 3)
  • 字符串(str):"hello"
  • 字典(dict):{"a": 1, "b": 2}(遍历键)
  • 集合(set):{1, 2, 3}

2.文件对象

打开的文件(TextIO):逐行遍历内容。

with open("file.txt") as f:
    for line in f:  # 逐行读取
        print(line)

3.生成器(Generator)

生成器函数(使用 yield):

def count(n):
    i = 0
    while i < n:
        yield i
        i += 1

for num in count(5):
    print(num)  # 输出 0,1,2,3,4

生成器表达式

squares = (x**2 for x in range(5))  # 可迭代

4.其他可迭代对象

  • range 对象:range(5)
  • 枚举对象(enumerate):enumerate(["a", "b"])
  • zip 对象:zip([1,2], [3,4])
  • 自定义可迭代类(需实现 __iter__()__getitem__()):
class MyIterable:
    def __iter__(self):
        return iter([1, 2, 3])

for item in MyIterable():
    print(item)  # 输出 1,2,3

二、不可迭代对象(Non-Iterable)

不可迭代对象通常是简单数据类型或未实现迭代协议的对象。例如:

1.基本数据类型

  • 整数(int):5
  • 浮点数(float):3.14
  • 布尔值(bool):True(虽然 boolint 的子类,但不可迭代)
  • NoneNone

2.函数、模块等

  • 函数对象def f(): passf 不可迭代
  • 模块import mathmath 不可迭代
  • 类对象:直接遍历类会报错(除非实现 __iter__)。

三、如何判断对象是否可迭代?

方法 1:尝试用iter()函数

如果对象不可迭代,会抛出 TypeError

obj = 123
try:
    iter(obj)  # 触发 TypeError
except TypeError:
    print("不可迭代")

方法 2:使用isinstance()和Iterable

更规范的检测方式:

from collections.abc import Iterable

print(isinstance([1,2,3], Iterable))  # True
print(isinstance(123, Iterable))      # False

四、易混淆点:可迭代对象 vs 迭代器

  • 可迭代对象(Iterable):可以被遍历(如列表、字符串)。
  • 迭代器(Iterator):必须实现 __next__() 方法,用于逐个返回元素(如生成器)。

转换关系

  • 可迭代对象 → 迭代器:通过 iter() 转换。
my_list = [1, 2, 3]
iterator = iter(my_list)  # 转为迭代器
print(next(iterator))      # 输出 1

五、示例代码

可迭代对象遍历

# 遍历字典的键值对
d = {"a": 1, "b": 2}
for key, value in d.items():
    print(key, value)

不可迭代对象错误

num = 100
for x in num:  # 触发 TypeError: 'int' is not iterable
    print(x)

总结

类型可迭代示例
列表、元组、字符串✔️[1, 2], "abc"
字典、集合✔️{"a": 1}, {1, 2}
生成器、文件对象✔️(x for x in range(3))
整数、浮点、None123, 3.14, None

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python将图片转换为字符画的方法

    Python将图片转换为字符画的方法

    这篇文章主要为大家详细介绍了Python将图片转换为字符画的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python实现PowerPoint演示文稿到图片的批量转换

    Python实现PowerPoint演示文稿到图片的批量转换

    PowerPoint演示文稿作为展示创意、分享知识和表达观点的重要工具,被广泛应用于教育、商务汇报及个人项目展示等领域,用Python代码可以高效地实现PowerPoint演示文稿到图片的批量转换,从而提升工作效率,文本将介绍如何使用Python实现PowerPoint演示文稿到图片的转换
    2024-06-06
  • Python实现元素等待代码实例

    Python实现元素等待代码实例

    这篇文章主要介绍了python实现元素等待代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 使用Python编写一个待办事项管理器(CLI 版)

    使用Python编写一个待办事项管理器(CLI 版)

    这篇文章主要为大家详细介绍了如何使用Python编写一个命令行待办事项管理器,可以把列表、字典、函数、文件操作、异常处理、标准库全部串联起来,成为一个可以每天使用的工具,感兴趣的小伙伴可以了解下
    2026-04-04
  • Python 实现数据结构中的的栈队列

    Python 实现数据结构中的的栈队列

    这篇文章主要介绍了Python 实现数据结构中的的栈,队列,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python实现调用另一个路径下py文件中的函数方法总结

    Python实现调用另一个路径下py文件中的函数方法总结

    这篇文章主要介绍了Python实现调用另一个路径下py文件中的函数方法,结合实例形式总结分析了Python针对不同文件夹中py文件调用操作的处理技巧与相关注意事项,需要的朋友可以参考下
    2018-06-06
  • 如何使用pytorch实现LocallyConnected1D

    如何使用pytorch实现LocallyConnected1D

    由于LocallyConnected1D是Keras中的函数,为了用pytorch实现LocallyConnected1D并在960×33的数据集上进行训练和验证,本文分步骤给大家介绍如何使用pytorch实现LocallyConnected1D,感兴趣的朋友一起看看吧
    2023-09-09
  • Python不通过调用init方法创建实例的完整指南

    Python不通过调用init方法创建实例的完整指南

    在Python面向对象编程中,__init__方法被视为标准的对象初始化机制,本文将深入探讨不调用__init__方法创建实例的各种技术,希望对大家有所帮助
    2025-10-10
  • 深入浅析Python传值与传址

    深入浅析Python传值与传址

    这篇文章主要介绍了Python传值与传址的相关知识,包括传值与传址的区别介绍,需要的朋友可以参考下
    2018-07-07
  • python列表字典排序的实现示例

    python列表字典排序的实现示例

    在Python中,对列表字典进行排序是一项常见的任务,本文主要介绍了python列表字典排序的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09

最新评论