欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

迭代器如何接收數(shù)據(jù)并自動停止

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

目前創(chuàng)新互聯(lián)公司已為近千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、合浦網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

假設(shè)有一個 redis 集合,里面有 N 條數(shù)據(jù),你不停從里面lpop數(shù)據(jù),直到某一條數(shù)據(jù)的值為'Stop'字符串為止(已知里面必有一條數(shù)據(jù)為'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

現(xiàn)在問題來了,如果 Redis 里面的數(shù)據(jù)非常多,已經(jīng)超過了你的內(nèi)存容量怎么辦?數(shù)據(jù)全部放在datas列表里面再返回顯然是不可取的做法。

好在,這些數(shù)據(jù)讀取出來以后,會傳給一個parse函數(shù),并且這個函數(shù)是一條一條處理數(shù)據(jù)的,它處理完成以后,就可以把數(shù)據(jù)丟棄了。

于是你可能會這樣改寫代碼:

import redis

client = redis.Redis()

def read_data():
    while True:
        data = client.lpop().decode()
        if data == 'Stop':
            break
        parse(data)

但我們知道,在編碼規(guī)范和軟件工程里面,建議一個函數(shù),它應(yīng)該只做一件事情,而現(xiàn)在read_data()函數(shù)卻做了兩件事情:1. 從 Redis 里面讀取數(shù)據(jù)。2.調(diào)用parse()函數(shù)。

那么我們有沒有辦法把他們區(qū)分開來呢?如何讓read_data能返回數(shù)據(jù),但是又不會把內(nèi)存撐爆呢?

這個時候,我們就可以使用生成器來解決問題:

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變成了生成器函數(shù),它返回一個生成器,對生成器進行迭代的時候,每次返回一條數(shù)據(jù),這一條數(shù)據(jù)立即傳給parse()函數(shù)。整個過程源源不斷,生生不息。不需要額外創(chuàng)建一個列表用來存放數(shù)據(jù)。

那么代碼還能不能繼續(xù)簡化呢?此時我們就可以使用iter關(guān)鍵字了。

使用了iter關(guān)鍵字的效果如下圖所示:

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現(xiàn)在每運行一次只會返回列表最左邊的數(shù)據(jù)。但是當我們直接使用iter(read_data, 'Stop')的時候,就會得到一個迭代器。對這個迭代器進行迭代,相當于在While True里面不停運行read_data函數(shù),直到某一次迭代的時候,read_data函數(shù)返回了Stop,就停止。

當然如果你想炫技的話,還可以進一步簡化:

import redis

client = redis.Redis()

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

看完上述內(nèi)容,你們掌握迭代器如何接收數(shù)據(jù)并自動停止的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

標題名稱:迭代器如何接收數(shù)據(jù)并自動停止
本文URL:http://www.chinadenli.net/article44/piiiee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護外貿(mào)建站品牌網(wǎng)站制作標簽優(yōu)化軟件開發(fā)網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管