最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1. yield 基本概念

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

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

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

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

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

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

斐波那契(Fibonacci)數(shù)列是一個(gè)非常簡(jiǎn)單的遞歸數(shù)列,除第一個(gè)和第二個(gè)數(shù)外,任意一個(gè)數(shù)都可由前兩個(gè)數(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 個(gè)元素值是 %s"%(i+1,b))

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • python模擬表單提交登錄圖書館

    python模擬表單提交登錄圖書館

    這篇文章主要為大家詳細(xì)介紹了python模擬表單提交登錄圖書館的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 用OpenCV進(jìn)行年齡和性別檢測(cè)的實(shí)現(xiàn)示例

    用OpenCV進(jìn)行年齡和性別檢測(cè)的實(shí)現(xiàn)示例

    這篇文章主要介紹了用 OpenCV 進(jìn)行年齡和性別檢測(cè)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Python中更優(yōu)雅的日志記錄方案詳解

    Python中更優(yōu)雅的日志記錄方案詳解

    在Python中,一般情況下我們可能直接用自帶的logging模塊來記錄日志,但logging用起來其實(shí)并不是那么好用,其實(shí)主要還是配置較為繁瑣。本文為大家介紹了Python中更優(yōu)雅的日志記錄方案,需要的可以參考一下
    2022-06-06
  • 如何使用Python獲取昨天的日期

    如何使用Python獲取昨天的日期

    Python 是一種高級(jí)語言,可用于數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí),以使用 Python 的數(shù)據(jù)結(jié)構(gòu)訓(xùn)練 AI,它用于編寫各種應(yīng)用程序,從 Web 和桌面到操作系統(tǒng)級(jí)程序,這篇文章主要介紹了在 Python 中獲取昨天的日期,需要的朋友可以參考下
    2023-05-05
  • 在 Python 中接管鍵盤中斷信號(hào)的實(shí)現(xiàn)方法

    在 Python 中接管鍵盤中斷信號(hào)的實(shí)現(xiàn)方法

    要使用信號(hào),我們需用導(dǎo)入 Python 的signal庫。然后自定義一個(gè)信號(hào)回調(diào)函數(shù),當(dāng) Python 收到某個(gè)信號(hào)時(shí),調(diào)用這個(gè)函數(shù)。 ,下面通過實(shí)例代碼給大家介紹在 Python 中接管鍵盤中斷信號(hào),需要的朋友可以參考下
    2020-02-02
  • python 批量將PPT導(dǎo)出成圖片集的案例

    python 批量將PPT導(dǎo)出成圖片集的案例

    這篇文章主要介紹了python 批量將PPT導(dǎo)出成圖片集的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python中的類學(xué)習(xí)筆記

    Python中的類學(xué)習(xí)筆記

    這篇文章主要介紹了Python中的類學(xué)習(xí)筆記,本文是個(gè)人學(xué)習(xí)總結(jié),用實(shí)例講解了類的定義、訪問控制等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Python如何獲取域名的SSL證書信息和到期時(shí)間

    Python如何獲取域名的SSL證書信息和到期時(shí)間

    在當(dāng)今互聯(lián)網(wǎng)時(shí)代,SSL證書的重要性不言而喻,它不僅為用戶提供了安全的連接,還能提高網(wǎng)站的搜索引擎排名,那我們?cè)趺床拍芡ㄟ^Python獲取域名的SSL證書信息和到期時(shí)間呢,下面小編就來簡(jiǎn)單講講吧
    2025-03-03
  • Python 虛擬環(huán)境venv詳解

    Python 虛擬環(huán)境venv詳解

    Python 虛擬環(huán)境主要是為不同 Python 項(xiàng)目創(chuàng)建一個(gè)隔離的環(huán)境,每個(gè)項(xiàng)目都可以擁有獨(dú)立的依賴包環(huán)境,而項(xiàng)目間的依賴包互不影響,對(duì)Python 虛擬環(huán)境venv相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-09-09
  • Python機(jī)器學(xué)習(xí)入門(三)之Python數(shù)據(jù)準(zhǔn)備

    Python機(jī)器學(xué)習(xí)入門(三)之Python數(shù)據(jù)準(zhǔn)備

    這篇文章主要介紹了Python機(jī)器學(xué)習(xí)入門知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

佛山市| 英吉沙县| 云南省| 盈江县| 河东区| 隆安县| 嘉黎县| 博客| 泊头市| 德保县| 沐川县| 荣成市| 陇川县| 普兰店市| 元氏县| 深圳市| 多伦县| 新津县| 琼中| 黄浦区| 伽师县| 新竹县| 巩留县| 汉阴县| 伽师县| 伊春市| 垣曲县| 得荣县| 泌阳县| 奉贤区| 武乡县| 资中县| 达日县| 云阳县| 大连市| 竹溪县| 淮安市| 始兴县| 呈贡县| 金川县| 新野县|