標籤:

Python:Pythonic Code Styles

還是轉載自我的博客。

上一篇博客分享一些Python的基礎內容,今天分享一點Pythonic的Python代碼寫法,幫助初學者迅速提升代碼逼格。

交換兩個數

常規寫法:

t = ana = bnb = tn

二逼寫法:

a = a ^ bnb = a ^ bna = b ^ an

推薦寫法:

a, b = b, an

迭代的時候帶上序號

常規寫法:

index = 0nfor item in iterable:n print index, itemn index += 1n

推薦寫法:

for index, item in enumerate(iterable):n print index, itemn

其中,enumerate還可以接收第二個參數,指定開始的位置。

同時迭代兩個可迭代對象

常規寫法:

for pos in xrange(len(iterable1)):n item1 = iterable1[pos]n item2 = iterable2[pos]n print item1, item2n

推薦寫法:

for item1, item2 in zip(iterable1, iterable2):n print item1, item2n

獲取對象的方法列表

使用dir(obj)即可得到obj對象的所有屬性(欄位)、方法。比如:

In [26]: l = [a, b, c]nnIn [27]: dir(l)nOut[27]:n[__add__, __class__, __contains__, __delattr__, __delitem__,n __delslice__, __doc__, __eq__, __format__, __ge__,n __getattribute__, __getitem__, __getslice__, __gt__,n __hash__, __iadd__, __imul__, __init__, __iter__,n __le__, __len__, __lt__, __mul__, __ne__, __new__,n __reduce__, __reduce_ex__, __repr__, __reversed__,n __rmul__, __setattr__, __setitem__, __setslice__,n __sizeof__, __str__, __subclasshook__, append,n count, extend, index, insert, pop, remove,n reverse, sort]n

三元表達式

Python里沒有C-Like語言中condition ? value1 : value2的語法,但是我們可以有很多中方法實現同樣的功能:

value1 if condition else value2n(value2, value1)[condition]ncondition and value1 or value2n

以上語法都可以實現同樣的功能。

if

# 如果要判斷一個變數是否等於某幾個數字, this is badnif num == 2 or num ==4 or num ==6:n passn# 如果要判斷一個變數是否等於某幾個數字, this is goodnif num in (2, 4, 6):n passnn# 如果判斷一個數字是否在一個區間里,this is badnif num >= 10 and num <=100:n passn# 如果判斷一個數字是否在一個區間里,this is goodnif 10 <= num <= 100:n passn

字元串格式化

普通程序員:

name = xlzdnage = 21nstring = My name is %s and I am %d years old % (name, age)n

二逼程序員:

name = xlzdnage = 21nstring = My name is + name + and I am + str(age) + years old.n

推薦寫法:

string = My name is {name} and I am {age} years old..format(name=xlzd, age=21)n

列表推倒

要實現從一個list中取出滿足某個條件(在100-1000開區間中)的元素組成一個新的list

普通寫法:

l = [1, 2, 4, 34, 76, 123, 560, 590, 777, 1200]nnew_list = []nfor item in l:n if 100 < item < 1000:n new_list.append(item)n

推薦寫法:

l = [1, 2, 4, 34, 76, 123, 560, 590, 777, 1200]nnew_list = [item for item in l if 100 < item < 1000] # 生成一個listn ornnew_list = (item for item in l if 100 < item < 1000) # 生成一個generatorn

關於上面推薦的兩種寫法,後一種相對前一種的好處是生成了一個generator(以前的博客提到過的),它會延遲計算而不是立刻得出結果,所以在內存使用上會更優。

這樣的推導語句同樣適用於dict和set。

序列切片

list、str等對象的切片操作,可以優雅而高效的實現很多功能:

In [1]: l = range(10) # 初始化一個listnnIn [2]: lnOut[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]nnIn [3]: l[::-1] # 逆序nOut[3]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]nnIn [4]: l[5:] # 切片,取第5個以後nOut[4]: [5, 6, 7, 8, 9]nnIn [5]: l[:5] # 切片,取第五個及以前nOut[5]: [0, 1, 2, 3, 4]nnIn [6]: l[::2] # 從第0位開始,每隔一位取一個數 nOut[6]: [0, 2, 4, 6, 8]nnIn [7]: l[1::2] # 從第1位開始,每隔一位取一個數 nOut[7]: [1, 3, 5, 7, 9]n

switch-case

Python沒有switch-case語法,一般程序員會使用if-elif-else來模擬這樣的操作,但是有經驗的逼格高的程序員一般通過映射一個dict。

# Java codenString int2en(int num) {n switch(num) {n case 1: return "one";n case 2: return "two"; n case 3: return "there"; n case 4: return "four";n case 5: return "five";n default: return "out";n }n}n

普通程序員的Python實現:

def int2en(num):n if num == 1:n return "one"n if num == 2:n return "two"n if num == 3:n return "there"n if num == 4:n return "four"n if num == 5:n return "five"n return "out"n

推薦:

INT_EN_MAP = {n 1: one,n 2: two,n 3: there,n 4: four,n 5: fiven}nndef int2en(num):n return INT_EN_MAP.get(num, out)n

拼接文件路徑

一般比較常見的寫法是連接字元串,但是這樣的寫法會導致另外的平台可能不可用,也容易出現拼接字元串的錯誤。比如OS X和Linux上使用"/"而Windows卻使用""來區分文件路徑。通過os.path.join函數來完成這樣的操作:

import osnbase = /User/xlzdnn# this is badntarget = base + /workspacenn# this is goodntarget = os.path.join(base, workspace)n

小結

Python中一個功能可以有很多中不同的實現方式,在寫代碼之前最好先構思好,盡量寫出美觀、高效、規範的好代碼。除了以上,還有很多Pythonic的代碼寫法,時間關係,暫不一一贅述。


推薦閱讀:

mac os x如何安裝python科學計算庫numpy?
學PYTHON的思路與筆記
Python 中 a+=b 和 a=a+b 的區別有哪些?
Python到底有多慢?
大型項目結構

TAG:Python |