問題
你想去交換一些變量的值,可是你不想使用臨時變量。
解決
python的自動元組打包和解包能夠作到這點:
a, b, c = b, c, a python
Python代碼
a, b, c = b, c, a
討論
許多程序語言讓你使用臨時中間變量去交換變量的值。
temp = a
a = b
b = c
c = temp
可是python讓你使用tuple的打包和解包來直接賦值
a, b, c = b, c, a
在一個賦值中,python要求等號右邊是一個表達式。 這裏咱們所寫的b, c, a的確是表達式。要明確的是,它是一個元組, 有三個元素的不可變的序列。元組常常用圓括號括起來, 象(b, c, a)。 可是在這裏除了逗號是有一些其餘的意思之外(在一個函數調用中),圓括號不是必須的。
經過打包元組的每一項,用逗號來創建一個元組.在賦值語句的等號的左邊,你能夠正常的使用單個的對象。 這個對象可以是簡單的一個標示符號(也就是衆所周知的變量), 一個索引(例如alist[i] 和 adict['freep']), 一個屬性的引用(如anobject.someattribute)等等。然而,python也讓你在賦值語句的左邊,使用幾個用逗號分開的對象(變量,索引等等)。 那樣的一個多賦值也被稱爲解包賦值。 當有兩個或者更多的逗號分隔開的對象在一個賦值語句的左邊, 右邊的值必須是一個序列,並且它的數目要和左邊逗號分隔的對象同樣多。序列的每一項都被從左到右依次賦給相對應的目標值。
在這個配方中(譯註:書的名字叫python食譜,因此每一節都稱爲一個配方:)),
咱們有三個逗號分隔的目標對象在左邊,因此咱們須要右邊有三個元素的序列,他們是有三個元素的被打包的元組。第一個目標(變量)獲得第一個元素的值(它使用變量b的值), 第二個目標(b)獲得第二個元素的值(它使用變量c的值), 而且第三個即最後一個目標(c)獲得第三即最後一個元素(使用變量a的值)。 實際結果是一個在變量之間交換的值(你能夠想一想這個例子細節等價於一個旋轉)
元組使用逗號打包,序列經過放置幾個逗號分隔的目標到語句的左邊來解包。他們都是有用的,簡單的,廣泛的機制。經過結合他們,你能簡單地,優美地,天然地表達任何一組變量之間的值交換
######################################################################################### sql
python的打包操做,是指把現有的數據放到一個tuple中,例如: >>> t = 1 >>> t 1 >>> t = 1, >>> t (1,) sqlite3裏面的execute函數會過濾特殊符號,好比@,相似於: select name,mail from mTable where mail = 'aa@bb.com' 這樣的語句裏面的@就會被過濾掉,用tuple打包下就不會了: sqlString = 'aa@bb.com', 如今sqlString是一個tuple了,直接把它傳進去,就ok. 關於解包,還有一個有趣的應用: >>> a = 1 >>> b = 2 >>> a,b = b,a >>> a 2 >>> b 1 能夠利用一個打包,解包的過程來實現"不用臨時變量來交換值"
|