本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。 ...
本系列來自《編寫高質量代碼 改善python程式的91個建議》的讀書筆記整理。
本書主要內容
1)容易被忽視的重要概念和常識,如代碼的佈局和編寫函數的原則等; 2)編寫python程式管用的方法,如利用assert語句去發現問題,使用enumerate()獲取序列迭代的索引和值等; 3)語法中的關鍵條款,如有節制地使用from…import語句,異常處理的幾點基本原則等; 4)常見庫的使用,如按需選擇sort()或者sorted(),使用Queue使多線程更安全等; 5)python設計模式的使用,如用發佈訂閱模式實現松耦合,用狀態模式美化代碼等; 6)python內部機制,如名字查找機制,描述符機制等; 7)開發工具的使用,如pip等各種開發工具的使用,各種代碼測試用具的使用等; 8)python代碼的性能分析,優化的原則,工具,技巧,以及常見性能問題的解決等。本章主要內容
建議1:理解pythonic概念 建議2:編寫pythonic代碼 建議3:理解python與C語言的不同之處 建議4:在代碼中適當添加註釋 建議5:通過適當添加空行使代碼佈局更為優雅,合理 建議6:編寫函數的4個原則 建議7:將常量集中到一個文件建議1:理解pythonic概念
1)pythonic:充分體現python自身特色的代碼風格。 2)舉例:1 # 交換兩個變數的值,packaging/unpackaging機制 2 x = 2 3 y = 3 4 x, y = y, x 5 print x, y
1 # 字元串格式化 2 print 'Hello %(name)s!' % {'name': 'Tom'}
1 # 字元串格式化 2 print 'Hello {name}!'.format(name='Tom')3)python的包和模塊結構: (1) 包和模塊的命名採用小寫,單數形式且短小;(2)包通常作為命名空間,如只包含空的__init__.py文件。
建議2:編寫pythonic代碼
1)要避免劣化代碼:(1)避免只用大小寫來區分不同的對象;(2)避免使用容易引起混淆的名稱;(3)不要害怕過長的變數名; 2)pep8檢測工具:1 C:\>pip install -U pep8 2 3 C:\Users\Administrator\Desktop\zxt>pep8 --first database.py 4 database.py:83:1: E302 expected 2 blank lines, found 1 5 6 >pep8 --show-source --show-pep8 waijiao.py
建議3:理解python與C語言的不同之處
1)縮進與{} 2)'與" 3)三元操作符?: 4)switch...case1 n = raw_input("please input a number:") 2 if n == "0": 3 print "You typed zero." 4 elif n == "1": 5 print "You are in top." 6 elif n == "2": 7 print "N is an even number." 8 else: 9 print "Error!"用跳轉可以實現:
1 def func(): 2 return { 3 "0": "You typed zero.", 4 "1": "You are in top.", 5 "2": "N is an even number." 6 }.get(n, "Error!")
建議4:在代碼中適當添加註釋
1)使用塊或者行註釋的時候僅註釋複雜的操作,演算法,難以理解的技巧或者不夠一目瞭然的代碼; 2)註釋和代碼隔開一定的距離; 3)給外部可訪問的函數和方法添加文檔註釋(ddocstring)(""" """); 4)推薦文件頭部包含copyright申明。模塊描述等。1 """ 2 Requests HTTP library 3 ~~~~~~~~~~~~~~~~~~~~~ 4 Requests is an HTTP library, written in Python, for human beings. Basic GET 5 usage: 6 >>> import requests 7 >>> r = requests.get('https://www.python.org') 8 >>> r.status_code 9 200 10 >>> 'Python is a programming language' in r.content 11 True 12 ... or POST: 13 >>> payload = dict(key1='value1', key2='value2') 14 >>> r = requests.post('http://httpbin.org/post', data=payload) 15 >>> print(r.text) 16 { 17 ... 18 "form": { 19 "key2": "value2", 20 "key1": "value1" 21 }, 22 ... 23 } 24 The other HTTP methods are supported - see `requests.api`. Full documentation 25 is at <http://python-requests.org>. 26 :copyright: (c) 2015 by Kenneth Reitz. 27 :license: Apache 2.0, see LICENSE for more details. 28 """
建議5:通過適當添加空行使代碼佈局更為優雅,合理
1)在一組代碼表達完一個完整的思路之後,應該用空白進行間隔; 2)儘量保持上下文語義的易理解性(如調用函數寫在被調用函數之上); 3)避免過長的代碼行,每行最好不要超過80個字元; 4)不要為了保持水平對齊而使用多餘的空格; 5)空格是使用要能在需要強調的時候警示讀者: (1)二元運算符的左右兩邊應該有空格; (2)逗號和分號前不要使用空格; (3)函數名和左右括弧之間,序列索引操作時序列名和[ ]之間不要空格,函數預設參數兩側不需要空格; (4)強調前面的操作符的時候使用空格。建議6:編寫函數的4個原則
1)函數設計儘量短小,嵌套層次不宜過深(最好控制在3層以內); 2)函數聲明應該做到合理,簡單,易於使用; 3)函數參數設計應該考慮向下相容; 4)一個函數只做一件事,儘量保證函數語句粒度的一致性。建議7:將常量集中到一個文件
示例:const.py1 # -*-coding:UTF-8 -*- 2 3 import sys 4 5 6 class _const(object): 7 8 class ConstError(TypeError): 9 pass 10 11 class ConstCaseError(ConstError): 12 pass 13 14 def __setattr__(self, name, value): 15 if self.__dict__.has_key(name): 16 raise self.ConstError, "Can't change const.{name}".format(name=name) 17 if not name.isupper(): 18 raise self.ConstCaseError, 'const name "{name}" is not all uppercase'.format(name=name) 19 self.__dict__[name] = value 20 21 22 sys.modules[__name__] = _const()