ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • Python笔记

    • 基础知识

      • 常见规范与运行方式
      • 变量与垃圾回收机制
      • 输入与格式化输出
      • 运算符
      • 流程控制语句
      • 浅拷贝和深拷贝
      • 常用数据类型与分类
      • 数据类型方法
      • 字符编码
      • 文件操作
      • 函数与参数
      • 命名空间与作用域
      • 闭包函数与装饰器
      • 迭代器与生成器
        • 迭代器
          • 介绍
          • 作用
          • 可迭代对象
          • 迭代对象
          • 缺点
          • 使用
        • 生成器
          • 定义生成器
          • 调用生成器
      • 三元表达式与生成式
      • 函数递归
      • 面向过程式和函数式编程
      • 模块与包
      • 程序设计目录参考
      • 常用内置模块或函数
      • 序列化和猴子补丁
      • 日志模块-logging
    • 类与面向对象

    • 并发编程

    • Web编程

    • 模块笔记

    • 其他

  • C笔记

  • C++笔记

  • Arduino笔记

  • Dev
  • Python笔记
  • 基础知识
Hoshinozora
2023-02-15
目录

迭代器与生成器

# 迭代器

# 介绍

迭代器指的是迭代取值的工具。迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,每次一重复与上一次有关联。

单纯的循环重复并不是迭代。

# 作用

右侧方式取值只适用于有索引的数据类型,例如:列表、字符串、元组。

为了解决索引迭代取值的局限性,Python提供了一种不依赖于索引的取值方式,就是迭代器。

# 可迭代对象

可迭代对象是可以转换为迭代器对象的对象。内置有__iter__方法的数据类型对象,都可以称之为可迭代对象。

例如:字符串、列表、元组、字典、集合、文件等

调用可迭代对象下的.__iter__()方法,会将可迭代对象转换为迭代器对象并返回。

# 迭代对象

将可迭代对象转换为迭代器对象后,就可以调用迭代器的内置方法,对迭代器对象进行迭代取值,取出后下次调用同样方法取值会取出下一个,实现不依赖于索引取值。

在一个迭代器的值被取干净的情况下,再去取值就会报错StopIteration。

# 缺点

迭代器不如索引取值灵活,只能按既定顺序取值,并且迭代器有生命周期,取完即完结。

# 使用

迭代器对象是内置有__next__、__iter__方法的对象。

迭代器对象.__next__() 得到迭代器的下一个值。

同等于 next(迭代器对象)

迭代器对象.__iter__() 得到迭代器本身。

同等于 iter(可迭代对象/迭代器对象)

a = ["a", "b", "c"]

# for循环。
for i in a:
    print(i)

# while配合迭代器实现for循环同样的效果。
a_iterator = a.__iter__()
while True:
    try:
        i = a_iterator.__next__()
        print(i)
    except StopIteration:
        break
1
2
3
4
5
6
7
8
9
10
11
12
13
14

for循环就是基于迭代器进行迭代取值的,其循环原理是:

  1. 调用__iter__()的到一个迭代对象。

  2. 迭代器对象.__next__()拿到一个返回值,然后赋值给变量。

  3. 循环步骤2,直到__next__()方法抛出StopIteration异常,for循环捕捉到异常然后结束循环。

# 生成器

生成器即自定义迭代器。

# 定义生成器

yield 返回值 定义生成器需要使用yield关键字。

在函数内一旦存在yield关键字,那么调用函数时,就不会执行函数体代码,而是返回一个生成器对象。生成器对象可以挂起函数并保存函数的运行状态,能够返回多次值。

在生成器函数被迭代时,每迭代一次就会继续运行直到碰到下一个yield处并返回值,直到没有yield返回值可以返回时,抛出异常StopIteration。

yield同return一样可以返回值,不过return的返回值只能获取一次,而yield则可以通过迭代来再次获取返回值。

# 通过生成器定义一个range功能
def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step
1
2
3
4
5

# 调用生成器

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step

# 调用生成器函数来创建迭代器
r = my_range(1, 3)
# 对其进行迭代
while True:
    try:
        i = r.__next__()
        print(i)
    except StopIteration:
        break
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#迭代器#生成器
闭包函数与装饰器
三元表达式与生成式

← 闭包函数与装饰器 三元表达式与生成式→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式