【python】python进阶——生成器

目录

一、生成器介绍

1.1 生成器与迭代器的关系

1.2 生成器与return比较

二、创建生成器

方法1: 生成器函数

方法2: 生成器表达式

三、生成器的实际应用场景

3.1 处理大型文件

3.2 生成无限序列

3.3 数据管道处理

四、生成器的高级用法

4.1 使用send()方法传递值

4.2 生成器委托(yield from)

五、生成器的特点

总结


一、生成器介绍

        生成器是Python中一种特殊的迭代器,关键字是yield,它允许你按需生成值,而不是一次性计算并存储所有值。这种"惰性计算"的特性使得生成器在处理大数据集或无限序列时非常高效。

1.1 生成器与迭代器的关系

        生成器是一种特殊的迭代器,具有迭代器的所有特性,但更简洁。生成器自动实现了迭代器协议(即__iter__()和__next__()方法),并且状态挂起和恢复是自动的。

        迭代器是一个可以记住遍历位置的对象,它从集合的第一个元素开始访问,直到所有元素被访问完结束,只能往前不会后退。生成器是使用yield表达式来生成值的函数,每次调用next()时,生成器会从上次yield的位置继续执行,直到遇到yield或return(包括函数结束)为止。

        生成器是迭代器的一种,但迭代器不一定是生成器。

  • 迭代器可以通过实现类的__iter__和__next__方法来创建
  • 生成器通过函数和yield来创建。

1.2 生成器与return比较

  • 普通函数使用return返回结果后,其执行状态就会被销毁。
  • 生成器使用yield关键字,在返回值的同时会保存当前执行状态,下次调用时可以从上次暂停的地方继续执行。

      通俗的说,yield就是和return一样执行到该位置时返回变量值,但函数不会结束退出,而是暂停在这个位置挂起任务,等待下一次next()调用时,从暂停的位置继续执行。

二、创建生成器

方法1: 生成器函数

使用yield关键字代替return的函数就是生成器函数:

def simple_generator():yield 1yield 2yield 3# 使用生成器
gen = simple_generator()
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
print(next(gen))  # 输出: 3

方法2: 生成器表达式

类似列表推导式,但使用圆括号:

# 列表推导式 - 立即计算所有值
squares_list = [x*x for x in range(5)]  # [0, 1, 4, 9, 16]# 生成器表达式 - 按需生成值
squares_gen = (x*x for x in range(5))
print(next(squares_gen))  # 输出: 0
print(next(squares_gen))  # 输出: 1

三、生成器的实际应用场景

3.1 处理大型文件

def read_large_file(file_path):"""逐行读取大文件,避免内存溢出"""with open(file_path, 'r') as file:for line in file:yield line.strip()# 使用生成器处理GB级文件
for line in read_large_file('huge_file.txt'):process_line(line)  # 每次只处理一行,不占用大量内存

3.2 生成无限序列

def fibonacci():"""生成无限斐波那契数列"""a, b = 0, 1while True:yield aa, b = b, a + b# 获取前10个斐波那契数
fib_gen = fibonacci()
first_10 = [next(fib_gen) for _ in range(10)]
print(first_10)  # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

3.3 数据管道处理

def numbers():for i in range(10):yield idef square(nums):for num in nums:yield num ** 2def even_filter(nums):for num in nums:if num % 2 == 0:yield num# 构建数据处理管道
result = even_filter(square(numbers()))
print(list(result))  # [0, 4, 16, 36, 64]

四、生成器的高级用法

4.1 使用send()方法传递值

def generator_with_send():value = yield "开始"while True:value = yield f"收到: {value}"gen = generator_with_send()
print(next(gen))      # 输出: "开始"
print(gen.send("你好"))  # 输出: "收到: 你好"
print(gen.send("世界"))  # 输出: "收到: 世界"

4.2 生成器委托(yield from)

def sub_generator():yield from range(3)yield from ['a', 'b', 'c']for item in sub_generator():print(item)  # 输出: 0, 1, 2, 'a', 'b', 'c'

五、生成器的特点

优势:

  • 内存效率:一次只产生一个值,不占用大量内存

  • 惰性计算:需要时才计算,避免不必要的运算

  • 代码简洁:用简洁的语法表达复杂的迭代逻辑

  • 流水线处理:可以构建高效的数据处理管道

缺点:

  • 生成器只能迭代一次,迭代完后需要重新创建

  • 不适合需要随机访问的场景

  • 调试可能比普通函数复杂

总结

        生成器是Python中强大而高效的工具,特别适合处理大数据流、构建数据处理管道和创建无限序列。通过掌握生成器,你可以编写出更加内存友好和Pythonic的代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94983.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Pytorch】生成对抗网络实战

GAN框架基于两个模型的竞争,Generator生成器和Discriminator鉴别器。生成器生成假图像,鉴别器则尝试从假图像中识别真实的图像。作为这种竞争的结果,生成器将生成更好看的假图像,而鉴别器将更好地识别它们。 目录 创建数据集 定…

Java基础第7天总结(代码块、内部类、函数式编程)

代码块静态代码块:有static修饰,属于类,与类一起优先加载,自动执行一次实例代码块:无static修饰,属于对象,每次创建对象时,都会优先执行一次。package com.itheima.code;import java…

文献综述写作指南:从海量文献到逻辑闭环的实战模板

文献综述往往是学术写作的“第一关难题”:面对成百上千篇文献,如何避免“简单罗列”的陷阱,梳理出有逻辑、有洞见的论述体系?本文结合学术写作实践,总结出一套模块化的文献综述“实战模板”,通过结构化方法…

CuTe C++ 简介01,从示例开始

这里先仅仅关注 C 层的介绍,python DSL 以后再说。在 ubuntu 22.04 X64 中,RTX 50801. 环境搭建1.1 安装 cuda1.2 下载源码git clone https://github.com/NVIDIA/cutlass.git1.3 编译mkdir build/ cmake .. -DCUTLASS_NVCC_ARCHS"120" -DCMAK…

Python实现异步多线程Web服务器:从原理到实践

目录Python实现异步多线程Web服务器:从原理到实践引言第一章:Web服务器基础1.1 Web服务器的工作原理1.2 HTTP协议简介1.3 同步 vs 异步 vs 多线程第二章:Python异步编程基础2.1 异步I/O概念2.2 协程与async/await2.3 事件循环第三章&#xff…

Deep Think with Confidence:llm如何进行高效率COT推理优化

1. 引言:大模型的推理解码优化 大型语言模型(LLM)在处理数学、编码等复杂推理任务时,一种强大但“耗能巨大”的技术是self-consistency,也称并行思考(parallel thinking)。其核心思想是让模型对同一个问题生成多条不同的“思考路径”(reasoning traces),然后通过多数…

vscode克隆远程代码步骤

一、直接使用VsCode1.复制git的https链接代码2.在vscode中点击 代码管理-克隆仓库3.粘贴(在git里面复制的https链接)4.选择需要存储的文件位置5.确认6.代码克隆成功二、使用命令行克隆1.确定文件放置位置,右键2.复制git的https链接代码3.粘贴…

spi总线

一、介绍SPI总线(Serial Peripheral Interface,串行外设接口)是一种高速全双工同步串行通信总线,核心通过“主从架构同步时钟”实现设备间数据传输,因结构简单、速率高,广泛用于MCU与传感器、存储芯片、显示…

COLA:大型语言模型高效微调的革命性框架

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 COLA技术概述 COLA(Chain of LoRA)是一种创…

数据结构与算法:线段树(三):维护更多信息

前言 这次的题思维上倒不是很难&#xff0c;就是代码量比较大。 一、开关 洛谷的这种板子题写起来比cf顺多了&#xff08;&#xff09; #include <bits/stdc.h> using namespace std;typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll&…

【LeetCode_27】移除元素

刷爆LeetCode系列LeetCode27题&#xff1a;github地址前言题目描述题目思路分析代码实现算法代码优化LeetCode27题&#xff1a; github地址 有梦想的电信狗 前言 本文用C实现LeetCode 第27题 题目描述 题目链接&#xff1a;https://leetcode.cn/problems/remove-element/ …

C++11语言(三)

一、引言上期我们介绍了C11的大部分特性。C11的初始化列表、auto关键字、右值引用、万能引用、STL容器的的emplace函数。要补充的是右值引用是不能取地址的&#xff0c;我们程序员一定要遵守相关的语法。操作是未定义的很危险。二、 仿函数和函数指针我们先从仿函数的形…

性能优化三剑客:`memo`, `useCallback`, `useMemo` 详解

性能优化三剑客&#xff1a;memo, useCallback, useMemo 详解 作者&#xff1a;码力无边各位React性能调优师&#xff0c;欢迎来到《React奇妙之旅》的第十二站&#xff01;我是你们的伙伴码力无边。在之前的旅程中&#xff0c;我们已经掌握了如何构建功能丰富的组件&#xff0…

好用的电脑软件、工具推荐和记录

固态硬盘读写测试 AS SSD Benchmark https://gitee.com/qlexcel/common-resource-backup/blob/master/AS%20SSD%20Benchmark.exe 可以测试SSD的持续读写、4K随机读写等性能。也可以测试HDD的性能。 操作非常简单&#xff0c;点击Start(开始)即可测试。 体积小&#xff0c;免安…

Spring Task快速上手

一. 介绍Spring Task 是Spring框架提供的任务调度工具&#xff0c;可以按照约定的时间自动执行某个代码逻辑&#xff0c;无需依赖额外组件&#xff08;如 Quartz&#xff09;&#xff0c;配置简单、使用便捷&#xff0c;适合处理周期性执行的任务&#xff08;如定时备份数据、定…

函数(2)

6.定义函数的终极绝杀思路&#xff1a;三个问题&#xff1a;1.我定义函数&#xff0c;是为了干什么事情 函数体、2.我干完这件事&#xff0c;需要什么才能完成 形参3.我干完了&#xff0c;调用处是否需要继续使用 返回值类型需要继续使用 必须写不需要返回 void小程序#include …

BGP路由协议(一):基本概念

###BGP概述 BGP的版本&#xff1a; BGP-1 RFC1105BGP-2 RFC1163BGP-3 RFC1267BGP-4 RFC1771 1994年BGP-4 RFC4271 2006年 AS Autonomous System 自治系统&#xff1a;由一个单一的机构或者组织所管理的一系列IP网络及其设备所构成的集合 根据工作范围的不同&#xff0c;动态路…

mit6.031 2023spring 软件构造 笔记 Testing

当你编码时&#xff0c;目标是使程序正常工作。 但作为测试设计者&#xff0c;你希望让它失败。 这是一个微妙但重要的区别。 为什么软件测试很难&#xff1f; 做不到十分详尽&#xff1a;测试一个 32 位浮点乘法运算 。有 2^64 个测试用例&#xff01;随机或统计测试效果差&am…

【Unity开发】Unity核心学习(三)

四、三维模型导入相关设置 1、Model模型页签&#xff08;1&#xff09;场景相关&#xff08;2&#xff09;网格相关&#xff08;3&#xff09;几何体相关2、Rig操纵&#xff08;骨骼&#xff09;页签 &#xff08;1&#xff09;面板基础信息&#xff08;i&#xff09;None&…

C#语言入门详解(17)字段、属性、索引器、常量

C#语言入门详解&#xff08;17&#xff09;字段、属性、索引器、常量前言一、字段 Field二、属性三、索引器四、常量内容来自刘铁猛C#语言入门详解课程。 参考文档&#xff1a;CSharp language specification 5.0 中文版 前言 类的成员是静态成员 (static member) 或者实例成…