提高Python編程效率的幾種方法

前言

咱們知道Python這門語言在運行速度上已經敗給了許多別的語言(好比C, C++, Java, Golang....).但從一個開發者的角度來看Python是我最喜歡的語言,很大一部分緣由在於其語法簡單(實際上是我比較懶),還有不少很sao的操做,能夠大大提升咱們的敲代碼的效率.咱們一般叫這種sao操做爲pythonic.python

Python的sao操做不少,這裏先介紹幾種,之後慢慢更.數組

1.交換兩個變量

傳統寫法:app

temp = a
a = b
b = temp

pythonic:函數

a, b = b, a

2.枚舉enumerate

設想一個場景,有一個列表["老胡", "老王", "老李", "老趙"],如今要求你建立一個字典,其中字典的每一項key爲列表的元素,value爲對應元素的下標,該怎麼作?這並非枚舉的最佳使用場景,這裏只是一個例子,告訴大家枚舉其實很好用.spa

傳統寫法:code

alist = ["老胡", "老王", "老李", "老趙"]

aDict = {}

for i in range(len(alist)):
    aDict[alist[i]] = i

pythonic:對象

alist = ["老胡", "老王", "老李", "老趙"]

aDict = {}

for index, item in enumerate(alist):
    aDict[item] = index

3.推導式

Python中的推導式分爲三種列表推導式,字典推導式,集合推導式,因爲集合推導式和列表推導式神似這裏就不在過多演示.排序

列表推導式

設想一個場景,要求你把1-100間的全部偶數放到列表evenList中開發

傳統寫法:input

evenList = []

for i in range(0, 101):
   if i % 2 == 0:
       evenList.append(i)

pythonic:

evenList = [i for i in range(0,101) if i % 2 == 0]

只用一行代碼是否是很爽呢.

給出列表推導式的規範:

variable = [out_exp for out_exp in input_list if 某個條件成立]

字典推導式

設想一個場景,這裏要求你把一個字典裏全部的key和value位置交換

傳統寫法:

ADict = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
}

BDict = {}

for key, value in ADict.items():
    BDict[value] = key

pythonic:

ADict = {
    "key1": "value1",
    "key2": "value2",
    "key3": "value3"
}

BDict = {value: key for key, value in ADict.items()}

熟練使用推導式可讓你的代碼變得十分的簡短!

4.lambda表達式

這無疑是一個很是重要的語法,然而不少新手卻不喜歡使用...

所謂lambda表達式就是匿名函數,咱們爲何要使用匿名函數呢?有些時候咱們想要使用一個函數可是整個程序中只須要使用這一次,這時候使用lambda表達式無疑最方便了

設想一個場景,有一個列表裏面存放着一對對的元組,如今要按元組的第二個元素對該列表進行排序

傳統方法:

aList = [(2, 3), (1, 2), (4, 5), (7, 4)]


def sortKey(x):
    return x[1]


aList.sort(key=sortKey)		# 注意不要寫成aList = aList.sort(key=sortKey),它沒有返回值

print(aList)

out:

[(1, 2), (2, 3), (7, 4), (4, 5)]

pythonic:

aList = [(2, 3), (1, 2), (4, 5), (7, 4)]

aList.sort(key=lambda x: x[1])

out:

[(1, 2), (2, 3), (7, 4), (4, 5)]

給出規範:

lambda 參數:操做(參數)

注意後面的操做(參數)是要返回的

舉個例子:

add = lambda x, y: x + y
# 等價於下面的函數
def add(x, y):
    return x + y

5.裝飾器

裝飾器是Python很是很是很是重要的知識點,這裏只作應用舉例,之後我會出一期詳細的講解裝飾器

設想一個場景,公司有好多的部門(函數)在同時運做,如今要求你在不改變運行代碼的條件下,給每一個部門新加一個功能

源代碼:

def partA():
    print("----do A job----")

def partB():
    print("----do B job----")

def partC():
    print("----do C job----")

if __name__ == '__main__':
    partA()
    partB()
    partC()

out:

----do A job----
----do B job----
----do C job----

傳統方法:

def partA():
    print("----do A job----")
    print("****do extra job****")

def partB():
    print("----do B job----")
    print("****do extra job****")

def partC():
    print("----do C job----")
    print("****do extra job****")

if __name__ == '__main__':
    partA()
    partB()
    partC()

out:

----do A job----
****do extra job****
----do B job----
****do extra job****
----do C job----
****do extra job****

pythonic:

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()

out:

----do A job----
****do extra job****
----do B job----
****do extra job****
----do C job----
****do extra job****

對比兩種方法,使用裝飾器的效果就是可讓一個函數再不改變內部代碼的狀況下增長新的功能.

6.神奇的else語句

大部分人只知道else語句和if語句一塊兒使用,可是大家知道嗎else語句也能夠和for語句,while語句,try語句一塊兒使用

設想一個場景,你在對一個內部數據未知的列表進行循環時(不管是for仍是while),你設置了一個遇到偶數就break的語句,假若數組裏不含偶數就輸出奇數列表字樣.

傳統方法:

aList = [1, 3, 5, 7, 9]

flag = True
for i in aList:
    if i % 2 == 0:
        flag = False
        break

if flag:
    print("奇數列表")

pythonic:

aList = [1, 3, 5, 7, 9]

for i in aList:
    if i % 2 == 0:
        break
else:
    print("奇數列表")

注意,循環中(forwhile)的else語句會在循環正常退出時(即不是因爲break語句退出時)觸發

對與try,else語句,else語句會在沒有異常時被觸發,也許大家會有疑問,沒有異常直接在try語句裏不是解決了嗎,可是try語句裏的操做會被捕獲,有些時候咱們並不想這樣.

看個例子:

try:
    assert True
except:
    print("出錯了")
else:
    print("沒有錯")

out:

沒有錯

assert爲斷言當其後面的語句爲假是會報出異常,這和try語句一塊兒使用有時候會很是的方便.

7.map函數

map函數會將一個函數映射到一個列表的全部元素上去.這和lambda表達式配合簡直完美.

設想一個場景,一個列表裏有1-10十個數,現要求你將這個列表裏的每個數的平方存入另外一個列表,這並不難

傳統方法:

aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

bList = []
for i in aList:
    bList.append(i**2)

pythonic:

aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

bList = list(map(lambda x:x**2, aList))

千萬注意map函數返回的不是列表是個map對象,須要類型轉換

8.filter函數

沒錯從函數的名字就能夠看出filter函數的功能是過濾,filter能夠過濾一個列表的元素並返回全部符合要求的元素組成的filter對象,和map相似注意類型轉換.

設想一個場景,有一個列表,裏面存放着一些未知的數字,如今要求你把全部的偶數挑選出來,

傳統方法:

aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

bList = []
for each in aList:
    if each % 2 == 0:
        bList.append(each)

pythonic:

aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

bList = list(filter(lambda x: not x % 2, aList))

這裏使用not是由於偶數除2的餘數爲0(Python中0爲False),爲了讓偶數時返回True,用來一個not

9.reduce函數

注意:和前兩個函數不一樣,reduce函數被放到了functools這個模塊裏,使用時須要導入.

reduce函數會將一個列表裏的全部元素都用一個函數進行運算,要求這個函數必須有兩個參數.

設想一個場景,要求求一個數字列表裏全部的數字的平均值.

傳統方法:

aList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

sum = 0
for i in aList:
    sum += i

ave = sum / len(aList)

pythonic:

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)

map,filter,reduce函數和lambda配合使用纔是精華所在.還有千萬別弄混三個函數的功能

函數名 功能 返回值
map 單純的將一個函數映射到一個列表的全部元素上去 map對象
filter 過濾一個列表的元素並返回全部符合要求的元素組成的filter對象 filter對象
reduce 將一個列表裏的全部元素都用一個函數進行運算 計算結果

10.總結

Python的sao操做還有不少,此次但願此次帶來的幾個用法對大家有所幫助,對於剛接觸的人來講很容易忘記,但願你們能夠多動手敲敲代碼增強記憶,看看大家以前寫的代碼可不能夠用這些sao操做改一改,使你的代碼看上去更加精簡.

相關文章
相關標籤/搜索