python 生成式,迭代器,生成器

DAY 6. 生成式,迭代器,生成器

6.1 生成式

6.1.1 列表生成式

list = [index for index in range(10)]

6.1.2 字典生成式

dict = {'zhangsan': 10,'lisi': 12,'wangwu': 18
}
# 實現鍵值互換
dict = {k:v for v,k in dict.items() if k >= 12}

6.1.3 集合生成式

# 100以內的質數
set = {i for i in range(100) if i % 2 != 0}

6.2 生成器

生成式會創建一個列表(字典或集合),但無論是字典,列表還是集合,都不能保存一個無限長的序列,比如說全體自然數,當然我們一般不會用到這種序列,但哪怕是萬位的序列,保存為列表或集合也是很占用空間的,加上一般情況下我們對一個序列的操作是一次性的,根本不需要保存,那有沒有一種辦法只有我們需要時才給我們數據,我們不需要時程序只保留“算法”呢?這就用到了生成器

創建生成器有兩種辦法,一種是類似于推導式,把列表推導式的中括號改為小括號就行,會返回一個生成器對象,可以使用next()或for循環遍歷

t = (i for i in range(100) if i % 2 == 0)
for i in t:print(i)

舉個栗子,斐波那契數列,每一項是前兩項之和

一般情況

feibo = [1, 1]
for i in range(2,10000):feibo.append(feibo[i - 1] + feibo[i - 2])
print(feibo)

我們要做的只是要打印出來而已,沒必要保存這么大的數組,這時我們可以用生成器

def feb(f, s, max):i = 0while i < max:f, s = s, f + si += 1yield sfor i in feb(1, 1, 100):print(i)

生成器長得和函數一樣,只不過return 變成了yield ,每當運行到yield后,程序就會阻塞,只有在調用該生成器的next()方法時才會從上次暫停的地方繼續

def Demo():print(1)yield 1print(2)yield 2print(3)yield 3demo = Demo()
next(demo)
next(demo)
next(demo)
next(demo)# 1
# 2
# 3
# Traceback (most recent call last):
#   File "E:/xxxx/DAY6_1.py", line 45, in <module>
#     next(demo)
# StopIteration

當超出生成器范圍時會拋出StopIteration異常,我們一般也不會使用next,for就是捕捉StopIteration異常遍歷生成器的

for i in Demo():i# 等價于while(True):try:next(demo)except StopIteration:break

6.3 迭代器

6.3.1 可迭代對象

可以直接作用于for循環的對象統稱為可迭代對象:Iterable,主要有兩類,列表,元組,字典,集合等數據類型和生成器,可以使用isinstance()判斷一個對象是否是Iterable對象。

6.3.2 迭代器

可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。可以使用isinstance()判斷一個對象是否是Iterator對象

生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。把list、dict、str等Iterable變成Iterator可以使用iter()函數

你可能會問,為什么list、dict、str等數據類型不是Iterator?

這是因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用并不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。

Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。

6.4 總結

  • 生成式
生成式語法
列表生成式L = [i for i in range(100) if i % 2 ==0]
字典生成式k:v for k, v in dict.items() if k < 10
集合生成式S = {i for i in range(100) if i % 2 ==0}
  • 生成器

創建:
生成式方式和生成器函數
讀取:
next()或for

  • 迭代器
可迭代對象能被for直接作用的對象
迭代器能用next()執行的可迭代對象

參考文章:

GitHub python面試題

廖雪峰的官方網站

python 生成器和迭代器有這篇就夠了

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

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

相關文章

shell MAC 地址 校驗

/**************************************************************************************** shell MAC 地址 校驗* 說明&#xff1a;* 要對MAC地址進行校驗&#xff0c;記錄一下正則表達式寫法&#xff0c;有些方法在PC上驗證是可行的&…

移動端Web開發如何處理橫豎屏

<!Doctype html> <html> <head> <meta charset"utf-8"> <meta id"viewport" name"viewport" content"widthdevice-width,initial-scale1.0;"> <title>橫豎屏切換檢測</title> <style ty…

恩智浦智能車大賽2020_內蒙古科技大學第九屆智能車大賽校內公開賽總決賽

為了激發學生的創新意識&#xff0c;提高學生的動手能力&#xff0c;培養團隊合作意識&#xff0c;秉承“實踐源于真知&#xff0c;創新放飛夢想”的思想。2020年12月6日&#xff0c;內蒙古科技大學第九屆智能車大賽總決賽如約而至。本次大賽有來自各院系的223支隊伍報名參加了…

python格式化字符串的三種方法(%,format,f-string)

DAY 7. 格式化字符串 到目前為止&#xff0c;我所知道的&#xff0c;python格式化字符串有三種方法&#xff0c;第一是早期就有的%&#xff0c;其次是2.5之后的format(),還有就是3.6添加的f字符串調試 7.1 %格式化字符串 %格式化字符串是python最早的&#xff0c;也是能兼容…

Android App 優化之 ANR 詳解

為了便于閱讀, 應邀將Android App性能優化系列, 轉移到掘金原創上來.掘金的新出的"收藏集"功能可以用來做系列文集了. 今天先來聊聊ANR. 1, 你碰到ANR了嗎 在App使用過程中, 你可能遇到過這樣的情況: 恭喜你, 這就是傳說中的ANR. 1.1 何為ANR ANR全名Application Not…

微信高級群發接口正文亂碼解決方案

content里面的內空如果含有html標簽的話&#xff0c;需要對內容進行一下轉義。如果里面含有style".."類似于這樣的帶""號的內容的話&#xff0c;就更需要注意了。 foreach ($news as &$item) {foreach ($item as $key > $val){if ($key content){$…

python *args和**kwargs以及序列解包

DAY 8. *args和**kwargs *args&#xff1a;多值元組&#xff0c;**kwargs多值字典&#xff0c;他們是python函數傳參時兩個特殊的參數&#xff0c;args和kwargs并不是強制的&#xff0c;但習慣使用這兩個&#xff0c;如果在函數參數列表中聲明了*args&#xff0c;則允許傳遞任…

解讀直播連麥與點播加密

近年來&#xff0c;直播熱潮持續升溫。有需求就會有變革&#xff0c;直播的相關技術也在不斷更新&#xff0c;為直播行業帶來更好地服務。如&#xff1a;直播連麥與點播加密技術等。 直播連麥&#xff0c;即主播與連麥者通過互動直播中心進行實時互動&#xff0c;信息在云端混流…

血紅蛋白判斷access程序答案_普渡大學開發智能手機應用程序 幫助評估貧血癥情況...

醫生診斷貧血疾病的方法之一&#xff0c;就是通過觀察患者的眼皮&#xff0c;判斷眼皮是否發紅&#xff0c;從而判斷紅細胞的數量。但對醫生來說&#xff0c;面臨的挑戰是&#xff0c;這種簡單的測試不夠精確&#xff0c;無法不從患者身上抽取血樣就能給出診斷。美國普渡大學的…

學習筆記:AC自動機

話說AC自動機有什么用......我想要自動AC機 AC自動機簡介&#xff1a; 首先簡要介紹一下AC自動機&#xff1a;Aho-Corasick automation&#xff0c;該算法在1975年產生于貝爾實驗室&#xff0c;是著名的多模匹配算法之一。一個常見的例子就是給出n個單詞&#xff0c;再給出一段…

python閉包和裝飾器

DAY 9. 閉包和裝飾器 9.1 閉包 閉包就是內部函數對外部函數作用域內變量的引用 可以看出 閉包是針對函數的&#xff0c;還有兩個函數&#xff0c;內部函數和外部函數閉包是為了讓內部函數引用外部函數作用域內的變量的 我們先寫兩個函數 def fun1():print("我是fun1&q…

學歷是銅牌,能力是銀牌,人脈是金牌,思維是王牌

有人工作&#xff0c;有人上學&#xff0c;大家千萬不要錯過這篇文章&#xff0c;能看到這篇文章也是一種幸運&#xff0c;真的受益匪淺&#xff0c;對我有很大啟迪&#xff0c;這篇文章將會改變你我的一生&#xff0c;真的太好了&#xff0c;希望與有緣人分享&#xff0c;也希…

石頭剪刀布python編程_《python核心編程第二版》練習題——游戲:石頭剪刀布

習題里比較有意思的一個題目&#xff0c;實現石頭剪刀布這個游戲&#xff0c;起初設計的時候走彎路了(主要時被習題里那個“盡量少用if判斷”給整暈了)&#xff0c;想的太復雜&#xff0c;后來發現其實非常簡單&#xff0c;完全可以不寫if語句。還是枚舉法&#xff1a;#! /usr/…

SpringMvc面試題

f-sm-1. 講下SpringMvc和Struts1,Struts2的比較的優勢 性能上Struts1>SpringMvc>Struts2 開發速度上SpringMvc和Struts2差不多,比Struts1要高f-sm-2. 講下SpringMvc的核心入口類是什么,Struts1,Struts2的分別是什么 SpringMvc的是DispatchServlet,Struts1的是ActionServl…

python 鴨子類型

DAY 10. 鴨子類型 這個概念來源于美國印第安納州的詩人詹姆斯惠特科姆萊利&#xff08;James Whitcomb Riley,1849-1916&#xff09;的詩句&#xff1a;”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”…

thinkphp一句話疑難解決筆記

URL_PATHINFO_DEPR, depr表示 網頁路徑"分隔符",用"-", 有利于seo,注意是從 sername/index.php(開始的)/home-user-login-var-value開始的,pathinfo也支持普通的參數傳值(僅僅支持參數...). 在thinkphp中,有兩個地方使用depr,另一個就是tpl的文件目錄組織分…

python選取特定行_pandas.DataFrame選取/排除特定行的方法

pandas.DataFrame選取特定行使用Python進行數據分析時&#xff0c;經常要使用到的一個數據結構就是pandas的DataFrame&#xff0c;如果我們想要像Excel的篩選那樣&#xff0c;只要其中的一行或某幾行&#xff0c;可以使用isin()方法&#xff0c;將需要的行的值以列表方式傳入&a…

學校選址_洛谷U3451_帶權中位數

題目描述 在一條大路一旁有許多棟樓&#xff0c;每棟樓里有許多小學生&#xff08;哈哈哈一波小學生來襲&#xff01;&#xff09;。但是這條路上沒有小學&#xff01;&#xff01;&#xff01;&#xff01;所以唯恐世界不亂的牛A打算在路上&#xff08;汽車什么的都不敢來這個…

python 重載的實現(single-dispatch generic function)

DAY 11. python 重載 函數重載是指允許定義參數數量或類型不同的同名函數&#xff0c;程序在運行時會根據所傳遞的參數類型選擇應該調用的函數 &#xff0c;但在默認情況下&#xff0c;python是不支持函數重載的&#xff0c;定義同名函數會發生覆蓋 def foo(a:int):print(fin…

SQL中的多表查詢,以及JOIN的順序重要么?

說法是&#xff0c;一般來說&#xff0c;JOIN的順序不重要&#xff0c;除非你要自己定制driving table。 示例&#xff1a; SELECT a.account_id, c.fed_id, e.fname, e.lname-> FROM account AS a INNER JOIN customer AS c-> ON a.cust_id c.cust_id-> INNER JOIN …