乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

      • Python之链表
      • Python 之类的初识
      • Python之函数式编程
      • Python之匿名函数
      • Python之自定义函数
      • Python之异常处理
      • Python之条件与循环
      • Python之列表生成式
      • Python之生成器
      • Python之装饰器
      • Python之迭代器
      • Python之进程、线程、协程
      • Python之深浅拷贝
      • Python之反射
      • Python之并发编程
      • Python之垃圾回收机制
      • Python之断言assert
      • Python之上下文管理器和with语句
      • Python中JSON的对应关系
      • Python之单例模式
    • Django框架

    • 其他

  • DevOps

  • 专栏
  • Python
  • 基础知识
乔克
2025-07-19

Python之生成器

在 python 中使用 yield 的函数称为生成器。如下:

def count(n):
    while n > 0:
        yield n
        n -= 1
1
2
3
4

跟普通函数不同的是生成器返回的是一个迭代器函数,只能用于迭代操作,可以说生成器就是一个迭代器。在调用生成器运行的过程中,每次运行到 yield 会暂停并保存所有的运行信息并返回 yield 的值,在下次调用 next()方法的时候当前的位置继续运行。

例如:

## 用普通函数创建斐波拉契函数
>>> def fib1(n):
...     a, b, count = 0, 1, 0
...     while count < n:
...             print(a)
...             a, b = b, a+b
...             count += 1
...
>>> fib1(10)
0
1
1
2
3
5
8
13
21
34
>>>

## 用生成器创建
>>> def fib2(n):
...     a,b,count = 0,1,0
...     while count<n:
...             yield a
...             a,b=b,a+b
...             count += 1
...
>>> for i in fib2(10):
...     print(i)
...
0
1
1
2
3
5
8
13
21
34
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中 return 某个值,包括 None 值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的 return,表示结束该语句。

通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:

def read_file(path):
    size = 1024
    with open(path,'r') as f:
        while True:
            block = f.read(SIZE)
            if block:
                yield block
            else:
                return
1
2
3
4
5
6
7
8
9

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Python之列表生成式
Python之装饰器

← Python之列表生成式 Python之装饰器→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式