亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中yield關(guān)鍵字及與return的區(qū)別詳解

 更新時間:2023年08月21日 09:31:20   作者:十八水  
這篇文章主要介紹了Python中yield關(guān)鍵字及與return的區(qū)別詳解,帶有 yield 的函數(shù)在 Python 中被稱之為 generator生成器,比如列表所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話將會非常耗內(nèi)存,想要得到龐大的數(shù)據(jù),又想讓它占用空間少,那就用生成器,需要的朋友可以參考下

1. yield 基本概念

帶有 yield 的函數(shù)在 Python 中被稱之為 generator(生成器)

比如列表所有數(shù)據(jù)都在內(nèi)存中,如果有海量數(shù)據(jù)的話將會非常耗內(nèi)存。僅僅需要訪問前面幾個元素,那后面絕大多數(shù)元素占用的空間都白白浪費了。

如果列表元素按照某種算法推算出來,那我們就可以在循環(huán)的過程中不斷推算出后續(xù)的元素,這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。

簡單一句話:想要得到龐大的數(shù)據(jù),又想讓它占用空間少,那就用生成器!

因此生成器的主要優(yōu)點是一邊循環(huán)一邊計算產(chǎn)生數(shù)據(jù)的機(jī)制,占用內(nèi)存少,缺點就是只能遍歷1次

2. 代碼實現(xiàn)斐波那契數(shù)列

斐波那契(Fibonacci)數(shù)列是一個非常簡單的遞歸數(shù)列,除第一個和第二個數(shù)外,任意一個數(shù)都可由前兩個數(shù)相加得到。

數(shù)列形式: 1,1,2,3,5,8,13,…,

def f(n):
    res = []
    num,a,b = 1,0,1
    while num <= n:
        res.append(b)
        a,b = b,a+b
        num += 1
    return res
res = f(13)
for i,b in enumerate(res):
    print(f"斐波那契數(shù)列第 %2s 個元素值是 %s"%(i+1,b))

斐波那契數(shù)列第  1 個元素值是 1
斐波那契數(shù)列第  2 個元素值是 1
斐波那契數(shù)列第  3 個元素值是 2
斐波那契數(shù)列第  4 個元素值是 3
斐波那契數(shù)列第  5 個元素值是 5
斐波那契數(shù)列第  6 個元素值是 8
斐波那契數(shù)列第  7 個元素值是 13
斐波那契數(shù)列第  8 個元素值是 21
斐波那契數(shù)列第  9 個元素值是 34
斐波那契數(shù)列第 10 個元素值是 55
斐波那契數(shù)列第 11 個元素值是 89
斐波那契數(shù)列第 12 個元素值是 144
斐波那契數(shù)列第 13 個元素值是 233

該函數(shù)在運(yùn)行中占用的內(nèi)存會隨著參數(shù) n 的增大而增大,如果要控制內(nèi)存占用,最好不要用 List 來保存中間結(jié)果,而是通過 iterable 對象來迭代。

def f(n):
    num,a,b = 1,0,1
    while num <= n:
        print("="*30)
        yield b
        print(f"斐波那契數(shù)列第 %2s 個元素值是 %s"%(num,b))
        a,b = b,a+b
        num += 1
for i in f(1):
    print(i)

yield before
1
yield after
斐波那契數(shù)列第  1 個元素值是 1

for i in f(2):
    print(i)

 ==============================
yield before
1
yield after
斐波那契數(shù)列第  1 個元素值是 1
==============================
yield before
1
yield after
斐波那契數(shù)列第  2 個元素值是 1

通過上面2個案例看出,當(dāng)執(zhí)行 __next__() 時,代碼就會執(zhí)行到 yield 處,然后返回 yield 后面的值,如果繼續(xù)調(diào)用 __next__() ,你會發(fā)現(xiàn),這次執(zhí)行的開始位置,是上次 yield 結(jié)束的地方,并且它還保留了上一次執(zhí)行的上下文,繼續(xù)向后迭代。

這就是使用 yield 的作用,在迭代生成器時,每一次執(zhí)行都可以保留上一次的狀態(tài),而不是像普通方法那樣,遇到 return 就返回結(jié)果,下一次執(zhí)行只能再次重復(fù)上一次的流程。

普通函數(shù)用 return 返回一個值,在 Python 中還有一種函數(shù),用關(guān)鍵字 yield 來返回值,這種函數(shù)叫生成器函數(shù),函數(shù)被調(diào)用時返回一個生成器對象(注意返回的不是yield后面的值)。

3.return 與 yield 的關(guān)系梳理

  • 共同點:return和yield都用來返回值;在一次性地返回所有值場景中return和yield的作用是一樣的。
  • 不同點:如果要返回的數(shù)據(jù)是通過for等循環(huán)生成的迭代器類型數(shù)據(jù)(如列表、元組),return只能在循環(huán)外部一次性地返回,yield則可以在循環(huán)內(nèi)部逐個元素返回。
    • 執(zhí)行順序的區(qū)別
      • yield: 是暫停函數(shù), 即函數(shù)返回某個值時,會停留在某個位置,返回函數(shù)值后,會在前面停留的位置繼續(xù)執(zhí)行,直到程序結(jié)束
      • return: 是結(jié)束函數(shù), return返回值后不再執(zhí)行函數(shù)體內(nèi)代碼,徹底結(jié)束。
    • 輸出對象的區(qū)別
      • yield 輸出的是一個生成器對象,相當(dāng)于是一個容器,想取什么數(shù)據(jù)就取出什么,每次調(diào)用只返回一個數(shù)值
      • return 返回的是一個元組(默認(rèn)), 只會返回一個值
    • 占用資源不同
      • 使用return空間開銷比較大,尤其是操作巨量數(shù)據(jù)的時候,操作一個大列表時間開銷也會得不償失
      • yield 生成器相比 return一次返回所有結(jié)果的優(yōu)勢:①反應(yīng)更迅速 ②更節(jié)省空間 ③使用更靈活

到此這篇關(guān)于Python中yield關(guān)鍵字及與return的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Python的yield與return內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決pyinstaller打包運(yùn)行程序時出現(xiàn)缺少plotly庫問題

    解決pyinstaller打包運(yùn)行程序時出現(xiàn)缺少plotly庫問題

    這篇文章主要介紹了解決pyinstaller打包運(yùn)行程序時出現(xiàn)缺少plotly庫問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • python實現(xiàn)查詢蘋果手機(jī)維修進(jìn)度

    python實現(xiàn)查詢蘋果手機(jī)維修進(jìn)度

    這篇文章主要介紹了python實現(xiàn)查詢蘋果手機(jī)維修進(jìn)度,這里用到了最重要的一個知識是python中如何設(shè)置cookie支持以及開啟調(diào)試模式,需要的朋友可以參考下
    2015-03-03
  • python登錄WeChat 實現(xiàn)自動回復(fù)實例詳解

    python登錄WeChat 實現(xiàn)自動回復(fù)實例詳解

    在本篇內(nèi)容里小編給大家整理的是關(guān)于python登錄WeChat 實現(xiàn)自動回復(fù)的相關(guān)實例內(nèi)容以及知識點總結(jié),有興趣的朋友們參考下。
    2019-05-05
  • Python實現(xiàn)Word文檔樣式批量處理

    Python實現(xiàn)Word文檔樣式批量處理

    這篇文章主要為大家詳細(xì)介紹了如何利用Python中的python-docx非標(biāo)準(zhǔn)庫實現(xiàn)word文檔樣式批量處理,文中示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-05-05
  • python sklearn數(shù)據(jù)預(yù)處理之正則化詳解

    python sklearn數(shù)據(jù)預(yù)處理之正則化詳解

    數(shù)據(jù)的預(yù)處理是數(shù)據(jù)分析,或者機(jī)器學(xué)習(xí)訓(xùn)練前的重要步驟,這篇文章主要為大家詳細(xì)介紹了sklearn數(shù)據(jù)預(yù)處理中正則化的相關(guān)知識,需要的可以參考下
    2023-10-10
  • pymysql 開啟調(diào)試模式的實現(xiàn)

    pymysql 開啟調(diào)試模式的實現(xiàn)

    這篇文章主要介紹了pymysql 開啟調(diào)試模式的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 使用Python的OpenCV模塊識別滑動驗證碼的缺口(推薦)

    使用Python的OpenCV模塊識別滑動驗證碼的缺口(推薦)

    這篇文章主要介紹了使用Python的OpenCV模塊識別滑動驗證碼的缺口,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • Pycharm配置遠(yuǎn)程SSH服務(wù)器實現(xiàn)(切換不同虛擬環(huán)境)

    Pycharm配置遠(yuǎn)程SSH服務(wù)器實現(xiàn)(切換不同虛擬環(huán)境)

    本文主要介紹了Pycharm配置遠(yuǎn)程SSH服務(wù)器實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳解python中flask_caching庫的用法

    詳解python中flask_caching庫的用法

    這篇文章主要介紹了詳解python中flask_caching庫的用法,可以在一定的時間內(nèi)直接返回結(jié)果而不是每次都需要計算或者從數(shù)據(jù)庫中查找。flask_caching插件就是提供這種功能的神器,需要的朋友可以參考下
    2023-05-05
  • python經(jīng)典100題之皮球掉落的幾種解法

    python經(jīng)典100題之皮球掉落的幾種解法

    這篇文章主要給大家介紹了關(guān)于python經(jīng)典100題之皮球掉落的幾種解法,這個問題相信不少人都可以從網(wǎng)絡(luò)上找到相對應(yīng)的答案本文提供了3種解法,需要的朋友可以參考下
    2023-11-11

最新評論