一日一技:如何通过迭代器精简你的代码

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 一日一技:如何通过迭代器精简你的代码

截图:产品经理游玩:kingname & 产品经理

假设有一个 Redis 集合,里面有 N 条数据,你不停从里面lpop数据,直到某一条数据的值为'Stop'字符串为止(已知里面必有一条数据为'Stop'字符串,但其位置不知道)。

这个需求看起来很简单,于是你立刻就着手写出了代码:

import redis
client = redis.Redis()
def read_data():
    datas = []
    whileTrue:
        data = client.lpop().decode()
        if data == 'Stop':
            break
        datas.append(data)
    return datas

现在问题来了,如果 Redis 里面的数据非常多,已经超过了你的内存容量怎么办?数据全部放在datas列表里面再返回显然是不可取的做法。

好在,这些数据读取出来以后,会传给一个parse函数,并且这个函数是一条一条处理数据的,它处理完成以后,就可以把数据丢弃了。

于是你可能会这样改写代码:

import redis
client = redis.Redis()
def read_data():
    whileTrue:
        data = client.lpop().decode()
        if data == 'Stop':
            break
        parse(data)

但我们知道,在编码规范和软件工程里面,建议一个函数,它应该只做一件事情,而现在read_data()函数却做了两件事情:1. 从 Redis 里面读取数据。2.调用parse()函数。

那么我们有没有办法把他们区分开来呢?如何让read_data能返回数据,但是又不会把内存撑爆呢?

这个时候,我们就可以使用生成器来解决问题:

import redis
client = redis.Redis()
def read_data():
    whileTrue:
        data = client.lpop().decode()
        if data == 'Stop':
            break
        yield data
def parse_data():
    for data in read_data():
        parse(data)

在这个代码里面,read_data变成了生成器函数,它返回一个生成器,对生成器进行迭代的时候,每次返回一条数据,这一条数据立即传给parse()函数。整个过程源源不断,生生不息。不需要额外创建一个列表用来存放数据。

那么代码还能不能继续简化呢?此时我们就可以使用iter关键字了。

使用了iter关键字的效果如下图所示:

import redis
client = redis.Redis()
def read_data():
    data = client.lpop().decode()
    return data
def parse_data():
    for data in iter(read_data, 'Stop'):
        parse(data)

其中,read_data现在每运行一次只会返回列表最左边的数据。但是当我们直接使用iter(read_data, 'Stop')的时候,就会得到一个迭代器。对这个迭代器进行迭代,相当于在while True里面不停运行read_data函数,直到某一次迭代的时候,read_data函数返回了Stop,就停止。

如果你想炫技的话,还可以进一步简化:

import redis
client = redis.Redis()
def parse_data():
    for data in iter(lambda: client.lpop().decode(), 'Stop'):
        parse(data)

当然,我是不推荐你这样写的^_^。

目录
相关文章
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1241 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1220 87
|
11天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1800 13
|
20天前
|
人工智能 运维 安全
|
4天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
235 127
|
4天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
180 2