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

作者:

文章目录
  • 可迭代对象需要实现 __iter__() 方法,或支持通过索引访问的 __getitem__() 方法。常见类型包括:
  • 不可迭代对象通常是简单数据类型或未实现迭代协议的对象。例如:
  • 可迭代对象(Iterable):可以被遍历(如列表、字符串)。 迭代器(Iterator):必须实现 __next__() 方法,用于逐个返回元素(如生成器)。
  • 类型 可迭代 示例 列表、元组、字符串 ✔️ [1, 2], "abc" 字典、集合 ✔️ {"a": 1}, {1, 2} 生成器、文件对象 ✔️ (x for x in range(3)) 整数、浮点、None ❌ 123, 3.14, None 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: python3 cookbook解压可迭代对象赋值给多个变量的问题及解决方案 python 遍历可迭代对象的实现方法 python可迭代类型遍历过程中数据改变会不会报错 一文带你解密Python可迭代对象的排序问题 Python中for循环可迭代对象迭代器及生成器源码学习 一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程
  • 目录
    • 一、可迭代对象(Iterable)
      • 1.基础容器类型
      • 2.文件对象
      • 3.生成器(Generator)
      • 4.其他可迭代对象
    • 二、不可迭代对象(Non-Iterable)
      • 1.基本数据类型
      • 2.函数、模块等
    • 三、如何判断对象是否可迭代?
      • 方法 1:尝试用iter()函数
      • 方法 2:使用isinstance()和Iterable
    • 四、易混淆点:可迭代对象 vs 迭代器
      • 转换关系
    • 五、示例代码
      • 可迭代对象遍历
      • 不可迭代对象错误
    • 总结

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

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

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

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

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

      生成器函数(使用 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))  # 可迭代
      

      • 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
      

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

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

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

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

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

      更规范的检测方式:

      from collections.abc import Iterable
      
      print(isinstance([1,2,3], Iterable))  # True
      print(isinstance(123, Iterable))      # False
      

      • 可迭代对象(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))
      整数、浮点、None 123, 3.14, None

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。

      您可能感兴趣的文章:

      • python3 cookbook解压可迭代对象赋值给多个变量的问题及解决方案
      • python 遍历可迭代对象的实现方法
      • python可迭代类型遍历过程中数据改变会不会报错
      • 一文带你解密Python可迭代对象的排序问题
      • Python中for循环可迭代对象迭代器及生成器源码学习
      • 一文搞懂​​​​​​​python可迭代对象,迭代器,生成器,协程

      站内搜索