国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > 头条 > 使用迭代器接收数据并自动停止

使用迭代器接收数据并自动停止

头像

silencement

2019-10-25 17:44:342761浏览 · 0收藏 · 0评论

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

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

import redis

client = redis.Redis()

def read_data():
    datas = []
    while True:
        data = client.lpop().decode()
        if data == 'Stop':
            break
        datas.append(data)
    return datas

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

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

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

import redis

client = redis.Redis()

def read_data():
    while True:
        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():
    while True:
        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)
关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

外国大片又大又好看的PPT | 自己怎么玩隐私位置游戏| 来真正的狗配人真人| 二人努力生猴子免费观看| 主动把乳头放进男朋友嘴巴里| 边摸边脱吃奶边高潮视频免费 | 免费观看已满十八岁电视剧在线播....| 人狗大战5高清正版免费观看| 《法国空乘5》观看| 《共享弟夫》动漫在线观看免费| 开会桌下把荫蒂添的好多水| 天堂草在线观看国产AV| 电视剧情满四合院| 干柴烈火115集免费观看| 舌头底下舔着有小硬疙瘩视频| 《妻子6》在线观看免费版电视剧| 扌桑小孩的辶鬲的历史背景| 丈夫不在的日子中字头| 公交车NP粗暴H强J玩弄| 呱呱爆料网每日爆料| 妈妈がだけの心に漂う| 伦理《禁忌12》| 《从上司到妻子》动画结局| 妈妈的朋友2| 我在古代富甲一方| 电影《满足2》完整版在线观看| 窝窝影院在线观看免费播放电视剧 | 器材室轮-」-(1):蒙着眼在.. | 《炸裂吧!巨棒》免费阅读漫画| 扌喿辶畐和扌喿辶的区别| 精神小伙| 十九岁暴躁少女CSGO免费观看| 摸摸大扔子的视频大全| 《警花交换做爰》| 老阿姨高清免费观看电视剧| 每日大赛| 小寡妇在线观看免费播放电视剧| 《厨房激战5》完整版在线观看| 暴躁姐姐BGM国语版| 洪真英| 亲吻姐姐