Python中的 for 與 迭代器

文章目錄

  • 一、`for` 循環的底層機制
    • 示例:手動模擬 `for` 循環
  • 二、可迭代對象 vs 迭代器
    • 關鍵區別:
  • 三、`for` 循環的典型應用場景
    • 1. 遍歷序列類型
    • 2. 遍歷字典
    • 3. 結合 `range()` 生成數字序列
    • 4. 遍歷文件內容
  • 四、迭代器的自定義實現
    • 示例:生成斐波那契數列的迭代器
  • 五、生成器(簡化迭代器)
        • 示例:生成偶數序列
  • 六、迭代工具庫 `itertools`
    • 示例:合并多個迭代器
  • 七、常見問題與最佳實踐🐥🐥
    • 1. 避免在迭代中修改集合
    • 2. 使用 `enumerate()` 獲取索引
    • 3. 利用 `zip()` 并行遍歷
  • 總結

在 Python 中, for 循環與迭代器(iterator)緊密結合,它們共同實現了對可迭代對象(iterable)的高效遍歷。以下是詳細解析及實際應用示例:


一、for 循環的底層機制

for 循環本質上是通過迭代器協議工作的:

  1. 自動調用 iter() 函數,將可迭代對象(如列表、字符串、字典)轉換為迭代器。
  2. 反復調用 next() 函數獲取元素,直到觸發 StopIteration 異常時退出循環。

示例:手動模擬 for 循環

numbers = [1, 2, 3]
iterator = iter(numbers)  # 轉換為迭代器
while True:try:num = next(iterator)  # 獲取下一個元素print(num)except StopIteration:    # 遍歷完成break
# 輸出:1 2 3

二、可迭代對象 vs 迭代器

類別定義示例
可迭代對象實現了 __iter__() 方法的對象list, str, dict
迭代器實現了 __iter__()__next__() 方法的對象iterator = iter([1,2,3])

關鍵區別:

  • 可迭代對象:可被多次遍歷(每次 for 循環會創建新迭代器)。
  • 迭代器:遍歷一次后耗盡(無法重置,再次調用 next() 會觸發異常)。

三、for 循環的典型應用場景

1. 遍歷序列類型

# 遍歷列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:print(fruit)# 遍歷字符串
text = "Hello"
for char in text:print(char)

2. 遍歷字典

person = {"name": "Alice", "age": 30, "city": "Paris"}
for key in person:           # 默認遍歷鍵print(key)for key, value in person.items():  # 同時遍歷鍵值對print(f"{key}: {value}")

3. 結合 range() 生成數字序列

for i in range(3):        # 0, 1, 2print(i)for i in range(1, 5, 2):  # 1, 3print(i)
注意:range()作為Python中的一個內置函數,調用會產生一個迭代序列。
如果range()產生的序列為空,那么用該迭代器控制for循環的時候,
其循環體將一次也不執行,循環立刻結束。

4. 遍歷文件內容

with open("data.txt", "r") as file:for line in file:      # 逐行讀取文件print(line.strip())

四、迭代器的自定義實現

通過實現 __iter__()__next__() 方法創建自定義迭代器。

示例:生成斐波那契數列的迭代器

class FibonacciIterator:def __init__(self, max_count):self.max_count = max_countself.count = 0self.a, self.b = 0, 1def __iter__(self):return selfdef __next__(self):if self.count >= self.max_count:raise StopIterationresult = self.aself.a, self.b = self.b, self.a + self.bself.count += 1return result# 使用迭代器
fib = FibonacciIterator(5)
for num in fib:print(num)  # 輸出:0 1 1 2 3

五、生成器(簡化迭代器)

使用 yield 關鍵字快速創建迭代器,無需手動實現類。

示例:生成偶數序列
def even_numbers(max_num):num = 0while num <= max_num:yield numnum += 2for n in even_numbers(10):print(n)  # 輸出:0 2 4 6 8 10

六、迭代工具庫 itertools

Python 內置的 itertools 模塊提供多種高級迭代器操作:

示例:合并多個迭代器

import itertools   #不要忘了!!!numbers = [1, 2]
letters = ['a', 'b']# 笛卡爾積
for pair in itertools.product(numbers, letters):print(pair)  # (1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')# 無限計數器
counter = itertools.count(start=10, step=3)
print(next(counter))  # 10
print(next(counter))  # 13
print(next(counter))  # 16
print(next(counter))  # 19

七、常見問題與最佳實踐🐥🐥

1. 避免在迭代中修改集合

# 錯誤示例:遍歷時刪除元素會導致意外跳過
numbers = [1, 2, 3, 4]
for num in numbers:if num % 2 == 0:numbers.remove(num)  # 危險操作!
print(numbers)  # 輸出 [1, 3]# 正確方法:遍歷副本或使用列表推導式
numbers = [num for num in numbers if num % 2 != 0]

2. 使用 enumerate() 獲取索引

fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits, start=1):  # 索引從1開始print(f"{index}. {fruit}")

輸出:

1. apple
2. banana
3. cherry

3. 利用 zip() 并行遍歷

names = ["Alice", "Bob"]
ages = [24, 30]
for name, age in zip(names, ages):print(f"{name} is {age} years old")

輸出:

Alice is 24 years old
Bob is 30 years old

總結

  • for 循環本質:基于迭代器協議,自動處理 iter()next()
  • 迭代器優勢:惰性計算(節省內存),適合處理大型數據集。
  • 生成器簡化:使用 yield 快速創建迭代器。
  • 工具擴展:利用 itertools 模塊實現復雜迭代邏輯。

掌握迭代器機制,可以編寫更高效、靈活的 Python 代碼!
喵,就是這樣~😼😼😼

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78043.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytest教程:為什么Pytest要用插件模式?

目錄 一、歷史背景:測試框架的局限性與Pytest的設計哲學 1.1 早期測試框架的困境 1.2 Pytest的模塊化設計 二、橫向對比:插件機制如何讓Pytest脫穎而出 2.1 與Unittest/Nose的對比 2.2 插件模式的架構優勢 三、插件模式的核心優勢解析 3.1 可擴展性:從單元測試到全鏈…

【深度】如何通過MCP實現多智能體之間的協同

來源&#xff1a;騰訊技術工程、infoQ、原力注入 自 OpenAI 于 2023 年發布函數調用功能以來&#xff0c;我一直在思考如何構建一個開放的智能體與工具使用生態系統。隨著基礎模型愈發智能化&#xff0c;智能體與外部工具、數據和 API 的交互能力卻日益碎片化&#xff1a;開發…

NVIDIA自動駕駛安全與技術讀后感

ll在閱讀了 NVIDIA 自動駕駛安全報告后&#xff0c;我對該公司致力于推進自動駕駛汽車&#xff08;AV&#xff09;技術、同時優先考慮安全和標準化的承諾印象深刻。它揭示了 NVIDIA 在功能安全、法規合規性以及與全球標準組織合作方面的嚴謹態度。 ?? 報告中最引人注目的部分…

關于nginx,負載均衡是什么?它能給我們的業務帶來什么?怎么去配置它?

User 關于nginx&#xff0c;我還想知道&#xff0c;負載均衡是什么&#xff1f;它能為我的業務帶來什么&#xff1f;怎么去配置它&#xff1f; Assistant 負載均衡是 Nginx 另一個非常強大的功能&#xff0c;也是構建高可用、高性能應用的關鍵技術之一。我們來詳細了解一下。 …

前端如何優雅地對接后端

作為一名前端開發者&#xff0c;與后端對接是我們日常工作中不可避免的一部分。從API設計的理解到錯誤處理的優雅實現&#xff0c;前端需要的不只是調用接口的代碼&#xff0c;更是一種協作的藝術。本文將從Vue 3項目出發&#xff0c;分享如何與后端高效協作&#xff0c;減少聯…

PYTHON用幾何布朗運動模型和蒙特卡羅MONTE CARLO隨機過程模擬股票價格可視化分析耐克NKE股價時間序列數據

原文鏈接&#xff1a;http://tecdat.cn/?p27099 金融資產/證券已使用多種技術進行建模。該項目的主要目標是使用幾何布朗運動模型和蒙特卡羅模擬來模擬股票價格。該模型基于受乘性噪聲影響的隨機&#xff08;與確定性相反&#xff09;變量&#xff08;點擊文末“閱讀原文”獲取…

頭歌之動手學人工智能-機器學習 --- PCA

目錄 第1關&#xff1a;維數災難與降維 第2關&#xff1a;PCA算法流程 任務描述 編程要求 測試說明 第3關&#xff1a;sklearn中的PCA 任務描述 編程要求 測試說明 第1關&#xff1a;維數災難與降維 第2關&#xff1a;PCA算法流程 任務描述 本關任務&#xff1a;補充…

IOMUXC_SetPinMux的0,1參數解釋

IOMUXC_SetPinMux(IOMUXC_ENET1_RX_DATA0_FLEXCAN1_TX, 0); 這里的第二個參數 0 實際上傳遞給了 inputOnfield&#xff0c;它控制的是 SION&#xff08;Software Input On&#xff09;位。 當 inputOnfield 為 0 時&#xff0c;SION 關閉&#xff0c;此時引腳的輸入/輸出方向由…

express響應設置 以及redirect,download,json.sendFdile

Express 中常用響應方法 的整理&#xff0c;包括設置響應頭、重定向、下載、發送 JSON、發送文件等&#x1f447; &#x1f4e4; 一、設置響應頭與狀態碼 設置狀態碼 res.status(404).send(Not Found);設置響應頭 res.set(Content-Type, text/plain); // 設置內容類型 res.s…

深度學習-數值穩定性和模型初始化

到目前為止&#xff0c;我們實現的每個模型都是根據某個預先制定的分布來初始化模型的參數&#xff0c;有人會認為初始化方案時理所當然的&#xff0c;忽略了如何做出這些選擇的細節&#xff0c;甚至有人可能會覺得&#xff0c;初始化方案的選擇并不是特別重要&#xff0c;實際…

SFINAE(Substitution Failure Is Not An Error)

C 中的 SFINAE&#xff08;替換失敗并非錯誤&#xff09; SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;是 C 模板元編程的核心機制之一&#xff0c;允許在編譯時根據類型特性選擇不同的模板實現。以下通過代碼示例和底層原理&#xff0c;逐步解析 SFI…

【Python筆記 04】輸入函數、轉義字符

一、Input 輸入函數 prompt是提示&#xff0c;會在控制臺顯示&#xff0c;用作提示函數。 name input("請輸入您的姓名&#xff1a;") print (name)提示你輸入任意信息&#xff1a; 輸入input test后回車&#xff0c;他輸出input test 二、常用的轉義字符 只講…

什么是量子計算?它能做什么?

拋一枚硬幣。要么正面朝上&#xff0c;要么反面朝上&#xff0c;對吧&#xff1f;當然&#xff0c;那是在我們看到硬幣落地的結果之后。但當硬幣還在空中旋轉時&#xff0c;它既不是正面也不是反面&#xff0c;而是正面和反面都有一定的可能性。 這個灰色地帶就是量子計算的簡…

入門 Go 語言

本專欄的 Go 語言學習參考了B站UP 軟件工藝師的視頻 本節需要&#xff1a; Go 語言環境VSCode 安裝環境 下載 Go 環境&#xff0c;并安裝下載 VSCode&#xff0c;安裝。在 VSCode 中安裝 Go 擴展&#xff1a; 接下來就可以編寫 Go 語言了 第一條 Go Go 語言是一種編譯型…

Oracle EBS R12.2 漢化

一、前言 在使用oracle ebs時&#xff0c;使用中文會更好的理解整個ebs流程&#xff0c;以下介紹oracle r12中文補丁的方式 如果你的系統除了支持英語外&#xff0c;還支持其他語言&#xff0c;比如中文&#xff0c;那你在下載補丁的時候除了下載Generic Platform版本外&#…

參考文獻新國標GB/T 7714-2025的 biblatex 實現

參考文獻新國標GB/T 7714-2025的biblatex實現 新版 GB/T 7714 目前正在修訂和征求意見&#xff08;https://std.samr.gov.cn/gb/search/gbDetailed?id14CA9D282EB75AC8E06397BE0A0AEA2E&#xff09;。 根據已經呈現的草案&#xff0c;初步實現了biblatex樣式(詳見biblatex-gb…

Discuz!與DeepSeek的深度融合:打造智能網址導航新標桿

引言 在數字化信息爆炸的時代&#xff0c;網址導航網站作為用戶獲取優質資源、高效瀏覽互聯網的重要入口&#xff0c;其信息篩選能力、用戶體驗和商業化潛力成為了決定其競爭力的核心要素。Discuz!作為國內應用廣泛的社區論壇系統&#xff0c;以其強大的功能擴展性和用戶管理能…

Linux424 chage密碼信息 gpasswd 附屬組

https://chat.deepseek.com/a/chat/s/e55a5e85-de97-450d-a19e-2c48f6669234

【低配置電腦預訓練minimind的實踐】

低配置電腦預訓練minimind的實踐 概要 minimind是一個輕量級的LLM大語言模型&#xff0c;項目的初衷是拉低LLM的學習門檻&#xff0c;讓每個人都能從理解每一行代碼開始&#xff0c; 從零開始親手訓練一個極小的語言模型。對于很多初學者而言&#xff0c;電腦配置僅能夠滿足日…

docker部署Ollama并簡單調用模型

Ollama簡介 Ollama 是一個開源的大型語言模型&#xff08;LLM&#xff09;平臺&#xff0c;旨在讓用戶能夠輕松地在本地運行、管理和與大型語言模型進行交互。 Ollama 提供了一個簡單的方式來加載和使用各種預訓練的語言模型&#xff0c;支持文本生成、翻譯、代碼編寫、問答等…