亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

迭代器如何接收數據并自動停止

發布時間:2020-09-21 10:08:58 來源:億速云 閱讀:216 作者:Leah 欄目:編程語言

迭代器如何接收數據并自動停止?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

假設有一個 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)

看完上述內容,你們掌握迭代器如何接收數據并自動停止的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浙江省| 锡林浩特市| 遵义市| 普格县| 随州市| 长治市| 长乐市| 泸水县| 纳雍县| 嘉义县| 阿克| 山阳县| 伊通| 宝鸡市| 通许县| 蓬莱市| 积石山| 张家口市| 长海县| 北安市| 文山县| 金堂县| 滨州市| 芷江| 鹰潭市| 保定市| 耒阳市| 新竹市| 东宁县| 青阳县| 东兰县| 若尔盖县| 锡林郭勒盟| 商都县| 白城市| 山丹县| 榆树市| 通辽市| 无极县| 特克斯县| 陵川县|