python提高代碼效率的常見方法

我們都知道,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 將一個列表裏的所有元素都用一個函數進行運算 計算結果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章