30 October, 2008

Python Idiom: tuple

推薦三篇 Python 好文給喜歡 Python 的人, 分別是 David Goodger 所寫的 Code Like a Pythonista: Idiomatic Python 和 David 所寫的 Python Tips, Tricks, and Hacks 還有 Rob Kinght 所寫的 Python Idioms and Efficiency。 之後我會將從這幾篇學到的技巧陸續列上來。 首先介紹 tuple 的用法, 在 C 語言如果要交換變數 a 跟 b 的值,一般的做法是 tuple 的用法, 在 C 語言如果要交換變數 a 跟 b 的值,一般的做法是
tmp = a;
a = b;
b = tmp;
而在 Python 中只要一行就可以解決了
a, b = b, a
為什麼可以這樣做?原因是 Python 是靠逗號 , 來產生 tuple, 所謂 tuple 指的是由逗號所分隔開的一些值,這些值的型態不一定要一樣,比如
t = 12345, 54321, 'hello!'
如果要建造一個含有兩個 tuple 的變數,則要用圓括號 (,分別把兩個 tuple 括起來, 如
u = (12345, 54321, 'hello!'), (1, 2, 3, 4, 5)
現在回來看
a, b = b, a
等號右邊是一個 tuple (b,a), 如果要把 tuple 的值指定給等號左邊的 name 時, Python 會做一個 unpacking 的動作, 即把 tuple 的第一個元素的值指定給等號左邊的第一個 name, 依此類推,為什麼我要寫 name 而不寫變數的原因在 這裡。 另一個關於 unpacking 的動作如下
school = [['NSYSU', 'Kaohsiung', '07-5252000'],
          ['NCKU', 'Tainan', '06-2757575']]
for (name, location, phone) in school:
    print name, phone
上述的例子寫起來非常直觀吧, 好像在寫英文似的, 直觀的好處在於程式好寫不容易產生 bug, 一旦 bug 產生,抓蟲的時間搞不好比寫程式的時間還多,這點我深受其害 XD

No comments: