一般交換兩個值是借助中間變數來實現,不過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可以正確地釋放掉資源。舉個常見的例子 在資...