文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python开发之迭代器&生成器的实战案例分享

2023-05-16 15:01

关注

迭代器&生成器

在 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)

2.假设要实现一个函数,它接受一个字符串列表,然后返回这些字符串中所有字符的出现次数。可以使用迭代器和生成器来避免遍历整个列表,并减少内存使用量。

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

3.需要遍历一个多级嵌套的 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)

4.如果需要读取一个非常大的文件,并对其中的每一行进行处理,但是由于文件太大,无法一次性将整个文件读入内存中。这时可以使用生成器来实现逐行读取文件并逐行处理的操作。

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)

5.假设有一个大型日志文件,其中包含了数千万行日志记录。需要对这个日志文件进行分析,找出所有包含特定关键字的日志记录,并进行统计。如果直接读取整个日志文件到内存中,可能会导致内存不足的问题。这时可以使用迭代器和生成器来解决这个问题。

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}')

到此这篇关于Python开发之迭代器&生成器的实战案例分享的文章就介绍到这了,更多相关Python迭代器 生成器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯