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

在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)
  • 枚举对象(enumerateenumerate(["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. 基本数据类型
  • 整数(int5
  • 浮点数(float3.14
  • 布尔值(boolTrue(虽然 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循环、生成器、推导式等高级用法的关键! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值