標籤:

怎樣才能寫出pythonic的代碼?

PPT版本 python idiom - By silence

編寫函數的幾個原則

  • 原則 1:函數設計要盡量短小,嵌套層次不宜過深。最好能控制在 3 層以內。

  • 原則 2:函數申明應該做到合理、簡單、易於使用。參數個數不宜太多。

  • 原則 3:函數參數設計應該考慮向下兼容。比如相同功能的函數不同版本的實現,唯一不同的是在更高級的版本中添加了參數導致程序中函數調用的介面發生了改變。這並不是最佳設計,更好的方法是通過加入默認參數來避免這種退化,做到向下兼容。

  • 原則 4:一個函數只做一件事,盡量保證函數語句粒度的一致性。

  • 原則 5:不要在函數中定義可變對象作為默認值

  • 原則 6:使用異常替換返回錯誤
  • 原則 7:保證通過單元測試

判斷一個值是否在字典中

data = {name: codingcat, age: 25}nnprint(name in data.keys())n

可能有一部分同學會像上面??這樣加個keys, 那麼這樣做有什麼影響呢?

  1. 官方推薦直接in就可以了 name in data, 這樣還更簡介
  2. 加上keys 會影響性能

可以看到使用.keys與不使用.keys性能相差一倍多

使用dis模塊可以看出.keys比不加多出兩步操作,時間消耗在這兩步了

所以判斷一個key是否在一個字典中不要加.keys

變數交換

a = 10nb = 5ntmp = ana = bnb = tmpn

在其他語言中兩個變數交換值的做法會像上面這樣

但Python中可以有一種更方便的方法

a = 10nb = 5na, b = b, an

使用**而不是pow

使用**快10倍以上!

迭代的時候帶上序號

Bad

index = 0nfor item in [1, 2, 3, 4]:n print(index, item)n index += 1n

Good

for index, item in enumerate([1, 2, 3, 4]):n print(index, item)n

Python函數參數默認值的陷阱

Bad

def func(lst=[]):n lst.append(1)n print(lst)n

Good

def func(lst=None):n if lst is None:n lst = []n lst.append(1)n print(lst)n

具體原因有篇文章講得挺好??

[Python函數參數默認值的陷阱和原理深究](Python函數參數默認值的陷阱和原理深究)

使用級聯比較 a < b < c

Bad

a, b, c = 1, 2, 3nif a < b and b < c:n passn

Good

a, b, c = 1, 2, 3nif a < b < c:n passn

檢查變數是否等於常量

Bad

if attr == True:n print(True!)nnif attr == None:n print(attr is None!)n

Good

# Just check the valuenif attr:n print(attr is truthy!)nn# or check for the oppositenif not attr:n print(attr is falsey!)nn# or, since None is considered false, explicitly check for itnif attr is None:n print(attr is None!)n

列表推導式

Bad

result = []nfor i in range(1, 1000):n if i % 2 == 0:n result.append(i)n

Good

result = [i for i in range(1, 1000) if i % 2 == 0]n

使用 with 讀取文件

Bad

f = open(file.txt)na = f.read()nprint anf.close()n

Good

with open(file.txt) as f:n for line in f:n print linen

裝飾器

Python裝飾器 - 知乎專欄

使用pylint做代碼質量檢測

pep8 PEP 8 -- Style Guide for Python Code

Google python style guide Python語言規範 - Google 開源項目風格指南

結尾

[Python 指南](代碼風格 - Python最佳實踐指南)

Github:istommao/lecturenotes

推薦閱讀:

此庫在手,好片無憂!Python爬片,小手不抖
如何用python解析json對象(基礎篇)
把vim配置成順手的python輕量級IDE(一)
草根該如何學好Python把握人工智慧時代新機遇?

TAG:Python |