当前位置: 首页 > news >正文

python中生成器

生成器是根据算法生成数据的一种机制,每次调用生成器只生成一个值,可以节省大量内存

生成器推导式

gg = ( i * 2 for i in  range(5))print(gg)print(next(gg)) # 0
print(next(gg)) # 2
print(next(gg)) # 4
print(next(gg)) # 6
print(next(gg)) # 8

yield关键字

def generater(num):for i in range(num):print("开始")yield iprint("生成完成")g = generater(2)print( next(g) )
print( next(g) )
print( next(g) )"""
开始
0
生成完成
开始
1
生成完成
Traceback (most recent call last):File "d:\Code\PythonProject\with\Generator2.py", line 11, in <module>print( next(g) )^^^^^^^
StopIteration
"""
def generater(num):for i in range(num):print("开始")yield iprint("生成完成")g = generater(5)for i in g:print(i)
"""
不会报错
"""

生成器的核心思想是​​惰性计算​​。它不会一次性把所有数据都计算出来并存储在内存中,而是“需要的时候才计算,每次只给你一个”。

假设有一个几十GB的日志文件,你需要逐行处理。

def read_file_to_list(filename):result = [] # 创建一个空列表with open(filename) as f:for line in f:result.append(line) # 将每一行都添加到列表中return result # 返回一个包含所有行的巨大列表data = read_file_to_list('huge_log.log') # 内存爆炸!
for line in data:process(line)

​问题​​:result列表会尝试将所有文件内容加载到内存中,如果文件极大,会消耗巨量内存甚至导致程序崩溃。

def read_file_by_line(filename):with open(filename) as f:for line in f: yield line # 关键在这里:使用yielddata_generator = read_file_by_line('huge_log.log') # 几乎不占内存
for line in data_generator: # 每次循环从文件里读一行到内存process(line)

1. 调用read_file_by_line时候,函数不会立即执行,而是返回一个生成器对象,此时文件一行都没读

2. 在for循环中,每次迭代会从生成器中请求一个值(一行内容)

3. 生成器函数从上次暂停的yield处继续执行,读取文件的下一行,yield返回这行数据,然后立即暂停。

http://www.dtcms.com/a/351219.html

相关文章:

  • 解决qt5.9.4和2015配置xilinx上位机报错问题
  • 学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
  • 【软考论文】论静态测试方法及其应用
  • 系统设计中的幂等性
  • QPSK调制解调通信仿真程序调试与分析
  • UbuntuV24.04安装mpdecimal库(libmpdec),从源码编译
  • 广告推荐模型3:域感知因子分解机(Field-aware Factorization Machine, FFM)
  • 机器人 - 无人机基础(6) - 状态估计(ing)
  • 1 线性模型
  • 支持向量机(SVM)
  • Java 大视界 -- Java 大数据机器学习模型在金融市场波动预测与资产配置动态调整中的应用
  • 网站开发用什么语言好
  • CentOS扩容非LVM分区
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • Redis--2
  • 在 TencentOS 3 上部署 OpenTenBase:从底层原理到生产级实践的深度指南
  • DBeaver下载安装使用
  • 支持向量机(SVM)算法总结
  • 大数据毕业设计选题:基于大数据的用户贷款行为数据分析系统Spark SQL核心技术
  • 迷你版Shell:源码详解与行为解析
  • 【Linux 34】Linux-主从复制
  • 嵌入式学习日记(34)HTTP协议
  • 支持向量机核心知识总结
  • 读懂支持向量机(SVM)
  • CI/CD 全链路实践:从 Git 基础到 Jenkins + GitLab 企业级部署
  • Flask 之上下文详解:从原理到实战
  • IDEA-Maven和Tomcat乱码问题
  • 2025改版:npm 新淘宝镜像域名地址
  • Uniapp(Vue2)Api请求封装
  • 企业级集群部署gpmall商城:MyCat+ZooKeeper+Kafka 环境部署与商城应用上线流程