編寫高質量Python程式(三)基礎語法

2021-10-05 05:19:37 字數 4155 閱讀 7134

本系列文章為《編寫高質量**——改善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中常用的異常處理語法是tryexceptelsefinally,它們可以有多種組合。語法形式如下:

# 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 規則中靠前的定義獲得顯示版式。框架為先,細節次之...