引論
建議1:理解pythonic
的概念pythonic
也許可以遮陽定義:充分體現python
自身特色的**風格。
python
中兩個變數交換只需一行:
a,b= b,a
遍歷乙個容器時可以為:
for i in alist:
do_sth_with(i)
開啟檔案,需要安全的關閉檔案可以為:
with open(path,』r』) as f:
do_sth_with(f)
如果想倒序輸出乙個列表可以這樣:
printlist(reversed(a))
寫pythonic
程式需要對標準庫有充分的理解,特別是內建函式和內建資料型別。比如對於字串格式化,一般這樣寫:print『hello%s!』%(『tom』)
。其實%s
是非常影響可讀性的,因為數量多了之後,就很難分清佔位符對應哪乙個實參,所以pythonic
的**是這樣的。
print『hello %(name)s!』%(『name』:』tom』)
value=
print『%(greet)s from %(language)s.』%value
print『 from 』.format(greet = 『helloworld!』,language = 『python』)
建議2:編寫pythonic
**(1).
要避免劣化**
1避免只用大小寫來區分不同的物件
2避免使用容易引起混淆的名稱
3不要害怕過長的變數名
(2).
深入認識python
有助於編寫pythonic**1
全面掌握python
提供給我們的所有特性,包括語言特性和庫特性。其中最好的學習方式應該是通讀官方手冊中的languagereference
和libraryreference。2
隨之python
版本的更新,知識也要更新。
3深入學習業界公認比較pythonic
的**,比如flask
、gevent
、requests
等。建議3
:理解python
與c語言的不同之處
(1).』
縮排』與』{}』
python
使用嚴格的**縮排方式分隔**塊,所以空格和tab
鍵不能隨便敲了。
(2).』
與 「c
語言中』和」是有嚴格區別的,在python
中,單引號和雙引號,僅僅在輸入字串內容的時候,存在微小差異。
(3).
三元操作符』?:』
c?x:y
在python
中等價的形式為xif c else y
(4).switch…case
python
中沒有這樣的分支語句,但可以使用ifelif… else
來替代。
或使用跳轉表來實現
def f(x):
return.get(n,」only single-digit numbers areallowed\n」)
不要唄其他語言的思維和習慣困擾,掌握python
的哲學和思維方式才是硬道理。
建議4:在**中適當新增注釋、
python
中有3種形式的**注釋:塊注釋、行注釋以及文件注釋。這三種形式的慣用法大概有如下幾種:
(1).
使用塊注釋僅僅注釋那些複雜的操作、演算法,還有可能別人難以理解的技巧或者不夠一目了然的**。
(2).
注釋和**隔開一定的距離,同時在塊注釋之後最好多留幾行空白在寫**。
(3).
給外部可訪問的函式和方法新增文件注釋。注釋要清楚描述方法的功能,並對引數、返回值以及可能發生的異常進行說明,使得外部呼叫它的人員僅看docstring
就能正常使用。
(4).
申明、模組描述等,如有必要可考慮加入作者資訊以及變更記錄。
建議5:通過適當新增空行使**布局更加優雅
在乙個團隊中,保持良好的**格式需要團隊成員在選取一套合適的**格式規則的基礎上遵從和應用。往往**不斷修改,所有可讀性直接關係到可維護性和可擴充套件性。
(1).
在一組**表達完乙個完整思路之後,應該用空白行進行間隔。
(2).
盡量保持上下文語義的易理解性,如當乙個函式呼叫另乙個函式的時候,盡量將他們放在一起,最好呼叫者在上,被呼叫者在下。
(3).
避免過長的**行,每行最好不要超過80
個字元。超過的部分可以用括號進行行連線,並保持元素垂直對齊。
(4).
不要為了保持水平對齊而使用多餘的空格,使閱讀者更容易理解**更重要。
(5).
空格的使用要能夠在需要強調的時候警示讀者,二元運算子左右兩邊應該有空格,逗號和分號前不要使用空格,函式名和左括號之間、序列索引操作時序列名和
之間不需要空格,函式預設的引數兩端不需要空格,強調前面的操作符時使用空格。
建議6:編寫函式的四個原則
函式能夠帶來最大化的**重用和最小化的**冗餘。一般函式設計有以下基本規則可以參考:
原則1函式設計要盡量短小,巢狀層次不宜過深。所謂短小,就是前面所提到的一樣盡量避免過長函式。
原則2函式申明應該做到合理、簡單、易於使用。除了函式名能反映其大體功能外,引數個數同樣不宜過多。
原則3函式引數設計應該考慮向下相容。有時候隨著需求和版本的公升級,需要進行一定的修改才能滿足這個版本的需求,設計過程中除了著眼當前的需求還得考慮向下相容
原則4乙個函式只做一件事,盡量保持函式語句粒度的一致性。
建議7:將常量集中到乙個檔案
實際上python
的內建命名空間是支援一小部分常量的,如我們熟悉的true
、false
、none
等,如何使用常量呢?一般來說有兩種方式。
(1).
通過命名風格來提醒使用者該變數代表的意義為常量,如常量名所有字母大寫,用下劃線連線各個單詞,如max_overflow
、total
。這是一種約定俗成的風格。
(2).
通過自定義的類實現常量功能。這要求符合「命名全部為大寫」和「值一旦繫結便不可再修改」這兩個條件。下面是一種常見的解決方法,它通過對常量對應的值進行修改時或者命名不符合規範時丟擲異常來滿足以上常量的兩個條件。
#const.py
class_const:
classconsterror(typeerror): pass
classconstcaseerror(consterror): pass
def __setattr__(self,name,value):
if self.__dict__.has_key(name):
raise self.consterror,」can』t change const %s」%name
if not name.isupper():
raise self.consrcaseerror,』const name 「%s」 is not all uppercase』%name
self.__dict__[name]= value
import sys
sys.modules[__name__]= _const()
使用時直接import const
即可
import const
const.company= 「ibm」
無論採用哪一種方式實現常量,都提倡將常量集中到乙個檔案中,因為這樣有利於維護,一旦需要修改常量的值,可以集中統一進行而不是逐個檔案去檢查。
摘選改善Python程式的91個建議2
62 metaclass stackflow 中文翻譯 63 python物件協議 65 python的迭代器協議 iter 可迭代物件 返回迭代器iterator 呼叫 呼叫一次返回乙個元素,當最後乙個元素返回後,再次呼叫時,丟擲stopiteration 異常 iterator.next 或 n...
改善python程式的91個建議讀書筆記 3
建議7.將常量集中到乙個檔案 python的內建命名空間是支援一小部分常量的,如true,false,none.只是python沒有提供定義常量的直接方式而已.那麼在python中應該如何使用常量呢?一般來說有以下兩種方法 1.通過命名風格來提醒使用者該變數代表的意義為常量.如常量名所有字母大寫,用...
改善C 程式的157個建議(1)
2.使用預設轉型方法 3.區別對待強制轉型與as和is 1 避免裝箱 什麼是裝箱?指將乙個值型別隱式的轉換為object型別。裝箱為什麼會帶來效能損耗?因為它需要完成下面三個步驟 1 會為值型別在託管堆中分配記憶體。除了使用值型別本身所分配的記憶體空間外,記憶體總量還要加上型別物件指標和同步塊索引所...