Python3中的生成器函數

2021-01-08 騰訊網

Python中對延遲提供了友好的支持:即它提供了在需要的時候才產生結果的工具,而不是立即產生結果。下面介紹的函數生成器就是這種工具之一。

1:生成器函數的定義

定義:使用常規的def語句進行編寫,但是使用yield語句一次返回一個結果集,在每次結果產生之間掛起和恢復它們的狀態。

# 常規函數def func1(): print('hello ') return 'ixusy88' ret = func1()print(ret) '''結果:hello ixusy88''' print("*"*30)# 生成器函數,把常規函數中的return替換為yielddef func2(): print('hello ') yield 'ixusy88' ret = func2() # 並沒有執行函數,而是返回一個生成器對象print(ret)'''結果:'''

2:生成器函數的本質

生成器函數本質就是一個迭代器:函數中如果包含一條yield語句,那麼Python就會將它編譯為生成器,這個函數不再是普通函數,而是作為返回支持迭代協議的對象的函數,這個函數返回的對象會自動創建名為__next__的方法接口。

"""yield語句會掛起該函數並向調用者傳回一個值,同時會保留足夠的狀態使函數能從它離開的地方繼續執行,當繼續時,函數在上一個yield傳回後立即繼續執行。"""def func1(N): for i in range(N): yield i**2 ret = func1(3) # 只要函數func1中有yield語句,就會返回一個支持迭代協議的對象print(ret)print('__iter__' in dir(ret))print('__next__' in dir(ret)) """輸出結果:TrueTrue"""print("*"*30) # ret 是一個支持迭代協議的對象,可以通過手工進行訪問 print(ret.__next__())print(ret.__next__())print(ret.__next__())print(ret.__next__()) # """014Traceback (most recent call last): File "D:\python\生成器函數.py", line 53, in print(ret.__next__()) # StopIterationStopIteration""" print("*"*30)ret = func1(5) # ret 是一個支持迭代協議的對象,可以使用for循環來遍歷for item in ret: print(item)"""014916"""

3:小示例

# 斐波那契函數# def Fibonacci(N): a,b,max_cnt = 0,1,N while b a,b = b,a+b yield a print('*'*30)fib = Fibonacci(5)print(fib) for x in fib: print(x) '''輸出結果:11235'''print('*'*30) # 手工訪問fib = Fibonacci(5)print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__())print(fib.__next__()) '''結果:11235Traceback (most recent call last): File "D:\python\生成器函數.py", line 119, in print(fib.__next__())StopIteration'''

相關焦點

  • python高階函數:map、filter、reduce的替代品
    python3中移除了apply。如果想使用不定量的參數調用函數,可以使用fn(*args,**keywords),不用再使用apply(fn,args,keywords)。雖然map函數、filter函數、reduce函數還能使用,但是很多場景下其都有替代品可以使用。
  • Python生成器函數概述:運用實例分解說明機制
    這個單詞的兩種含義都會在Python生成器函數中出現。人們通常認為,函數在返回單個值、以列表或詞庫形式返回多個值、或用戶定義的對象時,會通過返回語句產生結果。返回語句是函數結束控制並將控制和結果讓渡給調用者的方式。返回語句後,運行環境(解釋器)將給定函數的堆棧幀從調用堆棧中移除,給定函數的「環境」就會消失(直到下一次調用該函數)。
  • Python實現一個類似range函數的浮點數生成器 - python高手養成
    今天,帶大家做一個浮點數生成器,主要用到的知識點有:1.實現自定義類的__iter__()和__reversed()__方法2.Decimal對於十進位數據的精度控制Python實現浮點數生成器通常,我們使用range()函數來生成一個整形數列表,函數中我們可以自定義起始值、結束值和步進範圍。
  • Python3中的匿名函數
    匿名函數即無名函數,其形式為:lambda 參數1,參數2:表達式,其中參數1,參數2為傳遞的參數,表達式計算出的結果為返回的值。# 普通函數def add1(x,y): return x+y print(add1(10,20)) # 匿名函數(lambda)add2 = lambda x,y:x+y # x,y 是參數,x+y的結果是函數的返回值print(add2(10,20))lambda是一個表達式,而不是語句,不是一個代碼塊。
  • 理解yield和生成器
    要理解什麼是yield,必須理解什麼是生成器(generator)。在理解生成器之前,讓我們先了解迭代。但是同時也需要將所有的值存入內存當中,無論你是不是需要所有的值,可能對於一個列表[x for x in range(100000)],你僅僅想拿到裡面的素數,但當這個列表生成式被執行的時候,已經將所有100000個數字存入了內存中。
  • Python數據讀取之生成器(generator)
    Python生成器是創建迭代器的簡單方法。簡單來說,生成器是一個函數,它返回一個我們可以迭代的對象(迭代器),迭代器一次返回一個值較使用列表將所有數據都加載到內存中,生成器節省了大量內存空間。深度學習的數據讀取部分一般都需要使用迭代器。
  • python中常見的對象辨析(可迭代對象、迭代器對象、生成器對象)
    2.數值型可迭代對象即序列、字典、集合對應的可迭代對象二 迭代器對象IteratorA.定義可作用於next()函數並能不斷調用的對象叫迭代 器對象B.包括1.iter(具有__iter__方法的對象)的返回值2.生成器C.訪問迭代器1.循環遍歷訪問
  • 第66p,概念:生成器、迭代器與迭代對象(下)
    自定義器迭代器就是生成器(generator);生成器就是迭代器;2、如何得到自定義的迭代器:在函數內存在yield關鍵字,調用函數時並不會執行函數體代碼;而是返回一個生成器對象(generator),這個生成器就是自定義的迭代器;3、生成器的執行過程A.
  • python迭代器和生成器總結——新的斐波那契數列
    給定一個集合,循環對集合中的每個元素應用某個操作,稱之為迭代。python迭代器題目:給定一個序列,循環輸出序列中的每個元素。通過一個for循環就可以實現,如下:for循環遍歷以上demo中,我們使用了print函數的雙參數形式,通過第二個參數end,指定以一個空格作為結尾,以代替原來的換行。控制臺結果如下:
  • 神經網絡中的分類器該如何改成生成器?
    在現代的分解建模中的,一般使用統計數據的似然作為改進目的,而GAN創新地用於了另一個改進目的。首先,引進判斷建模(常見建模還包括反對矢量機和多層人工神經網絡)。其次,其改進步驟是在分解建模和判斷建模兩者之間尋找沃克平衡。
  • 近乎完美的DDS正弦波信號音生成器
    此功能通常利用存儲在LUT(ROM)中的三角函數值完成,有時通過執行正弦近似算法完成,或兩者組合方式完成。相位-正弦幅度轉換器的輸出供DAC使用,在濾波之前生成量化和採樣正弦信號,使信號平穩,並避免頻譜混疊。由DAC有限解析度導致的幅度量化設定了本底噪聲以及相應的頻率合成器信噪比(SNR)的理論限值。
  • 雲計算開發學習筆記:Python3匿名函數
    所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函數。lambda 只是一個表達式,函數體比 def 簡單很多。lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • Python每日3題-為什麼函數名字可以當做參數用?
    Python中一切皆對象,函數名是函數在內存中的空間,也是一個對象 [Normal] 函數裝飾器有什麼作用?
  • Python3中常用模塊-random模塊
    random是Python中與隨機數相關的模塊,其本質就是一個偽隨機數生成器,我們可以利用random模塊基礎生成各種不同的隨機數,以及一些基於隨機數的操作。
  • 二維碼生成器
    二維碼生成器 生活工具
  • 近乎完美的DDS正弦波信號音生成器 下
    這些先進的轉換器具有高達32位的解析度、超低失真和高信噪比,是在中低帶寬內實施信號重構的最佳選擇。為了在音頻頻譜或稍寬的頻段(20 kHz或40 kHz帶寬)內實現出色的噪聲和失真性能,可以使用ADI公司產品系列中傑出的∑-∆ DAC產品,音頻立體聲DACAD1955, 雖然解析度最高為24位,這款DAC仍然是市場上非常受歡迎的音頻DAC。
  • 文字圖標生成器
    文字圖標生成器 主題美化 大小: 1.83M
  • 《缺氧》海藻氧氣生成器怎麼做 海藻氧氣生成器製作介紹
    導 讀 《缺氧》海藻氧氣生成器製作及用途介紹。
  • 詞雲圖生成器
    詞雲圖生成器 生活工具
  • Python中的yield到底是個什麼鬼?
    如果不太好理解,可以先把當作的同胞兄弟來看,他們都在函數中使用,並履行著返回某種結果的職責。  這兩者的區別是:  有的函數直接返回所有結果,程序終止不再運行,並銷毀局部變量;  在 Python 中,使用了的函數被稱為生成器。有點套娃的感覺,但事實就是這樣,調用一個函數,就會返回一個生成器對象。