Python迭代器&生成器:分享贴近实际运维开发场景的小案例

简介: Python迭代器&生成器:分享贴近实际运维开发场景的小案例

迭代器&生成器

在 Python 中,迭代器和生成器都是用来遍历数据集合的工具,可以按需逐个生成或返回数据,从而避免一次性加载整个数据集合所带来的性能问题和内存消耗问题。

具体来说,迭代器是一个包含 iter() 和 next() 方法的对象,它通过 next() 方法依次返回数据集合中的每个元素,直到没有元素时引发 StopIteration 异常。迭代器可以自定义,也可以使用 Python 内置的可迭代对象,如列表、元组、字典、集合等,以及内置的迭代器函数,如 zip()、map()、filter() 等。

而生成器是一种特殊的迭代器,它使用 yield 关键字来定义,可以在需要时生成数据,从而实现按需生成、惰性计算的效果。生成器可以大大简化代码,提高性能和可读性,也可以通过生成器表达式快速创建简单的生成器。

下面分享几个贴近实际运维开发工作中的场景案例。

实战案例

  1. 假设需要从一个非常大的数据集合中查找满足特定条件的元素,并且只需要找到第一个符合条件的元素即可停止查找。如果直接遍历整个数据集合,可能会导致性能问题。这时可以使用迭代器和生成器来解决这个问题。
def find_first_match(data, condition):
    for item in data:
        if condition(item):
            return item
    raise ValueError('No matching item found')
large_data = [i for i in range(10000000)]  # 构造一个大数据集合
match = find_first_match(large_data, lambda x: x > 1000)  # 查找第一个大于 1000 的元素
print(match)
  1. 假设要实现一个函数,它接受一个字符串列表,然后返回这些字符串中所有字符的出现次数。可以使用迭代器和生成器来避免遍历整个列表,并减少内存使用量。
def char_count(words):
    counts = {}
    for word in words:
        for char in word:
            counts[char] = counts.get(char, 0) + 1
    return counts
def char_count_lazy(words):
    def char_gen(words):
        for word in words:
            for char in word:
                yield char
    counts = {}
    for char in char_gen(words):
        counts[char] = counts.get(char, 0) + 1
    return counts
  1. 需要遍历一个多级嵌套的 JSON 对象,查找其中某个特定的值。假设 JSON 对象很大,因此不能一次性加载到内存中。这时可以使用生成器来逐级遍历 JSON 对象。
def find_value(json_obj, target_key):
    if isinstance(json_obj, dict):
        for key, value in json_obj.items():
            if key == target_key:
                yield value
            else:
                yield from find_value(value, target_key)
    elif isinstance(json_obj, list):
        for item in json_obj:
            yield from find_value(item, target_key)
json_data = {
    "name": "tantianran",
    "age": 30,
    "cars": [
        {"model": "BMW", "year": 2000},
        {"model": "Tesla", "year": 2020}
    ],
    "location": {
        "address": "123 Main St",
        "city": "New York",
        "state": "NY"
    }
}
for value in find_value(json_data, "year"):
    print(value)
  1. 如果需要读取一个非常大的文件,并对其中的每一行进行处理,但是由于文件太大,无法一次性将整个文件读入内存中。这时可以使用生成器来实现逐行读取文件并逐行处理的操作。
def process_lines(file_name):
    with open(file_name) as f:
        for line in f:
            # 对每一行进行处理,这里只是简单地打印出来
            print(line.strip())
large_file = 'data.txt'
process_lines(large_file)
  1. 假设有一个大型日志文件,其中包含了数千万行日志记录。需要对这个日志文件进行分析,找出所有包含特定关键字的日志记录,并进行统计。如果直接读取整个日志文件到内存中,可能会导致内存不足的问题。这时可以使用迭代器和生成器来解决这个问题。
def log_file_reader(log_file_path):
    with open(log_file_path) as f:
        for line in f:
            yield line.strip()
def log_analyzer(log_file_path, keyword):
    log_reader = log_file_reader(log_file_path)
    count = 0
    for line in log_reader:
        if keyword in line:
            count += 1
    return count
log_file_path = 'logs.txt'
keyword = 'error'
error_count = log_analyzer(log_file_path, keyword)
print(f'The number of error logs is: {error_count}')
相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
413 1
|
7月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1743 0
|
8月前
|
存储 监控 算法
淘宝买家秀 API开发实录Python(2025)
本文讲述了作者在电商开发领域,尤其是对接淘宝买家秀 API 接口过程中所经历的挑战与收获。从申请接入、签名验证、频率限制到数据处理和实时监控,作者分享了多个实战经验与代码示例,帮助开发者更高效地获取和处理买家秀数据,提升开发效率。
|
9月前
|
SQL 运维 自然语言处理
Dataphin智能化重磅升级!编码难题一扫光,开发运维更高效!
Dataphin重磅推出三大核心智能化能力:智能代码助手提升SQL开发效率;智能运维助手实现移动化任务管理;智能分析通过自然语言生成SQL,助力数据价值释放。未来将持续开放智能ETL、安全助手等能力,助力企业构建高效、稳定的数据资产体系。
670 0
|
6月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
7月前
|
设计模式 人工智能 API
AI智能体开发实战:17种核心架构模式详解与Python代码实现
本文系统解析17种智能体架构设计模式,涵盖多智能体协作、思维树、反思优化与工具调用等核心范式,结合LangChain与LangGraph实现代码工作流,并通过真实案例验证效果,助力构建高效AI系统。
874 7
|
7月前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
386 2
|
8月前
|
传感器 数据采集 监控
Python生成器与迭代器:从内存优化到协程调度的深度实践
简介:本文深入解析Python迭代器与生成器的原理及应用,涵盖内存优化技巧、底层协议实现、生成器通信机制及异步编程场景。通过实例讲解如何高效处理大文件、构建数据流水线,并对比不同迭代方式的性能特点,助你编写低内存、高效率的Python代码。
329 0
|
7月前
|
大数据 数据处理 数据安全/隐私保护
Python3 迭代器与生成器详解:从入门到实践
简介:本文深入解析Python中处理数据序列的利器——迭代器与生成器。通过通俗语言与实战案例,讲解其核心原理、自定义实现及大数据处理中的高效应用。
368 0
|
7月前
|
设计模式 缓存 运维
Python装饰器实战场景解析:从原理到应用的10个经典案例
Python装饰器是函数式编程的精华,通过10个实战场景,从日志记录、权限验证到插件系统,全面解析其应用。掌握装饰器,让代码更优雅、灵活,提升开发效率。
548 0

推荐镜像

更多