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

python生成器函數(shù)yield與yield?from使用

 更新時間:2025年08月04日 08:38:21   作者:yuanfeidexin321  
生成器函數(shù)通過yield實現(xiàn)在調(diào)用時逐項生成值,實現(xiàn)惰性計算以節(jié)省內(nèi)存量,yieldfrom用于委托其他生成器或迭代器,直接傳遞其生成的值給調(diào)用者,而非返回整個生成器對象,使數(shù)據(jù)處理更高效

一、為什么叫生成器函數(shù)?

因為它們產(chǎn)生generate一系列值而得名。在生成器函數(shù)中,使用"yield"語句生成一個值并將其返回調(diào)用值,而不是通過普通的"return"語句一次性返回所有值。

因為生成器函數(shù)只有在請求下一個值時,才會進行計算,并且在生產(chǎn)值時保留函數(shù)的狀態(tài)。所以,處理大量的數(shù)據(jù)時,不會占用很大的內(nèi)存。他們不會一次性計算并存儲所有的值,所以主要特點是『惰性計算』。

  • 好處:高效地使用內(nèi)存和計算資源。
  • 最大特點:惰性計算。(用的時候,才去計算。)
  • 保留狀態(tài):保留之前的值。

 如下代碼,yiled調(diào)用生成器,返回的是一個generator類型的值。

1、yield在生成器函數(shù)中使用

生成器是一種特殊的函數(shù)。

生成器函數(shù)中的 "yield" 關(guān)鍵詞用于產(chǎn)生值并將其返回給調(diào)用者,同時保留函數(shù)的當前狀態(tài)。

每次調(diào)用生成器函數(shù)時,它會從上次 "yield" 語句的位置恢復執(zhí)行,并一直執(zhí)行到下一個 "yield" 語句。這樣,生成器函數(shù)可以逐步生成值,而不是一次性生成所有值,從而節(jié)省內(nèi)存并提高性能。

如下代碼,是一個生成器函數(shù),它會生成一系列整數(shù)值:1,2,3。

def nested_generator():
    yield 1
    yield 2
    yield 3

二、怎么使用generator類型的數(shù)據(jù)?

生成器generator是一種特殊類型的迭代器。

1、什么是迭代器?

迭代器Iterator,用來一種遍歷或迭代集合元素的對象??梢园错樞蛟L問集合的每個元素,而無需了解集合內(nèi)部的結(jié)構(gòu)。用iter和next手動操作迭代器。

 for循環(huán)無法獲取到迭代的值,因為迭代器已遍歷完所有的值。

2、generator生成器里可以放什么類型的數(shù)據(jù)?

在生成器中,可以放置各種類型的東西,包括 yield 語句、函數(shù)調(diào)用、表達式、迭代器以及 yield from 表達式。這些元素共同構(gòu)成了生成器函數(shù)的功能,使其能夠高效地處理大型數(shù)據(jù)集、無限序列或需要惰性計算的場景。

3、怎么使用generator類型的數(shù)據(jù)?

generator是一種特殊的迭代器。因為iterator可用next,不可以用for循環(huán)。但是gerater兩者都可以用。

1、獲取值的方式

def my_generator():
    yield 1
    yield 2
    yield 3

# 使用 for 循環(huán)迭代生成器
for value in my_generator():
    print(value)


# 使用 next() 函數(shù)
gen = my_generator()
print(next(gen))  # 輸出:1
print(next(gen))  # 輸出:2
print(next(gen))  # 輸出:3

2、可直接用于迭代函數(shù),如sum()max()、min() 等。

gen = my_generator()
total = sum(gen)
print(total)  # 輸出:6

3、generator和其他類型的互相轉(zhuǎn)換

1、generator轉(zhuǎn)換成其他類型(例如列表、元祖、集合)。如下代碼

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
my_list = list(gen)  # 或者 tuple(gen)、set(gen)
print(my_list)  # 輸出:[1, 2, 3]

2、其他類型轉(zhuǎn)換成generator類型

(1)使用生成器表達式

my_list = [1, 2, 3, 4, 5]
gen = (x for x in my_list)

(2)函數(shù)中使用yield

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()

三、yield from使用

1、如果解讀如下代碼段?

def nested_generator():
    yield 1
    yield 2
    yield 3

def main_generator():
    yield 'Start'
    yield from nested_generator()
    yield 'End'

def ok_yiled_from():
    for item in main_generator():
        print(item)

ok_yiled_from()


輸出:
    Start
    1
    2
    3
    End

1、ok_yiled_from調(diào)用main_generator返回一個generator,進行for循環(huán)。

2、調(diào)用main_generator中的yield 'Start',則生成Start并返回給調(diào)用者,執(zhí)行到該句返回,并暫停

3、調(diào)用main_generator中的yield from nested_generator(),使用yield from調(diào)用另外一個生成器函數(shù)nested_generator()(問題:yield from后面只能跟生成器函數(shù)嗎?)。

main_generator生成器函數(shù)將執(zhí)行權(quán)轉(zhuǎn)交給nested_generator(),并在其中生成的值被產(chǎn)生時,直接返回main_generator生成器函數(shù)的調(diào)用者ok_yiled_from。main_generator暫停執(zhí)行,等待nested_generator執(zhí)行完畢。

4、當nested_generator()生成器函數(shù)執(zhí)行完畢后并沒有更多值可產(chǎn)生時,main_generator生成器函數(shù)會繼續(xù)執(zhí)行,yield 'End' 產(chǎn)出 End值。此時,生成器函數(shù)的執(zhí)行完全終止。

這樣,整個過程就形成了一個流程,生成器函數(shù)逐步生成值并在必要時暫停執(zhí)行,而在 yield from 語句中調(diào)用的嵌套生成器負責生成中間的值。這種機制使得生成器函數(shù)能夠高效地處理大量數(shù)據(jù)或延遲計算,從而節(jié)省內(nèi)存和提高性能。

2、yield from后面要求跟什么?

yield from后面可以跟可迭代對象或者生成器generator。

1)跟任何可迭代對象iterable,包括列表、元組、集合、字典的鍵或值、字符串等

例如:

def list_generator():
    my_list = [1, 2, 3, 4, 5]
    yield from my_list

gen = list_generator()
for value in gen:
    print(value)

2)跟生成器generator

如上面例子中的nested_generator()

3、yield后面跟什么?

yeild后面跟:不同類型單獨的值、任何不同類型的表達式、語句。

def calculate_square(x):
    return x * x

def my_generator():
    yield 1
    yield "Hello"
    yield 3.14
    yield 10 * 2
    yield calculate_square(2)

gen = my_generator()
print(next(gen))  # 輸出:1
print(next(gen))  # 輸出:hello
print(next(gen))  # 輸出:3.14
print(next(gen))  # 輸出:20
print(next(gen))  # 輸出:4

4、yield from和yield的相同和不同點是什么

相同點:

1)都是用來返回和暫停

2)都是生成器函數(shù),返回generator對象。

不同點:

1)返回給的對象不一樣。

(也就是:用yield for和yiled修飾函數(shù)有什么不同?也就是返回給的函數(shù)不一樣。)

yield產(chǎn)出的值返回給當前調(diào)用的函數(shù)。yiled from返回給當前調(diào)用函數(shù)的上一個調(diào)用函數(shù)。

  • a. yield產(chǎn)生一個值,并將起返回給調(diào)用者;
  • b. yield from 用于委托部分工作給另外一個生成器。它在生成器中使用,可以將另外一個生成器/迭代器產(chǎn)出的值直接返回給調(diào)用者。

代碼說明如下:

def generate_list():
    return [1,3,4,5]

def while_yiled():
    for i in range(0,2):
        yield generate_list()

def while_yiled_from():
    for i in range(0,2):
        yield from generate_list()

print(list(while_yiled()))
print(list(while_yiled_from()))

輸出:
[[1, 3, 4, 5], [1, 3, 4, 5]]
[1, 3, 4, 5, 1, 3, 4, 5]

解讀如上代碼:

1、def while_yiled(): ...

生成器函數(shù)while_yiled() ,每次循環(huán)中生成[1,3,4,5], 把作為一個單獨的元素返回給調(diào)用者print()函數(shù),2次循環(huán),得到了2個[1,3,4,5]元素,即結(jié)果為[[1,3,4,5]],[1,3,4,5]]]

2、while_yiled_from()

另外一個生成器函數(shù)while_yiled_from(),每次循環(huán)生成[1,3,4,5],直接把每個元素逐個返回給調(diào)用者print(),2次循環(huán),得到了共8個元素,即結(jié)果為[1,3,4,5,1,3,4,5]

總結(jié):

while_yiled()和while_yiled_from()兩個生成器函數(shù)中,使用了不同的生成器特性:

  • yiled返回整個結(jié)果給調(diào)用者。
  • yiled form直接將返回的值逐個返回給調(diào)用者。

5、解讀如下代碼

def nested_generator():
    yield 1
    yield 2
    yield 3

def main_generator_yeild_form():
    yield 'Start'
    yield from nested_generator()
    yield 'End'


def main_generator_no_yield():
    yield 'Start'
    nested_generator()
    yield 'End'

def main_generator_only_yield():
    yield 'Start'
    yield nested_generator()
    yield 'End'


def try_yiled_from():
    for item in main_generator_yeild_form():
        print(item)
    print('main_generator_yeild_form\n\n')


    for item in main_generator_only_yield():
        print(item)
    print('main_generator_only_yield\n\n')


    for item in main_generator_no_yield():
        print(item)
    print('main_generator_no_yield\n\n')


try_yiled_from()

輸出:
Start
1
2
3
End
main_generator_yeild_form


Start
<generator object nested_generator at 0x7fa9f4528930>
End
main_generator_only_yield


Start
End
main_generator_no_yield

 1、def main_generator_yeild_form():...

生成器函數(shù),使用yeild from 委托 nested_generator() 生成器進行工作,將返回的每個元素直接逐個給了調(diào)用者try_yiled_from中的main_generator_yeild_form(),所以結(jié)果就是:start、1、2、3、end

 2、def main_generator_no_yield():...

生成器函數(shù),因為調(diào)用nested_generato()是并沒有使用yield、yield from,所以并沒有將nested_generato()產(chǎn)生的值返回給調(diào)用者。nested_generato()仍然會產(chǎn)生值,但是在調(diào)用者try_yiled_from中的main_generator_no_yield()中,并沒有返回,或者捕獲到。因此它的值不會被輸出。廢值,沒用過。

 3、def main_generator_only_yield():...

生成器函數(shù),調(diào)用nested_generato()是使用yield,所以返回的是生成器本身,并不是nested_generato()產(chǎn)生的值,所以輸出結(jié)果為start, nested_generato()生成器對象,end。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python多線程中的定時器你了解嗎

    python多線程中的定時器你了解嗎

    這篇文章主要為大家介紹了python多線程中的定時器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python3創(chuàng)建Django項目的幾種方法(3種)

    Python3創(chuàng)建Django項目的幾種方法(3種)

    這篇文章主要介紹了Python3創(chuàng)建Django項目的幾種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • PyQt 異步任務多線程的幾種方案示例詳解

    PyQt 異步任務多線程的幾種方案示例詳解

    文章總結(jié)了多線程異步編程的不同方式,包括QThread、QThreadPool和concurrent.futures,分別適用于不同場景,本文結(jié)合實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-01-01
  • Python對接六大主流數(shù)據(jù)庫(只需三步)

    Python對接六大主流數(shù)據(jù)庫(只需三步)

    這篇文章主要介紹了Python對接六大主流數(shù)據(jù)庫(只需三步),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python之列表推導式最全匯總(中篇)

    Python之列表推導式最全匯總(中篇)

    這篇文章主要介紹了Python之列表推導式最全匯總(中篇),本文章內(nèi)容詳細,通過案例可以更好的理解列表推導式的相關(guān)知識,本模塊分為了三部分,本次為中篇,需要的朋友可以參考下
    2023-01-01
  • python實現(xiàn)固定尺寸圖像拼接

    python實現(xiàn)固定尺寸圖像拼接

    這篇文章主要為大家詳細介紹了python實現(xiàn)固定尺寸圖像拼接,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python run()函數(shù)和start()函數(shù)的比較和差別介紹

    Python run()函數(shù)和start()函數(shù)的比較和差別介紹

    這篇文章主要介紹了Python run()函數(shù)和start()函數(shù)的比較和差別介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python3圖片轉(zhuǎn)換二進制存入mysql

    python3圖片轉(zhuǎn)換二進制存入mysql

    MYSQL是支持把圖片存入數(shù)據(jù)庫的,也相應的有一個專門的字段BLOB (Binary Large Object),即較大的二進制對象字段,看下面代碼
    2013-12-12
  • Python使用到第三方庫PyMuPDF圖片與pdf相互轉(zhuǎn)換

    Python使用到第三方庫PyMuPDF圖片與pdf相互轉(zhuǎn)換

    今天為大家介紹個比較簡單的Python第三方庫PyMuPDF進行圖片和pdf之間的相互轉(zhuǎn)換,以下就是利用PyMuPDF進行pdf與圖片之間的互轉(zhuǎn)
    2019-05-05
  • python操作oracle的完整教程分享

    python操作oracle的完整教程分享

    下面小編就為大家分享一篇python操作oracle的完整教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2018-01-01

最新評論

邵阳市| 聂拉木县| 鄂尔多斯市| 威宁| 瑞丽市| 石景山区| 涟水县| 蒙城县| 夏津县| 诸城市| 驻马店市| 湘潭县| 阳谷县| 营口市| 黄平县| 高陵县| 博乐市| 珠海市| 霞浦县| 无极县| 昌宁县| 岳阳市| 乌拉特前旗| 星座| 噶尔县| 南丹县| 固阳县| 朝阳区| 什邡市| 乌拉特后旗| 玉龙| 云霄县| 鄂托克旗| 旬邑县| 明水县| 资源县| 伊春市| 普安县| 金寨县| 桃江县| 班戈县|