溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中從for循環延申到推導式的具體使用

發布時間:2020-09-27 05:06:43 來源:腳本之家 閱讀:138 作者:No later 欄目:開發技術

本文采用循序漸進的寫法,逐步遞進.

傳統for循環:

#獲取1到1000000的偶數
#采用傳統寫法(俗稱普通解析)
for i in range(1,10**6+1):
 if(i%2==0):
 print(i)
#程序運行結果:
#2
#4
#.
#.
#.
#1000000

總結(從直觀上對代碼進行評價):能完成要求,但是代碼不夠簡潔.

改進后的代碼,采用列表推導式:

#獲取1到1000000的偶數
#采用列表推導式(俗稱列表解析)
print([i for i in range(1,10**6+1) if i%2==0])
#程序運行結果:
#2
#4
#.
#.
#.
#1000000

我們再來從代碼運行速度上評價代碼.

傳統for循環的運行速度:

#采用clock()函數進行測量代碼運行時間
#用以浮點數計算的秒數返回當前的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("程序運行時間:",cpu_end-cpu_start)
#程序運行結果:
#2
#4
#.
#.
#.
#1000000
#程序運行時間: 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
#因為python3.3以后不被推薦使用,該方法依賴操作系統,建議使用per_counter(返回系統運行時間)或process_time(返回進程運行時間)代替

采用列表推導式的運行速度:

#采用clock()函數進行測量代碼運行時間
#用以浮點數計算的秒數返回當前的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("程序運行時間:",cpu_end-cpu_start)
#程序運行結果:
#[2,4,6,8...1000000]
#程序運行時間: 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
#因為python3.3以后不被推薦使用,該方法依賴操作系統,建議使用per_counter(返回系統運行時間)或process_time(返回進程運行時間)代替

總結(從代碼運行速度上進行評價):很明顯采用列表推導式的代碼,運行速度是更勝一籌的.

結論:

1.編譯器會優化,不會因為簡寫而影響效率,反而因優化提高了效率.
2. 減少程序員工作量,減少出錯.
3. 即簡化了代碼,又增強了代碼的可讀性.

那么存在列表解析式是否存在集合推導式,字典推導式,元組推導式,我們來一探究竟吧!這里就不再探究他們的運行速度了!

集合推導式:

#集合推導式
#獲取1到1000000的偶數
x={i for i in range(1,10**6+1) if i%2==0}
type(x)
#輸出結果:
#{2,4,6,8...1000000}
#<class 'set'>

字典推導式:

#獲取值是偶數的所有鍵值對形成的字典
#采用傳統方法
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'>
#獲取值是偶數的所有鍵值對形成的字典
#字典推導式
#方法一
#采用zip函數與for循環將兩個列表的值逐步遍歷作為字典的鍵與值
x = {i : j for i, j in zip(["名字1", "名字二", "名字三", "名字四"], [1,2,3,4]) if j%2==0}
print(x)
print(type(x))
#運行結果:
#{'名字二': 2, '名字四': 4}
#<class 'dict'>

#方法二
#獲取值是偶數的所有鍵值對形成的字典
#采用items()函數進行迭代遍歷
dict={'名字1': 1, '名字二': 2, '名字三': 3, '名字四': 4}
x = {i : j for i, j in dict.items() if j%2==0}
print(x)
print(type(x))
#運行結果:
#{'名字二': 2, '名字四': 4}
#<class 'dict'>

元組推導式:

#獲取1到1000000的偶數
x=(i for i in range(1,10**6+1) if i%2==0)
print(x)
type(x)
#輸出結果:
#<generator object <genexpr> at 0x00000241FFAB2750>
#<class 'generator'>

咦!前面都返回數組或者集合或字典,這個怎么返回了生成器(genexpr),這是因為元組是不可變的。我們來訪問一下里面的元素把!

#獲取值是偶數的所有鍵值對形成的字典
x=(i for i in range(1,10**6+1) if i%2==0)
for i in x:
 print(i)
#輸出結果:
#2
#4
#.
#.
#.
#1000000

 總結:推導式雖然有很多優點,但是唯一不足的就是局部變量的可讀性不高.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女