31 March, 2009

分析遞迴結構

假設我們想將下面的資料
(A ((B (C D)) (E F)))
根據括號的順序以產生下面的結果
(C D)
(B (C D))
(E F)
((B (C D)) (E F))
(A ((B (C D)) (E F)))
該怎麼做呢?

27 March, 2009

台南市的大陸書店

Ptt 托福考試板 看到台南市大陸書店的介紹,想說就記錄一下,之後可能會想去逛逛。

26 March, 2009

校慶 3000 公尺

3月25日是學校校慶,我參加了 3000 公尺的比賽, 今年比賽日期是到3月初才公布, 害我只有3個禮拜的時間可以準備, 平常都是練 8-10 km 順順的跑,沒有特意加強速度, 為了參加比賽,我還練了間歇跑提升速度。 根據練習的數據來看,我最快可以跑到 11 分 30 秒。 去年一直在受傷的陰影中,沒辦法參加比賽,直到今年初才完全復原, 再加上又老了一歲,我想應該沒法在這一次比賽中突破之前的記錄。

07 March, 2009

用 bash 及 mv 換檔名

JeffHung 寫了一篇文章介紹 用 find、sed、xargs 及 mv 換檔名,其實我還蠻常遇到這個問題的, 底下介紹我的做法。假設現在想要把下面第一欄的檔名換成第二欄的檔名
a.vcproj -> a.vc9.vcproj
b.vcproj -> b.vc9.vcproj
a.vcproj -> c.vc9.vcproj
其實只要用 bash 寫一個 for 迴圈就解決了

26 February, 2009

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。 底下摘錄幾句讓我引起共鳴的話,並附上翻釋, 有錯請不吝指正。