為什么選擇Python作為科學計算語言?
有關于Matlab和Python哪個更適合作為科學計算語言的爭論已久,之所以選擇Python作為首選的科學計算語言,不僅僅是因為它免費,開源,有很多優秀的庫和社區,基于 C 和 Fortran 開發有更好的表現,我想更多的是 Python 作為一種編程語言的簡潔優雅深深吸引了我。Python 的設計原則有著禪宗的意味,輸入import this就能在 Python 解釋器中一窺玄機。
In [1]: import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
...
Data Structures in Python
Python 有四個內建的 Data Structures —— 列表 (List),元組 (Tuple),字典 (Dictionary) 以及集合 (Set),它們可以統稱為容器 (container).
列表 (List)
Python 中最基本的數據結構是列表 (List)。 一個列表是一個有序的集合。
a = [1, 'abc', [2, 3]] # a 是一個 list
- 索引與切片
通過方括號對列表的第n個元素讀值和賦值:
a[0] = 1 # 列表是從0開始索引的
a[1] = 'abc'
也可以用方括號來“切去”列表:
a[0:2] = ['abc', [2, 3]] # 索引a的前兩個元素
a[-1:] = [2, 3] # 索引a的最后一個元素
a[-2:] = ['abc', [2, 3]] # 索引a的后兩個元素
a[:-1] = [1, 'abc'] # 索引除了最后一個的其他元素
- 列表相關函數
a = [1, 2, 3, 4, 5] # a 是一個 list
與列表先關的函數有很多,例如 compare( ),len( ),sum( ),min( ),max( ) ,sorted( ) 等,它們的具體用法如下:
In: sum(a)
Out: 15
In: max(a)
Out: 5
In: len(a)
Out: 5
- 列表相關方法
a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5] # a 是一個 list
此外,作為對象,列表本身自帶了很多實用的方法,如下所示:
In: a.append(1) # 在a的末尾加一個元素1
Out: a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5, 1]
In: a.count(3) # 統計a中3出現的次數
Out: 3
In: a.extend([2, 3]) # 將[2, 3]追加到a的末尾中
Out: a = [1, 3, 5, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
In: a.insert(2, 1) # 將1插入a索引為2的位置
Out: a = [1, 3, 1, 5, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
In: a.pop(3) # 移除a中索引為3的元素
Out: a = [1, 3, 1, 3, 9, 7, 11, 13, 3, 5, 1, 2, 3]
- 列表解析 (List comprehension)
最后,列表解析功能能夠簡化我們對列表內元素逐一進行操作的代碼,如下所示:
a = [1, 2, 3]
b = []
for i in a:
b.append(i+2)
a = [1, 2, 3]
b = [i+2 for i in a]
元組 (Tuple)
元組和列表有很多相似的地方,對列表的很多操作都可以對元組做,但元組和列表有兩點不同的地方:
- 外形上
從外形上看,它們的區別是:列表是用方括號標記的,而元組是用圓括號標記的;
a = [1, 'abc', [2, 3], 'd'] # a 是一個 list
b = (1, 2, 3, 4, 5, 6, 7) # b 是一個 tuple
功能上
從功能上看,它們的區別是:列表可以被修改,而元組不能被修改,因此上述列表相關函數對元組適用,列表相關方法對元組往往就不適用。元組是通過函數返回多重值的便捷方法
def sum_and_product(x, y):
return (x + y), (x * y)
sp = sum_and_product(2, 3) # (5, 6)
s, p = sum_and_product(2, 3) # s = 5, p = 6
字典 (Dictionary)
Python 中的另一種基本數據結構是字典,它將值和鍵練習起來,讓我們可以通過鍵快速找到對應的值:
- 創建一個 dictionary
empty_dict = {} # 創建一個空的dictionary
date = {'yesterday': 28, 'today': 29, 'tomorrow': 30} # 創建一個有內容的dictionary
- 字典的訪問與賦值
我們可以通過方括號來查找鍵的值或為鍵值賦值:
date['yesterday'] # 28
date['the_day_after_tomorrow'] = 31
- 字典的方法
date_keys = date.keys() # 返回鍵的列表
date_values = date.values() # 返回值得列表
date_items = date.items() # (鍵,值)元組的列表
- defaultdict
假設你需要計算某份文件中的單詞數目。一個明顯的方式是,建立一個鍵是單詞,值是單詞出現次數的字典。傳統的方法都略顯笨拙,這也是 defaultdict 的用途所在。一個 defaultdict 相當于一個標準的字典,除了當你查找一個沒有包含在內的鍵時,它用一個你提供的零參數函數建立一個新鍵,并為它的值增加1。
from collections import defaultdict
word_counts = defaultdict(int)
for word in document:
word_counts[word] += 1
- Counter
一個計數器將一個序列的值轉化成一個類似整型的標準字典 (即defaultdict(int))的鍵到值的對象映射。我們主要用它來生成直方圖:
from collections import Counter
c = Counter([0, 1, 2, 0]) # c = {0 : 2, 1 : 1, 2 : 1}
注:字典的鍵不可改變,尤其是不能將列表作為鍵,如果你需要一個多維的鍵,應該使用元組或設法將鍵轉換成為字符串。
集合 (Set)
集合是 Python 中內置的另外一種數據結構。同數學上的集合概念類似,它與列表的主要區別在于:1. 它的元素是不重復的,且是無序的;2. 它不支持索引,一般通過花括號或者set()函數創建。
- 創建一個 set
s = {1, 2, 3, 4, 2} # 2會被自動去重,得到{1,2,3,4}
s = set([1, 2, 3, 4, 2]) # 同樣2被自動去重,將list轉換為set
- 集合上非常快速的操作:in
test_list = [1, 3, 2, 7, 8]
4 in test_list # False, 但需要檢查每個元素
test_set = set(test_list)
4 in test_set # 非常快速的檢查
注:我們使用 set 的頻率要遠低于 dictionary 和 list。
Stay hungry, Stay foolish. -- Steve Jobs