python中從for循環(huán)延申到推導(dǎo)式的具體使用
本文采用循序漸進(jìn)的寫法,逐步遞進(jìn).
傳統(tǒng)for循環(huán):
#獲取1到1000000的偶數(shù) #采用傳統(tǒng)寫法(俗稱普通解析) for i in range(1,10**6+1): if(i%2==0): print(i) #程序運(yùn)行結(jié)果: #2 #4 #. #. #. #1000000
總結(jié)(從直觀上對代碼進(jìn)行評價):能完成要求,但是代碼不夠簡潔.
改進(jìn)后的代碼,采用列表推導(dǎo)式:
#獲取1到1000000的偶數(shù) #采用列表推導(dǎo)式(俗稱列表解析) print([i for i in range(1,10**6+1) if i%2==0]) #程序運(yùn)行結(jié)果: #2 #4 #. #. #. #1000000
我們再來從代碼運(yùn)行速度上評價代碼.
傳統(tǒng)for循環(huán)的運(yùn)行速度:
#采用clock()函數(shù)進(jìn)行測量代碼運(yùn)行時間 #用以浮點(diǎn)數(shù)計算的秒數(shù)返回當(dāng)前的CPU時間,用來衡量不同程序的耗時,比time.time()更精確 import time cpu_start=time.clock() for i in range(1,10**6+1): if(i%2==0): print(i) cpu_end=time.clock() print("程序運(yùn)行時間:",cpu_end-cpu_start) #程序運(yùn)行結(jié)果: #2 #4 #. #. #. #1000000 #程序運(yùn)行時間: 2.1866424 #注意:編譯器在3.3-3.8之間的會報一個警告:DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead #因?yàn)閜ython3.3以后不被推薦使用,該方法依賴操作系統(tǒng),建議使用per_counter(返回系統(tǒng)運(yùn)行時間)或process_time(返回進(jìn)程運(yùn)行時間)代替
采用列表推導(dǎo)式的運(yùn)行速度:
#采用clock()函數(shù)進(jìn)行測量代碼運(yùn)行時間 #用以浮點(diǎn)數(shù)計算的秒數(shù)返回當(dāng)前的CPU時間,用來衡量不同程序的耗時,比time.time()更精確 import time cpu_start=time.clock() print([i for i in range(1,10**6+1) if i%2==0]) cpu_end=time.clock() print("程序運(yùn)行時間:",cpu_end-cpu_start) #程序運(yùn)行結(jié)果: #[2,4,6,8...1000000] #程序運(yùn)行時間: 0.005884400000000012 #注意:編譯器在3.3-3.8之間的會報一個警告:DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead #因?yàn)閜ython3.3以后不被推薦使用,該方法依賴操作系統(tǒng),建議使用per_counter(返回系統(tǒng)運(yùn)行時間)或process_time(返回進(jìn)程運(yùn)行時間)代替
總結(jié)(從代碼運(yùn)行速度上進(jìn)行評價):很明顯采用列表推導(dǎo)式的代碼,運(yùn)行速度是更勝一籌的.
結(jié)論:
1.編譯器會優(yōu)化,不會因?yàn)楹唽懚绊懶?,反而因?yōu)化提高了效率.
2. 減少程序員工作量,減少出錯.
3. 即簡化了代碼,又增強(qiáng)了代碼的可讀性.
那么存在列表解析式是否存在集合推導(dǎo)式,字典推導(dǎo)式,元組推導(dǎo)式,我們來一探究竟吧!這里就不再探究他們的運(yùn)行速度了!
集合推導(dǎo)式:
#集合推導(dǎo)式 #獲取1到1000000的偶數(shù) x={i for i in range(1,10**6+1) if i%2==0} type(x) #輸出結(jié)果: #{2,4,6,8...1000000} #<class 'set'>
字典推導(dǎo)式:
#獲取值是偶數(shù)的所有鍵值對形成的字典 #采用傳統(tǒng)方法 dict={'名字1': 1, '名字二': 2, '名字三': 3, '名字四': 4} dict_x={} for i,j in dict.items(): if(j%2==0): dict_x[i]=j print(dict_x) print(type(dict_x)) #{'名字二': 2, '名字四': 4} #<class 'dict'>
#獲取值是偶數(shù)的所有鍵值對形成的字典 #字典推導(dǎo)式 #方法一 #采用zip函數(shù)與for循環(huán)將兩個列表的值逐步遍歷作為字典的鍵與值 x = {i : j for i, j in zip(["名字1", "名字二", "名字三", "名字四"], [1,2,3,4]) if j%2==0} print(x) print(type(x)) #運(yùn)行結(jié)果: #{'名字二': 2, '名字四': 4} #<class 'dict'> #方法二 #獲取值是偶數(shù)的所有鍵值對形成的字典 #采用items()函數(shù)進(jìn)行迭代遍歷 dict={'名字1': 1, '名字二': 2, '名字三': 3, '名字四': 4} x = {i : j for i, j in dict.items() if j%2==0} print(x) print(type(x)) #運(yùn)行結(jié)果: #{'名字二': 2, '名字四': 4} #<class 'dict'>
元組推導(dǎo)式:
#獲取1到1000000的偶數(shù) x=(i for i in range(1,10**6+1) if i%2==0) print(x) type(x) #輸出結(jié)果: #<generator object <genexpr> at 0x00000241FFAB2750> #<class 'generator'>
咦!前面都返回數(shù)組或者集合或字典,這個怎么返回了生成器(genexpr),這是因?yàn)樵M是不可變的。我們來訪問一下里面的元素把!
#獲取值是偶數(shù)的所有鍵值對形成的字典 x=(i for i in range(1,10**6+1) if i%2==0) for i in x: print(i) #輸出結(jié)果: #2 #4 #. #. #. #1000000
總結(jié):推導(dǎo)式雖然有很多優(yōu)點(diǎn),但是唯一不足的就是局部變量的可讀性不高.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 環(huán)境變量和import模塊導(dǎo)入方法(詳解)
下面小編就為大家?guī)硪黄猵ython 環(huán)境變量和import模塊導(dǎo)入方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07python實(shí)現(xiàn)雙色球隨機(jī)選號
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)雙色球隨機(jī)選號,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-01-01Python3+Requests+Excel完整接口自動化測試框架的實(shí)現(xiàn)
這篇文章主要介紹了Python3+Requests+Excel完整接口自動化測試框架的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10如何利用python web框架做文件流下載的實(shí)現(xiàn)示例
這篇文章主要介紹了如何利用python web框架做文件流下載的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06利用Python中unittest實(shí)現(xiàn)簡單的單元測試實(shí)例詳解
如果項目復(fù)雜,進(jìn)行單元測試是保證降低出錯率的好方法,Python提供的unittest可以很方便的實(shí)現(xiàn)單元測試,從而可以替換掉繁瑣雜亂的main函數(shù)測試的方法,將測試用例、測試方法進(jìn)行統(tǒng)一的管理和維護(hù)。本文主要介紹了利用Python中unittest實(shí)現(xiàn)簡單的單元測試。2017-01-01Django模板獲取field的verbose_name實(shí)例
這篇文章主要介紹了Django模板獲取field的verbose_name實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05多個geojson經(jīng)過坐標(biāo)系轉(zhuǎn)換后如何合并為一個shp數(shù)據(jù)
這篇文章主要介紹了多個geojson經(jīng)過坐標(biāo)系轉(zhuǎn)換后如何合并為一個shp數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10Python開發(fā)畢設(shè)案例之桌面學(xué)生信息管理程序
畢業(yè)設(shè)計必備案例:Python開發(fā)桌面程序2021-11-11