我們都知道,python的優勢之一就是代碼量少,如何讓代碼量更簡潔呢(一行解決最好)?是時候來一些sao操作了。以下代碼只寫簡化後的源代碼,你也可以嘗試着想象(動手做)出普通思路的代碼,與其進行對比。看完文章也要留心,有幾個知識點是很重要的,比如:匿名函數和裝飾器。作爲新手的我們卻很少使用,應引起重視。
1.交換兩個變量
設想一個場景,需要你用一行代碼交換變量a,b
a,b = b,a
print(a, b)
作用:
- 用於快速交換兩個變量
- 還學會了同時定義多個變量: a, b = 2, 4
2.if-else語句縮寫
設想一個場景,需要你按要求輸出:如果a大於b打印a;反之打印b
法1:使用三目運算符進行操作(推薦使用)
a, b = 2, 1
print(a if a>b else b)
法2:利用二維列表進行操作
a, b = 2, 1
print([b, a][a > b])
法3:利用邏輯運算符進行操作
a, b = 2, 1
print((a>b and a or b))
3.匿名函數
設想一個場景,需要你定義一個可以求兩個數之和的函數
my_add = lambda a,b: a + b
print(my_add(1, 2))
作用:
- 可以作爲參數傳遞給另外一個函數
- 還可以減少代碼量
4.推導式
列表推導式
設想一個場景,要求你把1-100間的所有偶數放到列表中
print([x for x in range(1, 101) if x%2==0])
字典推導式
設想一個場景,這裏要求你把一個字典裏所有的key和value位置交換
dict = {
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
print({value: key for key, value in dict.items()})
集合推導式
設想一個場景,要求你把1-100間的所有偶數放到集合中,與列表推導式神似
print({x for x in range(1, 101) if x%2==0})
5.枚舉enumerate
設想一個場景,有一個列表[“貝貝”, “京京”, “歡歡”, “迎迎”, “妮妮”],現在要求你創建一個字典,其中字典的每一項key爲列表的元素,value爲對應元素的下標,該怎麼做?這並不是枚舉的最佳使用場景,這裏只是一個例子,告訴你們枚舉其實很好用。
aList = ["貝貝", "京京", "歡歡", "迎迎","妮妮"]
aDict = {}
for index, item in enumerate(aList):
aDict[item] = index
print(aDict)
6.裝飾器
設想一個場景,公司有好多的部門(函數)在同時運作,現在要求你在不改變運行代碼的條件下,給每個部門新加一個功能
def doExtraJob(func):
def wrap():
func()
print("****do extra job****")
return wrap
@doExtraJob
def partA():
print("----do A job----")
@doExtraJob
def partB():
print("----do B job----")
@doExtraJob
def partC():
print("----do C job----")
if __name__ == '__main__':
partA()
partB()
partC()
7.map
map函數會將一個函數映射到一個列表的所有元素上去.這和lambda表達式配合簡直完美.
設想一個場景,一個列表裏有1-10十個數,現要求你將這個列表裏的每一個數的平方存入另一個列表,這並不難
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = list(map(lambda x:x**2, aList))
print(bList)
千萬注意map函數返回的不是列表是個map對象,需要類型轉換
8.filter
沒錯從函數的名字就可以看出filter函數的功能是過濾,filter可以過濾一個列表的元素並返回所有符合要求的元素組成的filter對象,和map類似注意類型轉換.
設想一個場景,有一個列表,裏面存放着一些未知的數字,現在要求你把所有的偶數挑選出來,
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
bList = list(filter(lambda x: not x % 2, aList))
print(bList)
這裏使用not是因爲偶數除2的餘數爲0(Python中0爲False),爲了讓偶數時返回True,用來一個not
9.reduce
注意:和前兩個函數不同,reduce函數被放到了functools這個模塊裏,使用時需要導入.
reduce函數會將一個列表裏的所有元素都用一個函數進行運算,要求這個函數必須有兩個參數.
設想一個場景,要求求一個數字列表裏所有的數字的平均值.
from functools import reduce
aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ave = reduce(lambda x, y: x + y, aList) / len(aList)
print(ave)
map,filter,reduce函數和lambda配合使用纔是精華所在.還有千萬別弄混三個函數的功能
函數名 | 功能 | 返回值 |
---|---|---|
map | 單純的將一個函數映射到一個列表的所有元素上去 | map對象 |
filter | 過濾一個列表的元素並返回所有符合要求的元素組成的filter對象 | filter對象 |
reduce | 將一個列表裏的所有元素都用一個函數進行運算 | 計算結果 |