17 December, 2008

Python Idiom: sort

本文將介紹如何使用 sort(), 參考資料來自 Sorting Mini-HowTo, 首先介紹基本用法
data = [2, 3, 4, 5, 1]
data.sort()
上述程式碼會將 data 的元素由小到大排序, 因為 sort() 是直接排序 data 的元素,而不是排序複製 data 的元素, 所以傳回值是 None 以避免困擾,如果要將排序過的資料傳給另一個序列要使用 sorted(),如
sorted_data = sorted(data)
假設現在 data 改成如下
data = [(11, 5, 1000), (13, 4, 10),
        (17, 6, 100), (19, 5, 1) ]
想要以 tuple 的第二、三、一個元素的大小做排序,該怎麼做?

10 December, 2008

二十世紀的數學

在網路無意間找到 Michael Atiyah 的一個演講「二十世紀的數學」, 看完之後,對於二十世紀數學的發展有了基本了解,實在相當精彩。 花了一些時間排版,內容來自 簡體中文 的翻譯。可以在 這裡(pdf 檔)這裡(ps 檔) 下載原文。底下是目錄:

04 December, 2008

妳的彩虹是什麼顏色?

jserv 的部落格看見一個好玩的測驗 What color is your rainbow?。 彩虹的顏色是紅橙黃綠藍靛紫,

 
 
 
 
 
 
 

但是每個人看事情的角度不同, 這個測驗會依據你的人格特質做出一個獨特的彩虹。 測驗的題目都是二選一,挑出使你快樂或者愉快的答案, 如果不確定要選那一個,可以跳過, 題目不多,很快就可以做完了,有興趣的人可以試試看 :P

28 November, 2008

Python Idiom: dictionary

這次將介紹 dictionary 的常見用法,底下是建立 dictionary 的兩種方法
d = dict(a=1, b=2, c=3)
d = {'a': 1, 'b': 2, 'c': 3}
第一種做法不用打括號,打字會稍微快一點, 如果要用兩個 list 分別當作 dictionary 的 keys 跟 values, 可以利用 zip() 這個函式,例如
names = ['a', 'b', 'c']
counts = [1, 2, 3] 
d = dict(zip(names, counts))

19 November, 2008

Python Idiom: map, filter

這次我將介紹兩個跟 functional programming 有關的函式 map 及 filter。 假設我想把 list 中每一個元素平方之後放到一個新的 list,最直接的做法是
items = [1,2,3,4,5]
result = []
for i in items:
     result.append(i*i)
map 提供了另一種方法
def square(x):
     return x*x
result = map(square, items)
map 的第一個參數是函式,第二個參數是序列, 而傳回值則是將輸入的函式套用到輸入序列的每一項元素所形成的新序列。 其實還可以寫得更短
result = map(lambda x: x*x, items)
上面例子中的 lambda x: x*x 定義了一個無名函式,效果就如同前面定義的 square()。

06 November, 2008

推薦網站:The Big Picture

The Big Pictureboston.com 下的一個 photo blog,意在提供高品質令人驚豔的影像包含了當前的事件, 少為人知的故事,還有任何有趣的事情。 底下列出讓我印象深刻的系列:

05 November, 2008

Python Idiom: in

這次將介紹 in 這個關鍵字, in 最常出現在下面的用法
for key in d:
    print key
其中 d 的型態可以是 list, tuple, set, string, dictionary 等。 要檢查一個字串是否含有某子字串,通常會想到下面的做法
sentence = "fly me to the moon"
if sentence.find("fly") != -1:
     print "successful"
其實更好的方法是用 in
if "fly" in sentence:
     print "successful"
是不是更好閱讀,打字也更快呢?

04 November, 2008

Python Idiom: join

如果要將一個 list 中的所有字串接起來 ,一般的做法是
items = ['red', 'blue', 'green', 'yellow']

result = ''
for s in items:
    result += s
Python 提供了一個更有效率的解法
result = ''.join(items)
如果字串中間要用逗號跟空白做分隔時,只要改成
result = ', '.join(items)
單括號內的字串就是隔開 items 元素的分隔物, 所以如果單括號內是空的,就表示沒有分隔物。 底下介紹上述技巧的應用

03 November, 2008

Python Idiom: list comprehensions

寫程式時常常會遇到許多的 for 跟 if,如下面的範例
numbers = [1,2,3,4,5,6]
squares = []
for n in numbers:
     if n % 2 == 0:
         squares.append(n*n)
上述程式碼將 numbers 中是偶數的元素平方之後加到 squares。利用 list comprehensions 只要一行程式碼就可以完成目的。
squares = [n*n for n in numbers if n % 2 == 0]
請注意程式的可讀性是不是並沒有因為程式碼的縮短而減少呢? 其實 list comprehensions 中可以有很多個 for 跟 很多個 if, 不過使用時要斟酌一下,如果真的有很多個 for 跟 if, 最好考慮使用一般的寫法,不然程式就會變得不易閱讀。

02 November, 2008

Python Idiom: enumerate

接續 上次 的文章,這次來介紹一個關於迴圈的技巧。 如果想要印出一個 list 的內容,Python 的標準做法是
for item in items:
     print item
但如果要同時把 item 的 index 也印出來,該怎麼做?

31 October, 2008

給年輕數學家的建議 - Alain Connes

接續 上次 的文章,上一篇只摘錄了第一位數學家 Michael Atiyah 的話, 這次則是摘錄了第三位數學家 Alain Connes 的話,Alain Connes 是法國數學家,研究領域是 operator algebra, 1982 年拿過 Fields Medal, 曾將其工作應用到理論物理, 他在文章的開頭還將數學家跟物理學家比喻成物理中兩種的基本粒子。 這次摘錄的話比較難翻釋,因為句子較長, 而且有些地方比較抽象,我沒有把握可以完全翻釋出作者的意思, 閱讀時請小心。

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

22 October, 2008

使用命令列上傳 google 文件

相信很多人都會使用 Google Docs 來撰寫文件吧, 我則是拿它當作文件備份的工具,平常我會將一些想要記錄的事寫成純文字檔, 比如記錄機車加油的里程數,英文單字,還有買了那些東西,假設這三個檔案分別叫做 bike.txt, vocabulary.txt, buy.txt, 因為懶得登入找到文件再找到上傳的按鈕,我想要使用下面的命令列就好了:

google_docs bike.txt vocabulary.txt buy.txt

21 October, 2008

generating all vertices of a box

續之前產生 排列組合 的問題,無意間又發現了一個新的解法,先回顧問題一下, 如何產生下面的序列?

0000
1000
0100
1100
0010
1010
0110
1110
0001
1001
0101
1101
0011
1011
0111
1111

20 October, 2008

給年輕數學家的建議 - Michael Atiyah

Terence Tao Peter Woit 不約而同地介紹了 The Princeton Companion to Mathematics, 這本書是一本數學參考書,主要是寫給對數學有興趣的人, 包含了兩百多個項目,分別由世界上項尖的數學家所撰寫, 介紹了基本的數學工具及字彙;追溯當代數學的發展; 解釋基本名詞及概念;檢視數學主要分支的核心概念; 描述有名數學家的成就;檢視數學對其它領域的影響如生物、經濟、音樂等。

令人高興的是 書中的某些文章 可直接下載觀看, 最令我感興趣的是 Advice to a Young Mathematican 這一段,當中5位數學家描述了他們做研究的方式,其中的心路歷程, 還有從幫助學生變成研究者所得到的心得。 第一位英國數學家 Michael Atiyah,他拿過 1966 年的 Fields Medal, 還有 2004 年的 Abel Prize。 底下摘錄幾句讓我引起共鳴的話,並附上翻釋, 有錯請不吝指正。

07 September, 2008

愛情轉移 - 富士山下

太久沒發文了,因為一直在寫 paper,發一篇歌詞來充版面吧 XD

28 March, 2008

George Dantzig

Terence Tao 的部落格看到 這篇, 就有了介紹 George Dantzig 這位美國數學家的念頭。 學過 linear programming 大概都知道 George Dantzig 吧,他最為人所知的貢獻就是發展 simplex method 來解 linear programming 的問題。 (linear programming 中文是線性規劃,簡寫是LP,陳唐山還是外交部長的時候, 這兩個字母上過新聞 XD) 題外話,目前解線性規劃最有效率的方法已經不是 simplex method 而是 inter point method

27 March, 2008

關於本站

我是從 2005 開始寫部落格,第一個部落格落腳在 Blogger, 那時候 Blogger 對中文的支援還很差, 後來就轉到 養樂多 (Yam-Roodo), 蕃薯藤 (Yam) 被 web-tv 買下之後就與樂多 (Roodo) 分家了, 而我選擇留在 樂多,為了以防萬一, 我在 Blogger 又建立了一個部落格,兩個部落格會同時更新。

開始寫部格落之後,學到很多東西。 為了做網頁我重新開始學 XHTML、CSS, 甚至還學了一點 JavaScript, 這個部落格的樣式就是我學習的成果。 因為所見即所得 (WYSIWYG) 軟體寫出來的網頁達不到我的要求, 所以我是用寫原始碼的方式在寫網頁。 我認為有心做出好網頁的人一定要學習基本 XHTML 與 CSS 的語法,才是正道。 在學做網頁之前建議先了解什麼是 Web Standards ,有個概念即可,不用強求每一項都了解。

為了放圖片,所以開始使用 flickr, 為了有效地瀏覽其他人的部落格,所以開始使用 Google Reader, 為了整理每天所看到的一堆書籤,所以開始使用 美味書籤。 之前不想使用這些服務的藉口是懶,懶得去學新的東西, 可是當我開始使用這些服務之後, 卻後悔沒有早一點接觸這些技術, 這些技術讓我可以有系統地瀏覽、整理多到爆炸的資訊。 總之這一切都是從寫部格格開始的。 (目前在使用的服務還有 GmailBox.net。 ) 底下介紹將來我想寫的東西。

25 March, 2008

排列組合 in Python

還記得高中時的排列組合問題嗎? 比方說我有 d 個相同的球要放到 N 個位置, 位置沒有編號,總共有幾種放法呢?