python進階:可迭代對象和迭代器

一、Iterable(可迭代對象)

1、可迭代對象:能夠進行迭代操作的對象。

  • 可以理解為:能夠使用for循環遍歷的都是可迭代對象;**
  • 所有的可迭代對象,偶可以用內置函數iter轉換為迭代器**

2、可迭代對象包括:

  • 序列類型:元組、列表、字符串、range
  • 字典、集合
  • 文件對象(open(xxx))
  • 實現了迭代協議(iter)方法的對象
class Myclass1:"""實現迭代協議"""def __iter__(self):# return iter([111,22,33])m = Myclass1()
for i in m :print(i)
  • 實現了序列語義方法(getitem)的對象
class Myclass2:"""實現序列語義"""value = [11,22,33]def __getitem__(self, item):return self.value[item]m = Myclass2()
for i in m :print(i)

二、Iterator(迭代器)

**1、迭代器:**實現了迭代器協議的對象(__iter__方法和__next__方法)。

  • 能夠使用內置函數next進行逐個迭代數據的對象
li = [111,222,333]
itor = iter(li)
print(next(itor))#每次使用next都能迭代出一個數據
print(next(itor))

2、特性:

  • 迭代器內的數據只能迭代一次
  • 當迭代器內部的數據,迭代完,,迭代器就會進入停止狀態,如果再次通過next進行迭代就會拋出異常(StopIteration)

三、Generator(生成器;常用)

1、生成器:**生成器是迭代器的子類,可以把他當做一種特殊的迭代器,生成器支持支持迭代器所有的操作和特性。

2、生成器定義的方法:

  • 生成器表達式 g = (i for i in xxx)
  • 生成器函數:函數中使用了關鍵字yield的函數,都稱之為生成器函數;生成器函數調用時不會直接執行,會直接返回一個生成器對象
def test1():print("-------------1--------------")yield 1print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%")yield 2res = test1()
print(res)

這時打印出的test1函數為生成器對象

3、生成器的應用場景:

  • 在程序中使用上萬級別低的數據時,使用生成器來保存數據,可以顯著的減少內存開銷
    • 生成器內部不直接保存數據,只存儲生成數據低的規則(算法),使用next去獲取才會生成(用的時候才生產)
  • 可以使用生成器來實現函數內部的代碼分段執行(pytest中的fixture實現,python3.5以前的攜程實現

4、運行過程
當效用生成器函數時,他會返回一個生成器對象,該對象可以迭代獲取生成器函數中通過yield語句產生的值。每次迭代時,生成器函數會從上一次yield語句的位置繼續執行,直到再次遇到yield語句并產生下一個值,當超過迭代器中的數據全部取完以后,再取數據則會報錯

5、自動化框架中用到的生成器

使用pytest執行
import pytest@pytest.fixture()
def login_fixture():print("=====用例前置腳本=====")token = 'xxxxxxxx'yield tokenprint("=====用例后置腳本=====")def test_demo(login_fixture):print("=====執行測試用例中=====")

上面的是pytest封裝好的夾具功能,下面的代碼是模擬完整的使用夾具的過程

from inspect import signaturedef login_fixture():print("=====用例前置腳本=====")token = 'xxxxxxxx'yield tokenprint("=====用例后置腳本=====")def demo(login_fixture):print("=====執行測試用例中=====")if __name__ == '__main__':#自動化測試框架中夾具是如何運行的"""1、框架初始運行時,會對所有夾具進行收集,2、檢測用例中是否使用到了夾具,若,則去夾具列表中查詢同名的測試夾具3、存在同名測試夾具,,先執行夾具的前置,再執行測試用例,最后執行夾具的后置腳本"""##檢測函數中定義的參數res = signature(demo).parametersprint(res)#OrderedDict([('login_fixture', <Parameter "login_fixture">)])params = list(res.keys())print(params)#['login_fixture']#判斷參數中是否有同名的測試夾具#for key in params:#	pass#如果存在對應的測試夾具,先執行夾具的前置腳本f1 = login_fixture()res = next(f1)#再執行測試用例demo(res)#最后執行夾具的后置腳本try:next(f1)except StopIteration:pass

6、生成器的內置方法

  • close方法:關閉生成器,關閉后無法再生成數據了
def work():print("-------------1--------------")s1 = yield 1print("-------------2--------------s1=",s1)s2 = yield 2print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%s2=",s2)yield 3res = work()
print(next(res))
res.close()
print(next(res))
  • send方法:和內置函數next一樣,用來生成數據;但是send方法可以再生成數據的同時和生成器內部進行數據交換
    • 使用send方法之前,必須先通過next去生成至少一次數據(通過next去啟動生成器)
    • send方法必須要傳一個參數(值)且只能傳一個
    • send方法傳入的值,會傳到生成器內部上一次,掛起的yield處
def work():print("-------------1--------------")s1 = yield 1print("-------------2--------------s1=",s1)s2 = yield 2print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%s2=",s2)yield 3res = work()
print(next(res))
print(res.send('test1'))#執行時先返回已定義的數據
print(res.send('test'))

結果:
image.png

  • 主動生成器內部拋出異常(了解)
    • 當調用 generator.throw(exc_type, exc_value, traceback) 時,會在生成器內部當前暫停的位置引發一個異常。生成器會嘗試捕獲這個異常,并在適當的位置執行相應的異常處理邏輯。如果生成器內部沒有捕獲到這個異常,或者異常處理邏輯中拋出了新的異常,那么這個異常會傳播到生成器的調用處。
    • 相當于在生成器內部上一次掛起的位置,執行raise,拋出異常
generator.throw(exc_type, exc_value=None, traceback=None)- exc_type 表示要拋出的異常類型。- exc_value 表示異常的值,默認為 None- traceback 表示異常的回溯信息,默認為 None

PS:
回溯(traceback)信息是指當程序出現異常時,系統會生成一份包含異常發生位置及調用棧信息的報告。這份報告就是回溯信息。
回溯信息通常包含以下內容:

  • 異常類型(Exception Type):表示引發異常的類型,例如TypeError、ValueError等。
  • 異常值(Exception Value):表示異常的具體信息,通常是一個字符串,描述了異常的原因或相關信息。
  • 回溯棧(Traceback Stack):表示調用棧信息,即異常發生時代碼的執行路徑,從最內部的函數或方法開始,逐步向外展示調用關系。

回溯信息可以幫助開發者追蹤和定位異常發生的位置,以及異常拋出時的上下文信息。
在generator.throw()方法中,如果提供了回溯信息(traceback參數),那么該信息將包含在生成器捕獲的異常中,使得異常的回溯信息更加完整。如果沒有提供回溯信息,則系統會自動生成默認的回溯信息。

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

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

相關文章

藍橋杯題練習:平地起高樓

題目要求 function convertToTree(regions, rootId "0") {// TODO: 在這里寫入具體的實現邏輯// 將平鋪的結構轉化為樹狀結構&#xff0c;并將 rootId 下的所有子節點數組返回// 如果不存在 rootId 下的子節點&#xff0c;則返回一個空數組}module.exports convert…

網絡防御保護——課堂筆記

一.內容安全 攻擊可能只是一個點&#xff0c;防御需要全方面進行 IAE引擎 DFI和DPI技術 --- 深度檢測技術 DPI ---深度包檢測技術 ---主要針對完整的數據包&#xff08;數據包分片&#xff0c;分段需要重組&#xff09;&#xff0c;之后對數據包的內容進行識別。&#xff08;應…

ifcplusplus 示例 函數中英文 對照分析以及流程圖

有需求&#xff0c;需要分析 ifc c渲染&#xff0c;分析完&#xff0c;有 230個函數&#xff0c;才能完成一個加載&#xff0c;3d加載真的是大工程&#xff01; 示例代碼流程圖 函數中英文對照表&#xff0c;方便 日后開發&#xff0c;整理思路順暢&#xff01;&#xff01;&am…

C++三級專項 digit函數

在程序中定義一函數dight(n,k),他能分離出整數n從右邊數第k個數字。 輸入 正整數n和k。 輸出 一個數字。 輸入樣例 31859 3 輸出樣例 8解析&#xff1a;遞歸&#xff0c;詳情看code. 不準直接抄&#xff01;&#xff01;&#xff01; #include <iostream> usin…

包裝類和綜合練習

包裝類 基本數據類型對應的應用類型。 jdk5以后對包裝類新增了&#xff1a;自動拆箱、自動裝箱 我們以后如何獲取包裝類對象&#xff1a; 不需要new,不需要調用方法&#xff0c;直接賦值即可 package MyApi.a09jdkdemo;public class A_01IntergerDemo1 {public static voi…

C語言——指針的進階——第1篇——(第26篇)

堅持就是勝利 文章目錄 一、字符指針1、面試題 二、指針數組三、數組指針1、數組指針的定義2、&數組名 VS 數組名3、數組指針的使用&#xff08;1&#xff09;二維數組傳參&#xff0c;形參是 二維數組 的形式&#xff08;2&#xff09;二維數組傳參&#xff0c;形參是 指針…

【RT-Thread應用筆記】英飛凌PSoC 62 + CYW43012 WiFi延遲和帶寬測試

文章目錄 一、安裝SDK二、創建項目三、編譯下載3.1 編譯代碼3.2 下載程序 四、WiFi測試4.1 掃描測試4.2 連接測試 五、延遲測試5.1 ping百度5.2 ping路由器 六、帶寬測試6.1 添加netutils軟件包6.2 iperf命令參數6.3 PC端的iperf6.4 iperf測試準備工作6.5 進行iperf帶寬測試6.6…

未來三年AI的深度發展:AIGC、視頻AI與虛擬世界構建

人工智能&#xff08;AI&#xff09;正站在科技演進的前沿&#xff0c;未來三年將見證其在多領域實現更深層次的突破。以下是對AI發展方向的深度探討以及其對各行業的深遠影響&#xff1a; 1. AIGC的演進與全面提升&#xff1a; AIGC&#xff0c;即AI通用性能力&#xff0c;將…

AI前沿-YOLOV9算法

AI前沿-YOLOV9算法 關注B站查看更多手把手教學&#xff1a; 肆十二-的個人空間-肆十二-個人主頁-嗶哩嗶哩視頻 (bilibili.com) 今天我們來一起說下最近剛出的YOLOV9算法 論文和源碼 該算法的原始論文地址為&#xff1a;https://arxiv.org/abs/2402.13616 該算法的原始代碼地…

Muduo庫編譯學習(1)

1.muduo庫簡介 muduo是由Google大佬陳碩開發&#xff0c;是一個基于非阻塞IO和事件驅動的現代C網絡庫&#xff0c;原生支持one loop per thread這種IO模型&#xff0c;該庫只支持Linux系統&#xff0c;網上大佬對其褒貶不一&#xff0c;作為小白用來學習就無可厚非了。 git倉庫…

b站小土堆pytorch學習記錄——P14 torchvision中的數據集使用

文章目錄 一、前置知識如何查看torchvision的數據集 二、代碼&#xff08;附注釋&#xff09;及運行結果 一、前置知識 如何查看torchvision的數據集 &#xff08;1&#xff09;打開官網 https://pytorch.org/ pytorch官網 &#xff08;2&#xff09;打開torchvision 在Do…

Linux:top顯示信息

簡介 top命令是Linux系統中常用的性能監控工具&#xff0c;它可以實時顯示系統中各個進程的CPU使用情況以及其他系統資源的使用情況。當您在終端中運行top命令時&#xff0c;它會顯示一個實時更新的列表。 CPU相關的信息 CPU狀態&#xff1a; us&#xff08;user&#xff09…

梯度和梯度損失

梯度主要用于計算圖像融合過程中的梯度損失&#xff0c;對應的損失函數是梯度損失&#xff08;loss_grad&#xff09;。 梯度的作用&#xff1a; 圖像的梯度是指圖像中每個像素的灰度變化率&#xff0c;通常用于表示圖像的邊緣和紋理信息。在圖像融合任務中&#xff0c;通過計算…

Unity游戲輸入系統(新版+舊版)

使用新版還是舊版 舊版 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c5 : MonoBehaviour {void Start(){}void Update(){// 注意要在游戲中 點鼠標鍵盤進行測試// 鼠標// 0左鍵 1右鍵 2滾輪if (Input.GetMouseButtonDown(0)…

【javaSE-語法】lambda表達式

【javaSE-語法】lambda表達式 1. 先回憶一下&#xff1a;1.1 接口不能直接通過關鍵字new進行實例化1.2 函數式接口1.3 匿名內部類1.31 匿名內部類在代碼中長啥樣&#xff1f;1.32 構造一個新的對象與構造一個擴展了某類的匿名內部類的對象&#xff0c;兩者有什么區別&#xff1…

maven--->maven中的<properties>屬性有什么作用?

&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c;&#x1f64c; 在Maven中&#xff0c;元素用于定義項目中可重用的屬性值。這些屬性值可以在項目的POM文件中被引用&#xff0c;以便在整個項目中統一管理和使用。通過使用元素&#xff0c;可以避免在POM文件…

SpringBean生命周期之InitializingBean,初始化bean

1 yml文件 weixin:appid: aaaaaapartner: 12313214partnerkey: ccccccert: C:\\Users\\lenovo\\Desktop 2 Bean初使化 import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframewor…

midjourney提示詞語法

更高級的提示可以包括一個或多個圖像URL、多個文本短語和一個或更多個參數 Image Prompts 可以將圖像URL添加到提示中&#xff0c;以影響最終結果的樣式和內容。圖像URL總是位于提示的前面。 https://docs.midjourney.com/image-prompts Text Prompt 要生成的圖像的文本描述。…

YOLOv6、YOLOv7、YOLOv8網絡結構圖(清晰版)

承接上一篇博客&#xff1a;YOLOv3、YOLOv4、YOLOv5、YOLOx的網絡結構圖(清晰版)_yolox網絡結構圖-CSDN博客 1. YOLOv6網絡結構圖 2. YOLOv7網絡結構圖 3. YOLOv8網絡結構圖

搭建 LNMP 架構

一 理論知識 &#xff08;一&#xff09;架構圖 &#xff08;二&#xff09;CGI 由來 最早的Web服務器只能簡單她響應瀏覽器發來的HTTP請求&#xff0c;并將存儲在服務器上的HTML文件返回給瀏覽器&#xff0c;也就是靜態html文件&#xff0c;但是后期隨著網站功能增多網站開…