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

Python?迭代器和生成器概念及場景分析

 更新時間:2025年04月12日 08:49:01   作者:Mysticbinary  
yield 是 Python 中實現(xiàn)惰性計算和協(xié)程的核心工具,結(jié)合 send()、throw()、close() 等方法,能夠構(gòu)建高效、靈活的數(shù)據(jù)流和控制流模型,這篇文章主要介紹了Python?迭代器和生成器概念,需要的朋友可以參考下

迭代器的介紹

迭代器的定義:迭代器(Iterator)是 Python 中用于遍歷數(shù)據(jù)集合的核心機制。它提供了一種統(tǒng)一的方式來訪問容器(如列表、字典、文件等)中的元素,而無需關(guān)心底層數(shù)據(jù)結(jié)構(gòu)的具體實現(xiàn)。迭代器的核心特點是按需生成數(shù)據(jù),避免一次性加載所有數(shù)據(jù)到內(nèi)存。

迭代器適合處理大型數(shù)據(jù)、無限序列或需要惰性計算的場景。

迭代器的核心概念:

  • 迭代器協(xié)議

    • 一個對象要成為迭代器,必須實現(xiàn)以下兩個方法:
      • __iter__():返回迭代器對象本身(通常直接 return self)。
      • __next__():返回下一個元素,若沒有更多元素則拋出 StopIteration 異常。
    • Python 的 for 循環(huán)、next() 函數(shù)等底層都依賴這一協(xié)議。
  • 可迭代對象(Iterable) VS 迭代器(Iterator)

    差異體現(xiàn)在遍歷機制:

    • 可迭代對象:實現(xiàn)了 __iter__() 方法,可以返回一個迭代器的對象(如列表、元組、字典)。
    • 迭代器:實現(xiàn)了 __iter__() 和 __next__() 方法的對象。
    • 所有迭代器都是可迭代對象,但可迭代對象本身不一定是迭代器。

可迭代對象
每次調(diào)用 iter() 會生成新的迭代器,因此可被多次遍歷:

my_list = [1, 2, 3]
for x in my_list: print(x)  # 輸出 1,2,3
for x in my_list: print(x)  # 再次輸出 1,2,3

迭代器
遍歷是一次性的,遍歷完成后無法重置:

iterator = iter(my_list)
for x in iterator: print(x)  # 輸出 1,2,3
for x in iterator: print(x)  # 無輸出(迭代器已耗盡)

自定義迭代器

示例 1: 通過類實現(xiàn)迭代器

class CountUpTo:
    def __init__(self, max_num):
        self.max_num = max_num
        self.current = 0
    def __iter__(self):
        return self  # 返回迭代器本身
    def __next__(self):
        if self.current < self.max_num:
            self.current += 1
            return self.current
        else:
            raise StopIteration  # 終止迭代
# 使用自定義迭代器
counter = CountUpTo(3)
for num in counter:
    print(num)  # 輸出 1, 2, 3

示例 2: 通過生成器函數(shù)實現(xiàn)(簡化版)
生成器函數(shù)(使用 yield)是創(chuàng)建迭代器的快捷方式:

def count_up_to(max_num):
    current = 0
    while current < max_num:
        current += 1
        yield current
# 生成器返回的也是迭代器
for num in count_up_to(3):
    print(num)  # 輸出 1, 2, 3

省略的迭代器

寫過for循環(huán)的都知道,我沒用迭代器呀!
用了!只不過是編譯器幫你用了。

以下兩段代碼完全等價:

# 直接遍歷列表
my_list = [1, 2, 3, 4, 5]
for x in my_list:
    print(x)
# 等價的手動迭代器操作
iterator = iter(my_list)  # 自動調(diào)用 __iter__() 獲取迭代器
while True:
    try:
        x = next(iterator)  # 自動調(diào)用 __next__()
        print(x)
    except StopIteration:
        break  # 自動處理終止

為什么不需要顯式寫迭代器?

  • 語法糖(Syntactic Sugar):for 循環(huán)是 Python 提供的一種簡化語法,隱藏了迭代器的創(chuàng)建和異常處理細節(jié)。

  • 統(tǒng)一接口:所有可迭代對象(如列表、元組、字典、集合、字符串等)都可以通過 for 循環(huán)統(tǒng)一處理,無需關(guān)心底層是列表還是其他數(shù)據(jù)結(jié)構(gòu)。

生產(chǎn)器的介紹

yield是個英文動詞,也是名詞,含義是生產(chǎn)的意思。

yield 在 Python里就是生成器。

yield的定義:Python 的 yield 關(guān)鍵字用于定義生成器函數(shù)(Generator Function),生成器是一種特殊的迭代器,能夠按需生成值并暫停/恢復(fù)執(zhí)行狀態(tài)。它的核心特性是惰性求值(Lazy Evaluation),適用于處理大數(shù)據(jù)流、無限序列或需要節(jié)省內(nèi)存的場景。

核心概念:

  • 生成器函數(shù)

    • 使用 yield 代替 return 的函數(shù)。
    • 調(diào)用生成器函數(shù)時,返回一個生成器對象(迭代器),而非直接執(zhí)行函數(shù)體。
    • 生成器通過 next() 或 for 循環(huán)逐步執(zhí)行,每次遇到 yield 時暫停,返回 yield 后的值,并在下次調(diào)用時從暫停處繼續(xù)執(zhí)行。
  • 與普通函數(shù)的區(qū)別

    • 普通函數(shù)一次執(zhí)行完畢,返回一個結(jié)果。
    • 生成器函數(shù)逐步產(chǎn)生多個值,并在 yield 處保持狀態(tài)。

與 return 的區(qū)別:

特性yieldreturn
返回值數(shù)量可多次返回值僅返回一次
函數(shù)狀態(tài)暫停并保留狀態(tài)終止函數(shù)執(zhí)行
返回類型生成器對象(迭代器)直接返回值
內(nèi)存占用低(按需生成)高(一次性生成所有數(shù)據(jù))

yield的普通用法

示例 1: 簡單生成器

def simple_generator():
    yield 1
    yield 2
    yield 3
gen = simple_generator()
print(next(gen))  # 輸出 1
print(next(gen))  # 輸出 2
print(next(gen))  # 輸出 3
# 繼續(xù)調(diào)用 next(gen) 會拋出 StopIteration 異常

示例 2: 用 for 循環(huán)遍歷生成器

def count_up_to(n):
    i = 0
    while i < n:
        yield i
        i += 1
for num in count_up_to(5):
    print(num)  # 輸出 0, 1, 2, 3, 4

yield的高級用法

通過 send() 傳遞值生成器可以通過 send(value) 接收外部傳入的值,賦值給 yield 表達式:

def generator_with_send():
	value = yield "Ready to receive"
	yield f"Received: {value}"
gen = generator_with_send()
print(next(gen))         # 輸出 "Ready to receive"
print(gen.send("Hello")) # 輸出 "Received: Hello"

yield from 委托生Python 3.3+ 引入 yield from,用于簡化嵌套生成器的操作:

def sub_generator():
	yield "A"
	yield "B"
def main_generator():
	yield from sub_generator()
	yield "C"
for item in main_generator():
	print(item)  # 輸出 A, B, C

異常處理生成器可以通過 throw() 方法接收異常:

def generator_with_exception(value):
	try:
		yield 10 / value
	except ZeroDivisionError as e:
		yield "Caught ValueError"
gen = generator_with_exception(2)
print(next(gen))
gen = generator_with_exception(0)
print(next(gen))

out:

5.0
Caught ValueError

yidle的實際應(yīng)用案例

大數(shù)據(jù)處理

def read_large_file(file_path):
    with open(file_path, "r") as file:
        for line in file:
            yield line.strip()  # 逐行生成,避免一次性加載到內(nèi)存
for line in read_large_file("data.txt"):
    process(line)

生成無限序列

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
fib = fibonacci()
print([next(fib) for _ in range(10)])  # 前10個斐波那契數(shù)

協(xié)程(Coroutine)

def coroutine():
    while True:
        task = yield
        print(f"Processing: {task}")
worker = coroutine()
next(worker)       # 啟動協(xié)程
worker.send("Task1")  # 輸出 "Processing: Task1"
worker.send("Task2")  # 輸出 "Processing: Task2"

在 Python 中,協(xié)程(Coroutine) 是一種可以暫停和恢復(fù)執(zhí)行的函數(shù),它能與調(diào)用方進行雙向通信(接收和發(fā)送數(shù)據(jù)),常用于實現(xiàn)協(xié)作式多任務(wù)(非搶占式任務(wù)切換)。

上文提供的代碼是一個典型的基于生成器的協(xié)程(Generator-based Coroutine)。

總結(jié)

yield 是 Python 中實現(xiàn)惰性計算協(xié)程的核心工具,結(jié)合 send()、throw()close() 等方法,能夠構(gòu)建高效、靈活的數(shù)據(jù)流和控制流模型。

到此這篇關(guān)于Python 迭代器和生成器概念的文章就介紹到這了,更多相關(guān)Python 迭代器和生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PyCharm添加python庫的方法步驟

    PyCharm添加python庫的方法步驟

    在使用PyCharm過程中,有時候需要添加需要的Python擴展庫,本文主要介紹了PyCharm添加python庫的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • django前端頁面下拉選擇框默認值設(shè)置方式

    django前端頁面下拉選擇框默認值設(shè)置方式

    這篇文章主要介紹了django前端頁面下拉選擇框默認值設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Python?的矩陣傳播機制Broadcasting和矩陣運算

    Python?的矩陣傳播機制Broadcasting和矩陣運算

    這篇文章主要介紹了Python?的矩陣傳播機制Broadcasting和矩陣運算,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • python如何利用matplotlib繪制并列雙柱狀圖并標注數(shù)值

    python如何利用matplotlib繪制并列雙柱狀圖并標注數(shù)值

    Python之中最好的圖表庫叫matplotlib,matplotlib,顧名思義就是提供了一整套和matlab相似的API,它的文檔相當(dāng)完備,下面這篇文章主要給大家介紹了關(guān)于python如何利用matplotlib繪制并列雙柱狀圖并標注數(shù)值的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Python實現(xiàn)將羅馬數(shù)字轉(zhuǎn)換成普通阿拉伯?dāng)?shù)字的方法

    Python實現(xiàn)將羅馬數(shù)字轉(zhuǎn)換成普通阿拉伯?dāng)?shù)字的方法

    這篇文章主要介紹了Python實現(xiàn)將羅馬數(shù)字轉(zhuǎn)換成普通阿拉伯?dāng)?shù)字的方法,簡單分析了羅馬數(shù)字的構(gòu)成并結(jié)合實例形式給出了Python轉(zhuǎn)換羅馬數(shù)字為阿拉伯?dāng)?shù)字的實現(xiàn)方法,需要的朋友可以參考下
    2017-04-04
  • Django重設(shè)Admin密碼過程解析

    Django重設(shè)Admin密碼過程解析

    這篇文章主要介紹了Django重設(shè)Admin密碼過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作示例

    Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作示例

    這篇文章主要介紹了Python爬蟲爬取電影票房數(shù)據(jù)及圖表展示操作,結(jié)合實例形式分析了Python爬蟲爬取、解析電影票房數(shù)據(jù)并進行圖表展示操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03
  • pytest用yaml文件編寫測試用例流程詳解

    pytest用yaml文件編寫測試用例流程詳解

    這篇文章主要介紹了pytest用yaml文件編寫測試用例流程,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題

    淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題

    今天小編就為大家分享一篇淺談SciPy中的optimize.minimize實現(xiàn)受限優(yōu)化問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python基礎(chǔ)教程之類class定義使用方法

    python基礎(chǔ)教程之類class定義使用方法

    Python中的類(Class)是一個抽象的概念,比函數(shù)還要抽象,這也就是Python的核心概念,面對對象的編程方法(OOP),其它如:Java、C++等都是面對對象的編程語言
    2014-02-02

最新評論

将乐县| 鄂托克前旗| 平邑县| 辉南县| 涿鹿县| 边坝县| 资兴市| 繁昌县| 二连浩特市| 岫岩| 资兴市| 阳东县| 陈巴尔虎旗| 东丰县| 南部县| 平顺县| 东阿县| 巫山县| 习水县| 吐鲁番市| 海安县| 长乐市| 泰兴市| 阿城市| 邹城市| 芜湖县| 泽普县| 灌南县| 隆德县| 阳春市| 富蕴县| 万州区| 金乡县| 巴塘县| 五华县| 瑞昌市| 页游| 丹凤县| 淳安县| 诏安县| 金川县|