Python程式設計慣用法

2021-10-02 12:30:37 字數 1923 閱讀 3712

一般交換兩個值是借助中間變數來實現,不過python有更簡單的實現方式:

x, y = y, x

這種方式耗時少,**也更加簡潔。

之所以能這樣,因為一般情況下python的表示式的計算順序是從左到右,但是遇到表示式賦值的時候,表示式右邊的操作會先於左邊的運算元計算,因此表示式 exp3, exp4 = exp1, exp2 的計算順序是exp1,exp2–>exp3,exp4;計算完右邊的表示式,通過python的packing機制建立乙個元組,元組的值依次分配給左邊的識別符號,通過解包機制(unpacking),exp1,exp2依次得到分配值。

lazy evaluation是指僅僅在真正需要執行的時候才計算表示式的值。其特性主要帶來兩個方面的好處:

a, 避免不必要的計算,帶來效能上的提公升。

對於表示式 if x and y, 在x為false的情況下,y表示式的值將不再計算。而對於if x or y,當x的值為true的時候將直接返回,不再計算y 的值。因此,在程式設計過程中,如果對於or表示式應該將值為真的可能性較高的變數寫在or的前面,而and則應該推後。

b, 節省空間,使得無限迴圈的資料結構成為可能。

最典型的例子就是生成器表示式,它僅在每次需要計算的時候才通過yield產生所需要的元素,例如斐波那契數列:

def

fib():

a, b =0,

1while

true

: yiled a

a, b = b, a+b

from itertools import islice

print

(list

(islice(fib(),

6)))

# [0,1,1,2,3,5]

對序列進行迭代獲取序列中的元素是乙個普遍簡單的需求,實現方式也很多;

方法一:在每次迴圈中對索引變數自增

list_raw = ['a', 'b','c']

index = 0

for i in list_a :

print("index:", index, "element:", i)

index += 1

方法二: 使用range和len函式

計算序列長度,然後迭代。

方法三: 使用while迴圈

list_raw = ['a', 'b','c']

index = 0

while index < len(list_raw):

print(index, list_raw[index])

index += 1

方法四:使用zip方法

list_raw = ['a', 'b','c']

for ind, elem in zip(range(len(list_raw)), list_raw):

print(ind, elem)

方法五: 使用enumerate()獲取序列的索引和值

list_raw = ['a', 'b','c']

for i, e in enumerate(list_raw):

print(i, e)

推薦使用方法五,**清晰簡潔,可讀性好。它具有一定的惰性,每次僅在需要的時候才會產生乙個(index,item)對。

對於字典的迭代迴圈,enumerate函式並不合適,字典會被轉換成了序列進行處理。

要獲取字典的key和value,應該適用iteritems函式:

dict_data = 

for k, v in dict_data.iteritems():

print(k,v)

python字元編碼慣用法

本文總結在實際應用中遇到的python字元編碼問題,制定一套編碼相關的約定,避免編碼上的錯誤。在寫猥瑣寶典時需要總結soj上做過的題,準備在總結過程中順便寫乙個soj上的題解。題解使用python可讀,也就是python可以直接eval的格式,以便於處理。寫題解老是copy soj上的題目id,ti...

python字元編碼慣用法

在寫猥瑣寶典時需要總結soj上做過的題,準備在總結過程中順便寫乙個soj上的題解。題解使用python可讀,也就是python可以直接eval的格式,以便於處理。寫題解老是copy soj上的題目id,title不是太方便,所以就準備自動生成乙個空的題解,裡面包含了我做過的題。然而直接從soj上只能...

C 之RAII慣用法

c 中的raii全稱是 resource acquisition is initialization 直譯為 資源獲取就是初始化 但是這翻譯並沒有顯示出這個慣用法的真正內涵。raii的好處在於它提供了一種資源自動管理的方式,當產生異常 回滾等現象時,raii可以正確地釋放掉資源。舉個常見的例子 在資...