中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

我要學(xué)python之生成器

from collections import Iterable

# 模擬取款
def cash_atm(totalmoney):
    while totalmoney>0:
        print("=======(可取金額:%s )=======" % totalmoney)
        totalmoney -= 100
        yield 100
        print("=======(    余額:%s )=======" % totalmoney)

atm = cash_atm(1000)
# 查看atm是個(gè)啥,是一個(gè)generator
print(type(atm))
# 判斷atm是否可迭代
print(isinstance(atm, Iterable))
# 獲取100現(xiàn)金
print(atm.__next__())
# 消費(fèi)金額
print("買(mǎi)了本書(shū)把錢(qián)花完了...")
# 我想去買(mǎi)個(gè)禮物給女朋友,可沒(méi)有錢(qián)了再去取錢(qián)
print(atm.__next__())
'''
定義:如果一個(gè)函數(shù)返回的是一個(gè)迭代器,那么這個(gè)函數(shù)就是生成器
那么如果一個(gè)函數(shù)要返回一個(gè)迭代器則需要使用yield語(yǔ)法,
該函數(shù)就可以返回一個(gè)迭代器
'''

分析:上面的cash_atm是一個(gè)生成器,它調(diào)用時(shí)返回一個(gè)迭代器,根據(jù)迭代器的特性,我們只能往下走,不能往回退,上面比較特殊的地方就是:每次請(qǐng)求執(zhí)行atm的next時(shí),都能夠從上一次后面繼續(xù)往下走,而這個(gè)關(guān)鍵在于yield語(yǔ)法,yield是能夠跳出當(dāng)前函數(shù),并且保存執(zhí)行的狀態(tài),下一次調(diào)用next時(shí),可以從保存狀態(tài)繼續(xù)往下走。

10年積累的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有新北免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

應(yīng)用分析:
這個(gè)生成器有什么應(yīng)用場(chǎng)景呢?比如說(shuō):如果一個(gè)操作需要花費(fèi)很長(zhǎng)時(shí)間,如果是串行執(zhí)行的,那么就必須等待操作執(zhí)行完才可以去干其他的事情,那么這段時(shí)間內(nèi),你就處于被阻塞狀態(tài)的,這是不理想的狀態(tài)。最好的狀態(tài)是什么呢?比如說(shuō)我調(diào)用接口a,這個(gè)接口需要花費(fèi)一段時(shí)間。最好的效果呢就是,我調(diào)用該接口,然后去做其他的事,一旦這個(gè)接口處理完成后通知我,我來(lái)處理這個(gè)結(jié)果返回的后續(xù)操作。這個(gè)就是異步操作,相當(dāng)于我開(kāi)一個(gè)線程去處理接口,接口處理完后會(huì)通知主線程處理。

場(chǎng)景應(yīng)用:
模擬異步場(chǎng)景: 有一個(gè)餐館,有一個(gè)廚師,有2名食客,食客點(diǎn)包子,廚師做包子,廚師做完后,食客開(kāi)始吃。
這是一個(gè)生產(chǎn)消費(fèi)模型,實(shí)現(xiàn)一個(gè)單線程的異步效果?

實(shí)現(xiàn)代碼如下:

import time
# 生產(chǎn)者消費(fèi)者模型:廚師生產(chǎn)者,食客消費(fèi)者

# 消費(fèi)者
def consumer(name):
    print("服務(wù)員給我[%s]上包子..."%name)
    while True:
        bz = yield
        print("%s,你好!包子[%s]來(lái)了!"%(name,bz))

# 生產(chǎn)者
def producer(name):
    c = consumer('A')
    c2 = consumer('B')
    c.__next__()
    c2.__next__()
    print("廚師[%s]開(kāi)始做包子了..."%name)
    for i in range(10):
        time.sleep(1)
        print("我[%s]做好兩個(gè)包子!"%name)
        c.send(i)
        c2.send(i)

producer('ckmike')

總結(jié):
上面的代碼是一個(gè)簡(jiǎn)單的單線程異步效果。生成器的作用非常大。消費(fèi)者不需要等生產(chǎn)者把所有都準(zhǔn)備好就可以把現(xiàn)有的消息消費(fèi)掉,消費(fèi)者只是接受消息信息號(hào),把當(dāng)前的信息處理掉,而生產(chǎn)者負(fù)責(zé)生成消息,并且信號(hào)發(fā)送給消費(fèi)者。上面的效果可能我們還是有點(diǎn)模糊生成器有啥用。比如說(shuō)現(xiàn)在我要獲取一個(gè)斐波那契數(shù)列。我們沒(méi)有必要把所有的值一次性加載到內(nèi)存中,我們可以要一個(gè)拿一個(gè)(通過(guò)生成式實(shí)現(xiàn)),概念:這種一邊循環(huán)一邊計(jì)算的機(jī)制,稱(chēng)為生成器:generator。,與Linux下的cat命令類(lèi)似,你不需要把大文件一次性加載到內(nèi)存中,你只要獲取部分到內(nèi)存中,這樣大大節(jié)省了內(nèi)存。
菲波那切數(shù)列實(shí)現(xiàn):


# 菲波那切數(shù)列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'

f=fib(10)
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())

本文題目:我要學(xué)python之生成器
本文地址:http://www.rwnh.cn/article14/jgpjde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航用戶(hù)體驗(yàn)、品牌網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、全網(wǎng)營(yíng)銷(xiāo)推廣網(wǎng)站排名

廣告

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

外貿(mào)網(wǎng)站制作
囊谦县| 大丰市| 波密县| 慈利县| 碌曲县| 乌拉特前旗| 红安县| 新密市| 兴隆县| 全椒县| 牡丹江市| 砀山县| 平阳县| 化德县| 屯门区| 城固县| 读书| 客服| 清涧县| 武川县| 平顶山市| 环江| 乌审旗| 白沙| 聂拉木县| 隆林| 桓台县| 吉木萨尔县| 陕西省| 长治县| 北宁市| 天柱县| 元朗区| 香河县| 南木林县| 绥芬河市| 德州市| 镇原县| 长沙县| 江永县| 深水埗区|