為什么選擇Python作為科學(xué)計算語言砸逊?
有關(guān)于Matlab和Python哪個更適合作為科學(xué)計算語言的爭論已久宴凉,之所以選擇Python作為首選的科學(xué)計算語言目尖,不僅僅是因為它免費(fèi)刨摩,開源跟狱,有很多優(yōu)秀的庫和社區(qū)俭厚,基于 C 和 Fortran 開發(fā)有更好的表現(xiàn),我想更多的是 Python 作為一種編程語言的簡潔優(yōu)雅深深吸引了我驶臊。Python 的設(shè)計原則有著禪宗的意味挪挤,輸入import this就能在 Python 解釋器中一窺玄機(jī)叼丑。
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 有四個內(nèi)建的 Data Structures —— 列表 (List),元組 (Tuple)扛门,字典 (Dictionary) 以及集合 (Set)鸠信,它們可以統(tǒng)稱為容器 (container).
列表 (List)
Python 中最基本的數(shù)據(jù)結(jié)構(gòu)是列表 (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'] # 索引除了最后一個的其他元素
- 列表相關(guān)函數(shù)
a = [1, 2, 3, 4, 5] # a 是一個 list
與列表先關(guān)的函數(shù)有很多星立,例如 compare( ),len( )葬凳,sum( )绰垂,min( ),max( ) 火焰,sorted( ) 等劲装,它們的具體用法如下:
In: sum(a)
Out: 15
In: max(a)
Out: 5
In: len(a)
Out: 5
- 列表相關(guān)方法
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) # 統(tǒng)計a中3出現(xiàn)的次數(shù)
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)
最后,列表解析功能能夠簡化我們對列表內(nèi)元素逐一進(jìn)行操作的代碼纯赎,如下所示:
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)
元組和列表有很多相似的地方谦疾,對列表的很多操作都可以對元組做,但元組和列表有兩點不同的地方:
- 外形上
從外形上看址否,它們的區(qū)別是:列表是用方括號標(biāo)記的餐蔬,而元組是用圓括號標(biāo)記的;
a = [1, 'abc', [2, 3], 'd'] # a 是一個 list
b = (1, 2, 3, 4, 5, 6, 7) # b 是一個 tuple
功能上
從功能上看佑附,它們的區(qū)別是:列表可以被修改樊诺,而元組不能被修改,因此上述列表相關(guān)函數(shù)對元組適用音同,列表相關(guān)方法對元組往往就不適用词爬。元組是通過函數(shù)返回多重值的便捷方法
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 中的另一種基本數(shù)據(jù)結(jié)構(gòu)是字典,它將值和鍵練習(xí)起來权均,讓我們可以通過鍵快速找到對應(yīng)的值:
- 創(chuàng)建一個 dictionary
empty_dict = {} # 創(chuàng)建一個空的dictionary
date = {'yesterday': 28, 'today': 29, 'tomorrow': 30} # 創(chuàng)建一個有內(nèi)容的dictionary
- 字典的訪問與賦值
我們可以通過方括號來查找鍵的值或為鍵值賦值:
date['yesterday'] # 28
date['the_day_after_tomorrow'] = 31
- 字典的方法
date_keys = date.keys() # 返回鍵的列表
date_values = date.values() # 返回值得列表
date_items = date.items() # (鍵顿膨,值)元組的列表
- defaultdict
假設(shè)你需要計算某份文件中的單詞數(shù)目。一個明顯的方式是叽赊,建立一個鍵是單詞恋沃,值是單詞出現(xiàn)次數(shù)的字典。傳統(tǒng)的方法都略顯笨拙必指,這也是 defaultdict 的用途所在囊咏。一個 defaultdict 相當(dāng)于一個標(biāo)準(zhǔn)的字典,除了當(dāng)你查找一個沒有包含在內(nèi)的鍵時,它用一個你提供的零參數(shù)函數(shù)建立一個新鍵梅割,并為它的值增加1霜第。
from collections import defaultdict
word_counts = defaultdict(int)
for word in document:
word_counts[word] += 1
- Counter
一個計數(shù)器將一個序列的值轉(zhuǎn)化成一個類似整型的標(biāo)準(zhǔn)字典 (即defaultdict(int))的鍵到值的對象映射。我們主要用它來生成直方圖:
from collections import Counter
c = Counter([0, 1, 2, 0]) # c = {0 : 2, 1 : 1, 2 : 1}
注:字典的鍵不可改變户辞,尤其是不能將列表作為鍵泌类,如果你需要一個多維的鍵,應(yīng)該使用元組或設(shè)法將鍵轉(zhuǎn)換成為字符串底燎。
集合 (Set)
集合是 Python 中內(nèi)置的另外一種數(shù)據(jù)結(jié)構(gòu)刃榨。同數(shù)學(xué)上的集合概念類似,它與列表的主要區(qū)別在于:1. 它的元素是不重復(fù)的书蚪,且是無序的喇澡;2. 它不支持索引,一般通過花括號或者set()函數(shù)創(chuàng)建殊校。
- 創(chuàng)建一個 set
s = {1, 2, 3, 4, 2} # 2會被自動去重晴玖,得到{1,2为流,3呕屎,4}
s = set([1, 2, 3, 4, 2]) # 同樣2被自動去重,將list轉(zhuǎn)換為set
- 集合上非尘床欤快速的操作:in
test_list = [1, 3, 2, 7, 8]
4 in test_list # False, 但需要檢查每個元素
test_set = set(test_list)
4 in test_set # 非承憔Γ快速的檢查
注:我們使用 set 的頻率要遠(yuǎn)低于 dictionary 和 list。
Stay hungry, Stay foolish. -- Steve Jobs