截止到目前爲止,python基礎內容已經學習了50%左右,在學習編程過程當中,咱們不只要學習python語法,同時也須要學習如何把本身代碼寫的更美觀,效率更高。python
推導式是從一個或者多個迭代器快速簡潔地建立數據類型的一種方法,它將循環和條件判斷結合,從而避免語法冗長的代碼,提升代碼運行效率。能熟練使用推導式也能夠間接說明你已經超越了python初學者的水平。git
1github 2編程 3微信 4app 5ide 6學習 7測試 8spa |
''' value1:若是條件表達式condition成立,返回value1 ; 若是條件表達式不成立,返回value2 ; condition:條件表達式 Value2:若是條件表達式condition成立,返回value1 ; 若是條件表達式不成立,返回value2 ;
'''
value1 if condition else Value2 |
假若有這樣一個須要:判斷一個數字是奇數仍是偶數?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(我的博客地址): shuopython.com @WeChat Official Account(微信公衆號):猿說python @Github:www.github.com
@File:python_list.py @Time:2019/9/30 20:45
@Motto:不積跬步無以致千里,不積小流無以成江海,程序人生的精彩須要堅持不懈地積累! """
# 新手代碼 x = 10 if x%2 == 0: print("新手說:x是偶數") else: print("新手說:x是奇數")
# 老司機 x = 15 print("老司機說:x是偶數") if x%2 == 0 else print("老司機說:x是奇數") |
輸出結果:
1 2 |
新手說:x是偶數 老司機說:x是奇數 |
觀察上面代碼能夠看出來,選手一(新手)一共佔用了5行代碼,而選手二(老司機)完成一樣一個功能僅僅只須要兩行,這就是性價比,每每這就是職場上鑑別工做能力/升職加薪的細節。
列表推導式是條件推導式和循環一塊兒配合使用,並返回一個列表,而且整個表達式須要在[]內,由於返回值也是列表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
''' 語法一: exp1:在for循環中,若是x的值知足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則不返回 x:for循環中變量 data:一個序列(好比:列表/元組/字符串等) condition:條件表達式 '''
[exp1 for x in data if condition]
''' 語法二: exp1:在for循環中,若是x的值知足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則返回exp2 condition:條件表達式 exp2:在for循環中,若是x的值知足條件表達式condition(即條件表達式成立),返回exp1;條件表達式不成立則返回exp2 x:for循環中變量 data:個序列(好比:列表/元組/字符串等)
'''
[exp1 if condition else exp2 for x in data] |
需求一:獲取0~20的全部偶數而且乘以10,並返回全部計算以後的結果。示例代碼以下:(使用列表推導式語法一實現)
1 2 3 4 5 6 7 8 9 10 |
''' 1.由於是獲取0~20,包括20,因此使用range(0,21) 2.x*10 等價 語法一中的exp1 3.x%2 == 0 等價 語法一中的條件表達式condition 4.range(0,21) 等價 語法一中的data(序列) '''
list1 = [x*10 for x in range(0,21) if x%2 == 0] print(list1) print(type(list1)) |
輸出結果:
1 2 |
[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200] <class 'list'> |
需求二:將0~20的偶數乘以10,奇數乘以100,並返回全部計算以後的結果。示例代碼以下:(使用列表推導式語法二實現)
1 2 3 4 5 6 7 8 9 10 11 |
''' 1.由於是獲取0~20,包括20,因此使用range(0,21) 2.x*10 等價 語法二中的exp1 3.x*100 等價 語法二中的exp2 4.x%2 == 0 等價 語法二中的條件表達式condition 5.range(0,21) 等價 語法一中的data(序列) '''
list2 = [x*10 if x%2 == 0 else x*100 for x in range(0,21) ] print(list2) print(type(list2)) |
輸出結果:
1 2 |
[0, 100, 20, 300, 40, 500, 60, 700, 80, 900, 100, 1100, 120, 1300, 140, 1500, 160, 1700, 180, 1900, 200] <class 'list'> |
可能有童鞋納悶,我明明for循環就能實現的功能,爲毛要用這鳥玩意推導式?
使用列表推導式的效率遠遠高於for循環,可能執行一句print(「helloworld」)對於cpu而已只須要0.0002秒,你可能感受不到差距,若是須要輸出一億次helloworld呢?每每細節以爲成敗!
假若有一個需求:將0~10000000(一億)之內的全部整數存到列表中,對比一下列表推導式和for循環耗時狀況:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import time # 添加time模塊,用於統計代碼運行時間
#一共添加10000000次數據到列表中 total_num = 10000000
#使用列表推導式 start_time = time.time() list1 = [x for x in range(0,total_num)] # 列表推導式 end_time = time.time() print("使用列表推導式耗時:{}秒".format(end_time-start_time))
#使用普通for循環 start_time = time.time() list2 = list() for x in range(0,total_num): # for循環 list2.append(x) end_time = time.time() print("使用普通for循環耗時:{}秒".format(end_time-start_time)) |
輸出結果:
1 2 |
使用列表推導式耗時:0.5455152988433838秒 使用普通for循環耗時:1.2068836688995361秒 |
輸出結果很明顯,實現通用的功能,列表推導式的效率整整高出普通for循環一倍。
最後舒適提醒:測試請把循環次數改小一點,畢竟剛開始不當心多加了幾圈圈,電腦死機了!
1.注意在列表推導式書寫的時候,全部表達式都必須在[]內部,由於返回值是列表list
2.列表推導式是python開發學習的知識點,多多聯繫,熟能生巧.