Python學習4---迭代器和生成器的區別

一、迭代器
定義:迭代器是一個可以記住遍歷的位置的對象。迭代器對象必須實現兩個方法,iter() 和 next()。字符串、列表或元組等數據類型都是可迭代對象,但它們不是迭代器,因為它們不具有 next() 方法。迭代器對象用于遍歷可迭代對象(如集合、列表等)的元素。

作用
遍歷數據:迭代器提供了一種統一的、不依賴于索引的遍歷數據的方式。
解耦數據與遍歷邏輯:迭代器將數據的存儲和數據的遍歷操作分離,使得兩者可以獨立地改變。
支持多種遍歷方式:迭代器不僅支持線性遍歷,還支持其他復雜的遍歷方式(如回溯、深度優先搜索等)。

應用場景
遍歷集合:迭代器常用于遍歷列表、元組、字典、集合等數據結構。
自定義遍歷邏輯:可以通過實現迭代器接口來定義自己的數據結構和遍歷邏輯。

代碼示例:
下面是一個簡單的迭代器示例,用于遍歷一個自定義的集合:

class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))  # 輸出 1
print(next(myiter))  # 輸出 2
print(next(myiter))  # 輸出 3

在這個例子中,MyNumbers 類實現了 iter() 和 next() 方法,因此它是一個迭代器。當我們調用 iter(myclass) 時,返回了一個迭代器對象 myiter。通過調用 next(myiter),我們可以逐個獲取迭代器產生的值。

二、生成器
定義:生成器是Python提供的一種可以迭代的對象,但它不是通過列表或元組等數據結構來實現的,而是通過函數來實現。一個生成器函數看起來就像一個普通的函數,但它在需要返回值的地方使用yield關鍵字代替return。
當生成器函數被調用時,它并不執行,而是返回一個迭代器,這個迭代器可以用來遍歷函數中的yield語句產生的值。

作用
節省內存:生成器允許你聲明一個函數,這個函數可以一次返回一個值,而不是一次性地在內存中生成所有的值。這對于大數據集或無限序列來說特別有用,因為它不會占用過多的內存。
惰性求值:生成器使用惰性求值的方式,只有在需要時才計算下一個值,而不是一開始就計算所有值。
簡化代碼:生成器提供了一種簡潔的方式來處理迭代邏輯,特別是當迭代邏輯比較復雜時。

應用場景
大數據處理:當處理大量數據時,使用生成器可以逐步處理數據,而不是一次性加載所有數據到內存中。
無限序列:生成器可以用來生成無限序列,例如斐波那契數列,因為生成器只在需要時才計算下一個值,所以不會導致內存溢出。
簡化迭代邏輯:當迭代邏輯比較復雜,使用傳統的for循環不方便時,可以使用生成器來簡化代碼。

代碼示例
下面是一個簡單的生成器函數示例,用于生成一個無限遞增的序列:

def infinite_sequence():num = 0whileTrue:yield numnum += 1# 創建一個生成器對象
seq = infinite_sequence()# 使用next()函數獲取生成器的下一個值
print(next(seq))  # 輸出 0
print(next(seq))  # 輸出 1
print(next(seq))  # 輸出 2
# 以此類推...

在這個例子中,infinite_sequence函數是一個生成器函數,它使用yield語句來產生序列中的下一個值。當我們調用infinite_sequence()時,并沒有立即執行函數體中的代碼,而是返回了一個生成器對象seq通過調用next(seq),我們可以逐個獲取生成器產生的值。

需要注意的是,由于生成器函數在每次調用yield時都會暫停并保存當前的狀態,所以生成器函數可以在多次調用之間保持狀態。這也是生成器能夠逐個產生值的關鍵所在。

三、迭代器和生成器的區別
實現方式
迭代器:是遵循迭代器協議的對象,它們實現了 iter() 和 next() 方法。迭代器可以遍歷任何集合,無論集合的大小。
生成器:是一種特殊的迭代器,使用 yield 關鍵字而不是 return 來返回值。當生成器函數被調用時,它返回一個迭代器,這個迭代器按需生成值。

使用場景
迭代器:通常用于遍歷已經存在的集合(如列表、元組等)。
生成器:通常用于創建需要在迭代過程中逐個計算值的情況,如無限序列或大數據集。

內存效率
迭代器:如果集合很大,迭代器可能需要消耗較多的內存來存儲整個集合。
生成器:生成器只在需要時生成下一個值,因此更加內存高效,特別是對于大數據集或無限序列。

靈活性
迭代器:迭代器的實現相對固定,通常用于遍歷已存在的數據結構。
生成器:生成器使用函數來定義,因此它更加靈活,可以根據需要動態生成序列,而不需要預先生成一個完整的序列。

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

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

相關文章

冷卻塔由那些配件組成

1、淋水填料 將需要冷卻的水(熱水)多次濺灑成水滴或形成水膜,以增加水和空氣的接觸面積和時間,促進水和空氣的熱交換。 填料在開式橫流冷卻塔的作用是增加循環水與空氣的接觸面積,并延長冷卻水停留在空氣中的時間&am…

LabVIEW工業設備姿態監測系統

開發了一種基于LabVIEW的工業設備姿態監測系統,針對現有監測設備在適應性和反應時間上的不足,采用了LabVIEW軟件和STM32微控制器,通過高精度姿態傳感器實現了對設備姿態的快速準確監測,大大提高了工業作業的安全與效率。 項目背景…

C++深度解析教程筆記9-靜態成員變量,靜態成員函數,二階構造,友元,函數重載,操作符重載

C深度解析教程筆記9 第25課 - 類的靜態成員變量實驗-數對象個數(失敗)實驗-靜態變量小結 第26課 - 類的靜態成員函數實驗-修改對象的靜態變量數值實驗-利用靜態成員函數實驗-靜態變量靜態函數實現統計對象個數小結 第27課 - 二階構造模式實驗-初始化是否…

百度人臉識別Windows C++離線sdk C#接入

百度人臉識別Windows C離線sdk C#接入 目錄 說明 設計背景 ? 場景特點: ? 客戶特點: ? 核心需求: SDK 包結構 效果 代碼 說明 自己根據SDK封裝了動態庫,然后C#調用。 功能接口 設計背景 ? 場景特點: -…

【滲透入門】XSS

文章目錄 XSS漏洞XSS舉例XSS類型防御方式 XSS漏洞 XSS(Cross-Site Scripting,跨站腳本攻擊)是一種常見的Web應用程序安全漏洞。XSS漏洞發生在應用程序未能充分過濾用戶提供的數據,使得惡意腳本得以在不知情的用戶的瀏覽器中被執行…

ARFoundation系列講解 - 91 Immersal 簡介

一、Immersal 簡介 Immersal是一家專注于增強現實(AR)技術的公司,致力于開發和推廣空間感知解決方案(簡稱:大空間技術)。他們的核心產品是一個名為Immersal SDK的開發工具包,通過視覺定位(VPS)能夠輕松地在現實世界中實現高精度的定位和增強現實體驗。 二、Immersal …

Spring Boot集成Knife4j:實現高效API文檔管理

Spring Boot集成Knife4j:實現高效API文檔管理 在軟件開發過程中,編寫和維護接口文檔是一項必不可少的任務。隨著微服務架構的流行,API文檔的重要性日益凸顯。然而,傳統的手動編寫文檔方式不僅效率低下,而且容易出錯。…

支持前端路由權限和后端接口權限的企業管理系統模版

一、技術棧 前端:iview-admin vue 后端:springboot shiro 二、基于角色的權限控制 1、路由權限 即不同角色的路由訪問控制 2、菜單權限 即不同角色的菜單列表展示 3、按鈕權限 即不同角色的按鈕展示 4、接口權限 即不同角色的接口訪問控制 三…

數字化時代的生產革新:數字孿生平臺如何助力新質生產力

一.新質生產力 在當今快速發展的科技和信息時代,企業和組織在提高生產效率和質量方面面臨著越來越多的挑戰和機遇。新質生產力的概念應運而生,強調通過創新和技術進步,不僅提升生產的數量和速度,更重要的是優化生產方式、改善產品…

leetcode熱題100.分割等和子集(動態規劃)

分割等和子集 Problem: 416. 分割等和子集 思路 我選擇使用動態規劃的方法來解題。我們需要判斷是否可以將數組分割成兩個子集,使得這兩個子集的和相等。這個問題可以轉化為在數組中找到一個子集,使得其和等于數組總和的一半。 解題過程 首先&#xf…

消息隊列-RocketMQ

消息隊列-RocketMQ 1、RocketMQ是什么?2、RocketMQ有什么優缺點?3、消息隊列主要有哪幾種消息模型?4、RocketMQ主要使用哪種消息模型?5、RocketMQ的基本架構是怎樣的?有哪些核心組件?6、RocketMQ通過什么方式保證消息的可用性和可靠性?7、什么情況下會發生消息丟失?Roc…

設計模式大白話之裝飾者模式

想象一下,你走進一家咖啡館,點了一杯美式咖啡。但是,你可能還想根據自己的口味添加一些東西,比如奶泡、巧克力粉、焦糖醬或是肉桂粉。每次你添加一種配料,你的咖啡就會變得更豐富,同時價格也會相應增加。 在…

圖——圖的應用02最短路徑(Dijkstra算法與Floyd算法詳解),拓撲排序及關鍵路徑

前面介紹了圖的應用——01最小生成樹章節,大家可以通過下面的鏈接學習: 圖——圖的應用01最小生成樹(Prim算法與Kruskal算法詳解) 今天就講一下圖的其他應用——最短路徑,拓撲排序及關鍵路徑。 目錄 一&#xff0c…

HG/T 3655-2024 紫外光UV固化木器涂料檢測

紫外光UV固化木器涂料是指由活性低聚物、活性稀釋劑、光引發劑和其他成分組成的水性、非水性紫外光固化木器涂料,主要用于室內用木質地板、家具、裝飾板等木器的裝飾與保護。 HG/T 3655-2024紫外光UV固化木器涂料檢測項目: 測試指標 測試方法 在容器中…

成都亞恒豐創教育科技有限公司 【插畫猴子:筆尖下的靈動世界】

在浩瀚的藝術海洋中,每一種創作形式都是人類情感與想象力的獨特表達。而插畫,作為這一廣闊領域中的璀璨明珠,以其獨特的視覺語言和豐富的敘事能力,構建了一個又一個令人遐想連篇的夢幻空間。成都亞恒豐創教育科技有限公司 在眾多插…

MYSQL設計索引一般需要考慮哪些因素?

在設計MySQL索引時,確實需要綜合考慮多個因素以確保索引的有效性和性能優化。以下是您提到的參考思路的詳細擴展: 1. 數據量 數據量大小:通常,當表中的數據量超過一定閾值(如幾百條記錄)時,創…

Linux——進程概念詳解

一、進程的基本概念 在給進程下定義之前,我們先了解一下進程: 我們在編寫完代碼并運行起來時,在我們的磁盤中會形成一個可執行文件,當我們雙擊這個可執行文件時(程序時),這個程序會加載到內存…

動手學深度學習6.3 填充和步幅-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記,以及對課后練習的一些思考,自留回顧,也供同學之人交流參考。 本節課程地址:填充和步幅_嗶哩嗶哩_bilibili 代碼實現_嗶哩嗶哩_bilibili 本節教材地址:6.3. 填充和…

如何在 Ubuntu 14.04 服務器上使用 Nginx 安裝和保護 phpMyAdmin

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到網站。 介紹 像 MySQL 這樣的關系型數據庫管理系統在許多網站和應用程序中都是必不可少的。然而,并非所有用戶都習慣通過命令行來管…

oracle數據庫,怎么分頁查詢

項目場景: 使用oracle數據庫,怎么分頁查詢 問題描述 平常使用的最多的是MySQL DB, 用的是 limit 語句;Oracle DB, 沒有 limit 語句; 原因分析: 解決方案: SELECT * FROM (SELECT t.*, ROWNUM rn FROM…