先 print 一下 Zen of Python,讓我們學會如何離 pythonic 更近:
import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
第1條: 確認自己所用的 Python 版本
如果電腦里面同時安裝了 python2 和 python3 的話,通常我們用 python 來運行 python2 的版本, 用 python3 來運行 python3 的版本。
查看電腦已安裝的 python 版本時,可以使用 python --version 或者 python3 --version 來獲取當前的版本號。
也可以通過內(nèi)置的 sys 模塊來查詢。
>>> import sys
>>> print(sys.version_info)
sys.version_info(major=3, minor=6, micro=4, releaselevel='final', serial=0)
>>> print(sys.version)
3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)]
由于 Python 核心團隊計劃在 2020 年停止支持 Python 2,最好還是學習 python3。
第一條建議應該就是讓我們學會查看自己當前使用的 python 版本并推薦使用 python3。
第2條:遵循 PEP 8 風格指南
- 使用 space 來縮進,而不是直接用 tab。
- 語法相關的每個縮進都用 4 個空格來表示。
- 每行的字符數(shù)不超過 79。(現(xiàn)在 pycharm 編輯器中字符數(shù)推薦是不超過121)
- 表達式過長,分行時首行之外的其余行需要縮進4個空格。
- 同一文件中函數(shù)與函數(shù)之間,函數(shù)與類之間,類與類之間,隔開兩個空行。
- 下標獲取元素,調用函數(shù)和給關鍵字參數(shù)賦值時,“=”號兩邊加不需要加空格。
- 變量賦值需要在兩側各加一個空格。
- 函數(shù)、變量以及屬性使用小寫字母拼寫,各單詞之間加下劃線。如 do_something()。
- 類與異常使用首字母大寫拼寫。如 ClassExcept()。
- 受保護的實例屬性,單個下劃線開頭。如 _protected_instance。
- 私有實例屬性,雙下劃線開頭。如 __private_value。
- 模塊級別常量,全部使用大寫字母表示。如MAX_LEN。
- 類中實例方法,首個參數(shù)為 self, 表示對象自身。
- 類方法,首個參數(shù)為cls。
- 采用內(nèi)聯(lián)方式的否定,不要把否定否定整個表達式的前面。
- 不要通過檢測長度的方法來判斷 somelist 如字符串、列表、字典等是否為空,應該采用 if not 。
- 檢測 somelist 非空時,同理,使用 if somelist。
- 不要編寫單行的 if語句、for循環(huán)、while循環(huán)以及except復合語句。
- import 語句總應該放在文件開頭。
- 引入模塊時,總是應該使用絕對名稱,而不是根據(jù)當前模塊路徑來使用相對名稱。
- 如果一定要使用相對名稱來編寫 import 語句,采用明確的寫法:from.import foo
- 文件中 import 語句應該按順序劃分為三個部分,分別表示為標準庫模塊,第三方模塊以及自用模塊。在每一部分之中,按模塊的字母順序來排列。
第3條:了解 bytes、str 與 unicode的區(qū)別
python3 有兩種表示字符序列的類型:bytes 和 str。bytes實例是原始的8位值,str實例包含Unicode字符。
python2 也有兩種字符序列的類型:str 和 unicode。str實例包含原始的8位值,unicode實例包含unicode字符。
在python2 和 python3 中,我們可以編寫函數(shù)來實現(xiàn)輸入是 str 或者 unicode 總是返回 str 或者 unicode 的一種的方法。
在 python3 中,
總是返回 str:
def to_str(chara_seq):
if isinstance(chara_seq, bytes):
value = chara_seq.decode('utf8')
else:
value = chara_seq
總是返回 bytes:
def to_bytes(chara_seq):
if isinstance(chara_seq, str):
value = chara_seq.encode('utf-8')
else:
value = chara_seq
在 python2 中,
總是返回unicode:
def to_unicode(chara_seq):
if isinstance(chara_seq, str):
value = chara_seq.decode('utf-8')
else:
value = chara_seq
總是返回 str:
def to_str(chara_seq):
if isinstance(chara_seq, unicode):
value = chara_seq.encode('utf-8')
else:
value = chara_seq
注意: python3使用打開文件的open()函數(shù)時,默認使用utf8,以'rb'或'wb'來進行文件的讀操作和寫操作。
第4條:用輔助函數(shù)來取代復雜的表達式
表達式如果變得比較復雜,應該考慮將其拆解成小塊,并把邏輯移入輔助函數(shù)中。
比如從一個字典中獲取一個值的判斷,有可能寫成:
foo_dict.get(key)
當字典中無法獲取到給定的 key 時,即返回 None,希望返回一個默認值,可以寫成:
value = foo_dict.get(key) or default_value
這樣就可以實現(xiàn)在字典中獲取不到指定 key 時,得到自己設置的默認值。
如果需要字典中取出的值時 int 型,則改為:
value = int(foo_dict.get(key)) or default_value
如果使用簡潔易懂的 if/else 表達式,可以寫成:
value = foo_dict.get(key)
value = int(value) if value else default_value
但是如果頻繁使用這種邏輯,更好的方式是做成輔助函數(shù)的方式,
def get_int(foo_dict, key, default=0):
value = foo_dict.get(key)
if value:
result = int(value)
else:
result = default
return result