用pythonic方式來思考(1)

先 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
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Python 面向對象Python從設計之初就已經(jīng)是一門面向對象的語言,正因為如此,在Python中創(chuàng)建一個類和對...
    順毛閱讀 4,371評論 4 16
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,653評論 19 139
  • 01 “早更!一定是早更!” 從樓下星巴克回來的我,電腦一開就蹦出露西極其憤怒的投訴,害的我差點用咖啡星子濺電腦一...
    瓊華Vivian閱讀 4,770評論 17 22
  • 行俠仗義、懲惡揚善、嫉惡如仇、劫富濟貧,哪怕你是“朗生”,那你也與格薩爾無異。by張承宇 永遠永遠永遠,這片土地永...
    張承宇Tomato閱讀 305評論 0 1
  • 1:棧 (1.6) : 主要是用于實現(xiàn)堆棧數(shù)據(jù)結構的存儲方式。先進后出 2:隊列(雙端隊列1.5): 主要是為了...
    小小機器人閱讀 1,589評論 0 0

友情鏈接更多精彩內(nèi)容