本系列文章為《編寫高質量**——改善python程式的91個建議》的精華彙總。python的3種引入外部模組的方式:
import
語句、from ... import ...
和__import__
函式。其中前兩種比較常見。
在使用import
時,應注意:
對於from a import ...
,如果無節制的使用,會帶來的問題:
python 直譯器會將++i
解釋為+(+i)
,其中+
表示正數符號。對於--i
也是類似。
因此,要明白++i
在 python 的語法層面上是合法的,但並不是通常意義上的自增操作。
對檔案操作完成後,應該立即關閉它們,因為開啟的檔案不僅會占用系統資源,而且可能影響其他程式或者程序的操作,甚至會導致使用者期望與實際操作結果不一致。
python 提供了 with 語句,語法為:
with 表示式 [
as 目標]
: **塊
with 語句支援巢狀,支援多個 with 子句,它們兩者可以相互轉換。with expr1 as e1, expr2 as e2
與下面的巢狀形式等價:
with expr1 as e1:
with expr2 as e2:
在迴圈中,else
子句提供了隱含的對迴圈是否由break
語句引發迴圈結束的判斷。例子:
# 以下兩段**等價
# 借助了乙個標誌量 found 來判斷迴圈結束是不是由 break 語句引起的。
defprint_prime
(n):
for i in
range(2
, n)
: found =
true
for j in
range(2
, i)
:if i % j ==0:
found =
false
break
if found:
print
("{} is a prime number"
.format
(i))
defprint_prime2
(n):
for i in
range(2
, n)
:for j in
range(2
, i)
:if i % j ==0:
break
else
:print
("{} is a prime number"
.format
(i))
當迴圈「自然」終結(迴圈條件為假)時else
從句會被執行一次,而當迴圈是由break
語句中斷時,else
子句就不被執行。
與for
語句相似,while
語句中的else
子句的語意是一樣的:else
塊在迴圈正常結束和迴圈條件不成立時被執行。
python中常用的異常處理語法是try
、except
、else
、finally
,它們可以有多種組合。語法形式如下:
# run this main action first
try:
# 當 try 中發生 name1 的異常時,進行處理
except
:# 當 try 中發生 name2 或 name3 中的某乙個異常時
except
(name2, name3)
:# 當 try 中發生 name4 的異常時處理,並獲取對應例項
exceptas:
# 其他異常時,進行處理
except
:# 沒有異常時,執行
else
:# 無論有沒有異常,都執行
finally
:
異常處理,通常需要遵循以下幾點基本原則:
無論try
語句中是否有異常丟擲,finally
語句總會被執行。由於這個特性,finally
語句經常被用來做一些清理工作。
但使用finally
時,也要特別小心一些陷阱。
python 中以下資料會當作空來處理:
if list1 # value is not empty
do something
else
:# value is empty
do some other thing
注:__nonzero__()
方法 —— 該內部方法用於對自身物件進行空值測試,返回 0/1 或 true/false。
python 中一切皆物件,物件根據其值能否修改分為可變物件和不可變物件。
可變物件
在將可變物件作為函式預設引數的時候要特別緊惕,對可變物件的更改會直接影響原物件。
最好的方法是傳入none
作為預設引數,在建立物件的時候動態生成可變物件。
對於python中函式的傳參方法,既不是傳值,也不是傳引用。
正確的叫法應該是傳物件(call by object)或者說傳物件的引用(call-by-object-reference)。
函式引數在傳遞的過程中將整個物件傳入,
慎用可變長度引數*args, **kwargs
,原因如下:
可變長引數適合在下列情況下使用:
函式str()
和repr()
都可以將 python 中的物件轉換為字串,兩者的使用以及輸出都非常相似。有以下幾點區別:
在直譯器中直接輸入時預設呼叫repr()
函式,而print
則呼叫str()
函式
repr()
的返回值一般可以用eval()
函式來還原物件。通常有如下等式:obj == eval(repr(obj))
一般,類中都應該定義__repr__()
方法,而__str__()
方法則為可選,當可讀性比準確性更為重要的時候應該考慮定義__str__()
方法。如果類中沒有定義__str__()
方法,則缺省會使用__repr__()
方法的結果來返回物件的字串表示形式。使用者實現__repr__()
方法的時,最好保證其返回值可以用eval()
方法使物件重新還原。
靜態方法:
classc(
object):
@staticmethod
deff
(arg1, arg2,..
.):
類方法:
classc(
object):
@classmethod
deff
(cls, arg1, arg2,..
.):
都可以通過類名.方法名
或者例項.方法名
的形式來訪問。
其中,靜態方法沒有常規方法的特殊行為,如繫結、非繫結、隱式引數等規則,而類方法的呼叫使用類本身作為其隱含引數,但呼叫本身並不需要顯示提供該引數。
類方法
靜態方法
如何編寫高質量的程式 常量
常量是一種識別符號,它的值在執行期間恆定不變。合理使用常量,對提高程式的可移植性 可讀性和準確性都有著很重要的意義。那麼定義常量有哪些方法?在類中定義常量的實質是什麼?常量和列舉的實質區別在 本文就要回答這個問題。1 為什麼需要常量 如果不使用常量,直接在程式中填寫數字或字串,將會有什麼麻煩?1 程...
編寫高質量的CSS
我們應用css的能力應該分成兩部分 一部分是css的api,重點是如何用css控制頁面內元素的樣式 另一部分是css框架,重點是如何對css進行組織。base層 reset功能 通用類 common層 元件級別的css類 page層 頁面級別css樣式 舉個例子,有兩個列表,列表條目1字型14px紅...
高質量CSS編寫規範
id和class的命名在保持語義性的同時盡可能的短.可以縮寫單詞,但縮寫後務必能讓人明白其含義。比如author縮寫成atr就非常費解。屬性書寫順序,首先定義顯示屬性 推薦的寫法 selector 不推薦的寫法 selector 這樣,就可以從css 規則中靠前的定義獲得顯示版式。框架為先,細節次之...