Python 生成器和迭代器高级应用指南

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程 本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。 阅读详情

Python 生成器和迭代器高级应用指南

1. 迭代器基础

迭代器是 Python 中一种特殊的对象,它允许我们遍历容器中的元素。

# 迭代器协议
class Countdown:
    def __init__(self, start):
        self.start = start
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.start <= 0:
            raise StopIteration
        self.start -= 1
        return self.start + 1

# 使用迭代器
for i in Countdown(5):
    print(i)
# 输出: 5 4 3 2 1

2. 生成器基础

生成器是一种特殊的迭代器,它使用 yield 语句来生成值。

# 生成器函数
def countdown(start):
    while start > 0:
        yield start
        start -= 1

# 使用生成器
for i in countdown(5):
    print(i)
# 输出: 5 4 3 2 1

3. 高级迭代器技巧

3.1 自定义迭代器

class Fibonacci:
    def __init__(self, n):
        self.n = n
        self.a, self.b = 0, 1
        self.count = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.count >= self.n:
            raise StopIteration
        self.count += 1
        value = self.a
        self.a, self.b = self.b, self.a + self.b
        return value

# 使用自定义迭代器
for i in Fibonacci(10):
    print(i, end=" ")
# 输出: 0 1 1 2 3 5 8 13 21 34

3.2 迭代器工具

Python 提供了一些内置的迭代器工具,如 itertools 模块。

import itertools

# 无限迭代器
counter = itertools.count(1)
for i in range(5):
    print(next(counter))
# 输出: 1 2 3 4 5

# 循环迭代器
cycle = itertools.cycle(['A', 'B', 'C'])
for i in range(5):
    print(next(cycle))
# 输出: A B C A B

# 重复迭代器
repeat = itertools.repeat('Hello', 3)
for item in repeat:
    print(item)
# 输出: Hello Hello Hello

3.3 生成器表达式

生成器表达式是一种简洁的生成器创建方式,类似于列表推导式。

# 生成器表达式
gen = (x ** 2 for x in range(10))
for item in gen:
    print(item)
# 输出: 0 1 4 9 16 25 36 49 64 81

# 与列表推导式的比较
list_comp = [x ** 2 for x in range(10)]  # 立即创建列表
gen_exp = (x ** 2 for x in range(10))    # 按需生成值

4. 高级生成器技巧

4.1 生成器流水线

生成器可以连接成流水线,处理数据。

def read_file(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield line.strip()

def filter_lines(lines, keyword):
    for line in lines:
        if keyword in line:
            yield line

def process_lines(lines):
    for line in lines:
        yield line.upper()

# 流水线处理
lines = read_file('data.txt')
filtered = filter_lines(lines, 'Python')
processed = process_lines(filtered)

for line in processed:
    print(line)

4.2 协程

生成器可以用作协程,接收发送的值。

def echo():
    while True:
        received = yield
        print(f"Received: {received}")

# 使用协程
coro = echo()
next(coro)  # 启动协程
coro.send("Hello")
coro.send("World")
# 输出:
# Received: Hello
# Received: World

4.3 生成器状态管理

生成器可以保持状态,用于复杂的计算。

def accumulator():
    total = 0
    while True:
        value = yield total
        if value is None:
            break
        total += value

# 使用带状态的生成器
acc = accumulator()
next(acc)  # 启动生成器
print(acc.send(1))  # 输出: 1
print(acc.send(2))  # 输出: 3
print(acc.send(3))  # 输出: 6

5. 实际应用场景

5.1 处理大文件

生成器可以用于处理大文件,避免一次性加载全部内容到内存。

def read_large_file(filename, chunk_size=1024):
    with open(filename, 'r') as f:
        while True:
            chunk = f.read(chunk_size)
            if not chunk:
                break
            yield chunk

# 处理大文件
for chunk in read_large_file('large_file.txt'):
    # 处理 chunk
    print(len(chunk), end=" ")

5.2 数据转换

生成器可以用于数据转换,按需处理数据。

def transform_data(data):
    for item in data:
        # 转换逻辑
        transformed = item * 2
        yield transformed

# 转换数据
data = [1, 2, 3, 4, 5]
transformed = transform_data(data)
for item in transformed:
    print(item)
# 输出: 2 4 6 8 10

5.3 无限序列

生成器可以用于生成无限序列。

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

# 使用无限序列
seq = infinite_sequence()
for i in range(5):
    print(next(seq))
# 输出: 0 1 2 3 4

5.4 并行处理

生成器可以与 concurrent.futures 结合,实现并行处理。

import concurrent.futures

def process_item(item):
    # 处理逻辑
    return item * 2

def process_items(items):
    with concurrent.futures.ThreadPoolExecutor() as executor:
        yield from executor.map(process_item, items)

# 并行处理
items = [1, 2, 3, 4, 5]
for result in process_items(items):
    print(result)
# 输出: 2 4 6 8 10

6. 最佳实践

  1. 使用生成器处理大文件:对于大文件,使用生成器可以避免内存溢出。
  2. 使用生成器表达式:对于简单的生成器,使用生成器表达式可以使代码更简洁。
  3. 使用 itertools 模块:对于常见的迭代器操作,使用 itertools 模块可以提高代码的可读性和性能。
  4. 使用生成器流水线:对于复杂的数据处理,使用生成器流水线可以使代码更模块化。
  5. 注意生成器的状态:生成器是有状态的,一旦遍历完成,就不能再次使用。
  6. 测试生成器:确保生成器在各种情况下都能正常工作。
  7. 文档化生成器:为生成器添加文档字符串,说明其功能和用法。

7. 总结

生成器和迭代器是 Python 中强大的特性,它们允许我们以一种高效、内存友好的方式处理数据。通过掌握生成器和迭代器的高级应用,我们可以编写更加高效、可维护的代码。

在实际应用中,生成器和迭代器可以用于处理大文件、数据转换、无限序列、并行处理等多种场景,大大提高代码的效率和可维护性。

希望本文对你理解和应用 Python 生成器和迭代器有所帮助!

基于VisionMaster实现数据实时存储至MySQL (二) 摘要:之前的分享主要聚焦于简单的一维数据实时存储。但在做缺陷检测项目时,情况往往更加复杂:一张检测图像中可能同时存在多个缺陷,每个缺陷都有一组独立的核心参数(如质心、长短轴、面积等)。如何在 MySQL 中记录这些成组出现的缺陷数据,而不只是简单的单条记录? 阅读详情

相关推荐

Android Studio安装常见问题详解——Android Emulator Hypervisor Driver for AMD Processors installation failed.

目录一、问题描述二、解决方案2.1 开启CPU虚拟化2.2 禁用Hyper-V2.3 使用管理员命令行在驱动程序包中执行“silent_install.bat” 一、问题描述 新买的AMD轻薄本,在安装Android Studio时遇到问题: Android Emulator Hypervisor Driver for AMD Processors installation failed. 笔记本配置为: 二、解决方案 2.1 开启CPU虚拟化 设置虚拟化的步骤这里不进行详细介绍了。如果需要,可以自行百

Wendy的博客 4万+

python迭代器和生成器

帮助大家深入了解迭代器与生成器

qq_52758588的博客 1万+

多尺度Transformer+特征融合新范式,算力减半精度猛增

在大模型时代,多尺度特征融合与Transformer架构的结合正成为研究热点。多尺度特征融合能够捕捉数据在不同尺度上的关键信息,而Transformer架构凭借其强大的并行处理能力和对长距离依赖的建模能力,为复杂数据处理提供了新的思路。这种结合在处理多模态数据时展现出巨大潜力。

Tulingxueshu的博客 1061

Python 迭代器和生成器:深入理解与应用

数据,避免一次性生成大量数据占用过多内存。理解和掌握迭代器与生成器对于编写高效、简洁且易于维护的 Python 代码至关重要。可以用来创建生成器对象,它能够在需要时生成数据,而不是一次性生成所有数据并存储在内存中。,它使用更简洁的语法来创建迭代器。生成器函数(使用yield。提供了高效、灵活且优雅的方式。的访问方式,而无需暴露容器的内部结构。是两个非常重要的概念,它们为处理。任何包含这两个方法的对象都可以。(如列表、元组、字典等)时提供。容器中的元素,而生成器则可以。在 Python 编程中,

2301_81718046的博客 2582

J1939协议实用指南与J1939数据记录方案

“没错,这是一份SAE J1939简单、实用指南。”—虹科 **开篇:**在这篇介绍中,我们介绍了J1939协议的基本知识,其中包括PGN和SPN。因为这是一篇偏向应用的简介,所以您还将会学习到如何通过DBC文件解码J1939数据、如何记录J1939、典型的应用案例和实用技巧。下面,来了解下这份简单易懂的J1939介绍吧~ 什么是J1939? 简而言之,SAE J1939其实是一套标准,重型车辆ECU间就是按照这套标准在CAN总线上进行通信的。当今大多数车辆都通过CAN(Controller Area Ne

1万+

dify工作流的原理

摘要: Dify 工作流是一个基于有向无环图(DAG)的智能任务编排系统,支持多节点(如LLM调用、API工具、条件分支等)的可视化拖拽与流程编排。其核心原理包括执行引擎(解析DAG并管理节点依赖)、上下文变量传递(类Jinja模板的变量引用机制)和状态持久化(存储执行日志与中间结果)。工作流通过事件驱动执行,支持异步任务调度,并与RAG知识库、LLM服务等模块深度集成,最终可发布为API或对话应用。技术栈基于Python(FastAPI+Celery)和PostgreSQL,实现低代码化的AI应用开发。

nbspzs的专栏 2189

Python学习之-迭代器和生成器

在Python中,迭代器(Iterator)和生成器(Generator)是实现迭代协议的对象,用于遍历集合中的元素。它们之间有联系,但也有一些关键的差异。迭代器和生成器都允许你对一系列数据进行迭代,但生成器提供了一种更简便,内存高效的方式来实现迭代器的功能。当你需要一个简单的迭代器并且不想实现类时,生成器是一个非常好的选择。适用场合包括处理大数据流、文件处理、网络通信等等。

Summer的博客 3407

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

python生成器和迭代器区别

一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小括号就创建了一个生成器 list = [i for i in range(10)] print(type(list)) # <class 'list'> ...

李俊的博客 3789

人工智能技术基础系列之:迁移学习

作者:禅与计算机程序设计艺术 1.背景介绍 随着深度学习和神经网络的快速发展,越来越多的应用场景需要处理大量的数据和复杂的任务。然而,由于计算资源、存储空间等条件的限制,传统的人工智能方法往往不能满足实际需求。因此,为了提高效率和降低成本,研究人员提出了迁移学习的概念。本篇文章将详细介绍迁移学习的基

AI天才研究院 700

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

python 迭代器和生成器

迭代器是一个实现了迭代器协议__iter__():返回迭代器自身(必须);__next__():返回序列中的下一个元素;若无更多元素,抛出异常。通过类实现__iter__()和__next__()self.current = start # 当前迭代值self.end = end # 迭代终止条件return self # 必须返回迭代器对象本身raise StopIteration # 无元素时抛出异常,终止迭代return res# 使用迭代器。

hello world 7222

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的田间杂草检测系统(深度学习模型+UI界面+Python代码+训练数据集)

精准农业是现代农业发展的核心方向,其中杂草的实时、准确检测是减少除草剂滥用、实现变量喷施的关键技术瓶颈。本文详细阐述了一套完整的、基于YOLO(You Only Look Once)系列目标检测算法的田间杂草检测系统。系统覆盖从模型对比选型(YOLOv5, YOLOv6, YOLOv7, YOLOv8)、自定义数据集构建与标注、模型训练与优化,到最终构建基于PyQt5/FastAPI/Gradio的可视化UI界面的全流程。本文提供了完整的Python代码、项目结构、训练技巧及公开数据集指引,旨在为农

YOLO 358

python 生成器和迭代器

生成器和迭代器,斐波那契数列

m0_51736952的博客 2704

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【python高级用法】迭代器、生成器、装饰器、闭包

迭代器、生成器、装饰器、闭包

qq_44091004的博客 1932

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Python 生成器和迭代器详解

迭代器 在python中列表(list)、元组(tuple)、字典(dict)、集合(set)这些数据容器都有一个共同的特性,它们都支持使用for循环遍历容器中存储的元素,都是可迭代的也成为迭代器。 迭代时访问集合元素的一种非常强大的方式。迭代器可以记住遍历位置,不会对例如列表这样的数据容器一次性全部生成,而是等到用的时候才会去生成。我们也可以创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象 如果要自定义实现一个迭代器,则类中必须实现以下两个方法: __next(sel

weixin_47906106的博客 2880

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python 迭代器和生成器

Python 迭代器和生成器

tangsiqi130的博客 1271

Python中生成器和迭代器的区别

Python中生成器和迭代器的区别:

IT晓可程序员之路 4万+

Python 迭代器和生成器的妙用

👉Python学习路线汇总👈Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)👉Python必备开发工具👈。

2301_82000445的博客 916

python中的生成器和迭代器

昨天晚上看面经的时候发现上面有提到python生成器和yield,刚才看元组生成式生成结果是一个生成器对象,这跟列表生成式还是有一定区别的。所以就干脆写下这篇文章记录一下。这也会是我总结面经的第一篇,希望自己可以一直坚持,每天有所进步和收获。 引言 1.列表生成式 通过以上三个例子列出列表生成式的三种形式,同时也可以发现列表生成式的结果是一个新的列表。 2.元组生成式 元组生成式语法格式与列表生...

不服输的南瓜的博客 3004

【Python学习】迭代器和生成器的区别及其各自实现方式和使用场景

本文介绍了Python中迭代器和生成器的概念与使用。文章详细说明了创建方法、特点对比,并提供了文件处理、斐波那契数列等实际应用示例,帮助理解它们在数据流处理和大文件操作中的优势。

2301_78695487的博客 1482

Python高级语法(迭代器&生成器)

在Python中,生成器(Generator)是一种特殊的迭代器,它使用yield关键字来返回值,而不是return。生成器函数在调用时不会立即执行,而是返回一个生成器对象,该对象在迭代过程中按需生成值。惰性计算:生成器中的值是在迭代过程中按需生成的,只有在请求下一个值时才会计算,这使得生成器在处理大数据集时非常高效。状态保存:生成器在每次yield后会保存其内部状态,下次调用next()时从上次的状态继续执行。内存效率:生成器不需要将所有值存储在内存中,因此在处理大数据集时可以节省内存。

2302_77326347的博客 1033
上一篇: Python 上下文管理器高级应用指南
下一篇: Python 类型提示高级应用指南
第一程序员
博客等级 码龄1年 1万+粉丝 1822原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值