Myself
  • 1.Python历史
  • 2.安装Python
    • 2.1.Python解释器
  • 3.第一个Python程序
    • 3.1.使用文本编辑器
    • 3.2.输入和输出
  • 4.Python基础
    • 4.1.数据类型和变量
    • 4.2.字符串和编码
    • 4.3.使用list和tuple
    • 4.4.条件判断
    • 4.5.模式匹配
    • 4.6.循环
    • 4.7.使用dict和set
  • 5.函数
    • 5.1.调用函数
    • 5.2.定义函数
    • 5.3.函数的参数
    • 5.4.递归函数
  • 6.高级特性
    • 6.1.切片
    • 6.2.迭代
    • 6.3.列表生成式
    • 6.4.生成器
    • 6.5.迭代器
  • 7.函数式编程
    • 7.1.高阶函数
      • 7.1.1.map/reduce
      • 7.1.2.filter
      • 7.1.3.sorted
    • 7.2.返回函数
    • 7.3.匿名函数
    • 7.4.装饰器
    • 7.5.偏函数
  • 8.模块
    • 8.1.使用模块
    • 8.2.安装第三方模块

搜索结果

没有相关内容~~

6.5.迭代器

最新修改于 2025-08-07 17:00
我们已经知道,可以直接作用于 `for`循环的数据类型有以下几种: 一类是集合数据类型,如 `list`、`tuple`、`dict`、`set`、`str`等; 一类是 `generator`,包括生成器和带 `yield`的generator function。 这些可以直接作用于 `for`循环的对象统称为可迭代对象:`Iterable`。 可以使用 `isinstance()`判断一个对象是否是 `Iterable`对象: ```plain >>> from collections.abc import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False ``` []( "复制到剪贴板") 而生成器不但可以作用于 `for`循环,还可以被 `next()`函数不断调用并返回下一个值,直到最后抛出 `StopIteration`错误表示无法继续返回下一个值了。 可以被 `next()`函数调用并不断返回下一个值的对象称为迭代器:`Iterator`。 可以使用 `isinstance()`判断一个对象是否是 `Iterator`对象: ```plain >>> from collections.abc import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False ``` []( "复制到剪贴板") 生成器都是 `Iterator`对象,但 `list`、`dict`、`str`虽然是 `Iterable`,却不是 `Iterator`。 把 `list`、`dict`、`str`等 `Iterable`变成 `Iterator`可以使用 `iter()`函数: ```plain >>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True ``` []( "复制到剪贴板") 你可能会问,为什么 `list`、`dict`、`str`等数据类型不是 `Iterator`? 这是因为Python的 `Iterator`对象表示的是一个数据流,`Iterator`对象可以被 `next()`函数调用并不断返回下一个数据,直到没有数据时抛出 `StopIteration`错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 `next()`函数实现按需计算下一个数据,所以 `Iterator`的计算是惰性的,只有在需要返回下一个数据时它才会计算。 `Iterator`甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。 ### 参考源码 [do\_iterator.py](https://liaoxuefeng.com/books/python/advanced/iterator/do_iterator.py) ### 小结 凡是可作用于 `for`循环的对象都是 `Iterable`类型; 凡是可作用于 `next()`函数的对象都是 `Iterator`类型,它们表示一个惰性计算的序列; 集合数据类型如 `list`、`dict`、`str`等是 `Iterable`但不是 `Iterator`,不过可以通过 `iter()`函数获得一个 `Iterator`对象。 Python的 `for`循环本质上就是通过不断调用 `next()`函数实现的,例如: ```python for x in [1, 2, 3, 4, 5]: pass ``` []( "复制到剪贴板") 实际上完全等价于: ```python # 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True: try: # 获得下一个值: x = next(it) except StopIteration: # 遇到StopIteration就退出循环 break ```
开始访问