Python 資料型別及其用法
本文總結一下Python中用到的各種資料型別,以及如何使用可以使得我們的程式碼變得簡潔。
基本結構
我們首先要看的是幾乎任何語言都具有的資料型別,包括字串、整型、浮點型以及布林型別。這些基本資料型別組成了基本控制塊,從而建立我們的Python應用程式。
字串
字串(String) 是一段文字字元,通常以某種形式向用戶輸出。如果我們開啟Python的直譯器,我們試著最常見的輸出“Hello World!”應用:
>>> print ("Hello, world!")
Hello, world!
Python 中的資料型別不需要像Java或C語言那樣顯示的定義,這就意味著在Python中字串就是簡單地用引號括起來來標識,向上面的“Hello, world!”那樣。我們也可以使用單引號而不是雙引號,當我們字串中就有雙引號時,使用單引號來表示整個字串更加方便,如:
>>> print ("This is David's program")
This is David's program
>>> print ('"Hello", said David')
"Hello", said David
從上面你就可以看出在不同的條件下如何交叉使用不同的引號。
字串提供了許多內建的函式,這些在很多Python程式中很有用處,它們包括:
- endswith() - 檢查字串是否以給定字串結尾
- startswith() - 檢查字串是否以給定字串開始
- upper() - 將字串所有字元變成大寫
- lower() - 將字串所有字元變成小寫
- isupper()/islower() - 檢測字串是否全是大寫/小寫
- 我們也可以將字串作為一個引數傳入函式
len()
來返回字串的長度,例如 len(“david”)
Python中字串也是可迭代的,迭代的概念待會在列表和字典資料型別中可以做更深入的瞭解。這意味著我們可以依次迴圈字串中每個字元,這在其它語言一般是不行的。
另一個關於字串的技巧是,我們可以對字串進行格式化。最好的方法是用 format
語句來完成,這個函式為你處理你傳入物件的型別以字串形式顯示,所以你可以傳入任何型別的物件到 format
方法用來輸出。如下:
>>> string_1 = "Hello, {}, here is your string" .format("David")
'Hello, David, here is your string'
>>>
>>> string_2 = "Hello, {}, your are {} years old".format("David", 23)
'Hello, David, you are 23 years old'
>>>
>>> string_3 = "Hello, {}, your are {} years old".format("David", 23.5)
'Hello, David, you are 23.5 years old'
從上面的程式碼可以清晰地看出,format
方法可以用來將任意的 Python
資料型別替換成字串。
布林型別以及if語句
布林值 (True or False) 在任何語言中都是至關重要的,它們可以使我們根據變數的真假值來做出判斷,通過程式碼可以用來控制程式的路徑。在 Python 中,布林值的首字母是大寫的:True
和 False
。舉例來說,使用上面提到的字串的一些方法,我們可以測試一個字串是否是大寫,並輸出正確的結果:
>>> if "david".isupper():
print ('"david" is uppercase')
else:
print ('"david" is lowercase')
"david" is lowercase
Python 中if
語句用來檢查第一個條件是否為真,如果為True就會打印出
“david” is uppercase。然而在這個例子中,它返回False,所以 else 塊執行,打印出 “david” is lowercase 。
在Python中,資料有其隱式的真假值的,這對於使程式碼簡短、準確非常有幫助,就不需要每個地方都做判斷了。下面就是Python中使用隱式布林值的例子:
>>> bool('')
False
>>> bool('hello')
True
>>> a = None
>>> b = 1
>>> bool(a)
False
>>> bool(b)
True
>>> if a:
print ("Yes")
>>> if b:
print ("Yes")
Yes
在這個例子中,你可以看到我們可以檢查變數的真假值。通過呼叫bool
方法,傳入我們的變數給其做引數,返回True
或者 False。空值或者None(Python中類似其它語言Null 或者 Nil 的值)都會被認為是 False ,而其它情形則被認為是 True。
整型、浮點型、複數
數值(Numbers) 在Python中就像通常格式所代表的那樣,整型如1,10,56,1045,100433 等等。
浮點型,通常我們需要小數時使用,例如1.23、0.34532、23.4667 等等。
Python 支援簡單和高階的數學計算,有著廣泛的用途,最常用的還是基本的算術運算:
>>> 1 + 1
2
>>> 1 - 1
0
>>> 2 * 2
4
>>> 2 / 2
1
Complex numbers are also supported; imaginary numbers are written with a suffix of j or J. Complex numbers with a nonzero real component are written as (real+imagj), or can be created with the complex(real, imag) function.
>>> 1j * 1J
(-1+0j)
>>> 1j * complex(0,1)
(-1+0j)
>>> 3+1j*3
(3+3j)
>>> (3+1j)*3
(9+3j)
>>> (1+2j)/(1+1j)
(1.5+0.5j)
Complex numbers are always represented as two floating point numbers, the real and imaginary part. To extract these parts from a complex number z, use z.real and z.imag.
>>> a=1.5+0.5j
>>> a.real
1.5
>>> a.imag
0.5
更多高階結構
列表以及for迴圈
列表(list) 是Python以及其它語言中最常用到的資料結構之一。Python 使用中括號()用來解析列表,允許你以任意的順序儲存資料,從而方便處理。舉例來說,如果我們需要從一個物件中抽取一些資料,我們可以將這些資料存在列表中以備後面使用:
>>> my_list = []
>>> for object in objects:
my_list.append(object.name)
>>> print (my_list)
['name_1', 'name_2', 'name_3']
上面的例子並不好,但你可以看到我們是如果從物件中提取資料,並將它們放到我們的列表中。類似的,如果我們有兩個列表,使用extend
方法我們可以將它們合併成一個:
>>> list_1 = [1,2,3]
>>> list_2 = [4,5,6]
>>> print (list_1.append(list_2))
[1,2,3,[4,5,6]]
>>> print (list_1.extend(list_2))
[1,2,3,4,5,6]
這能清楚地看出這兩個重要方法的不同。
在我們的第一個例子中,使用到了for迴圈來從我們的資料中構成列表,一種更簡潔的解決方法可以使用列表擴充套件,這可以將整個過程壓縮成一行。這是Python提供的一種高效的解決方法:
>>> my_list = [object.name for object in objects]
>>> print my_list
['name_1', 'name_2', 'name_3']
再來看看這是如何對映到第一中方法的:在列表中,我們遍歷objects,使用object作為從objects取出每個元素的變數名,最後我們取出object的name構成我們的列表。
除了使用方括號用來構造列表物件之外,我們還可以使用列表建構函式list()
來建立我們的列表,如下:
>>> list('a')
['a']
>>> values = (1,2,3,4) # tuple object see below
>>> list(values)
[1,2,3,4]
字典
另一個普遍使用的Python資料結構是字典(Dictionaries)。字典用來儲存大量資料,並且提供快速處理的方法。一種常見的字典應用的例子是通訊錄系統。在字典這種資料結構中,你需要一個唯一的‘key’用來查詢它對應的‘value’。在通訊錄中,那個唯一的‘key’可以是電話號碼,因此,字典結構是這樣的:
>>> phonebook = {'012345678': 'A Person',
'987654321': 'A.N Other'}
這兒我們有一個字典,電話號碼作為‘key’,對應人名作為‘value’。現在我們可以使用這個結構來查詢,如下:
>>> phonebook['012345678']
'A Person'
Python的字典同樣提供迭代每個數的標準方法,它們是:iteritems、iterkeys以及itervalues。這些函式分別允許我們迭代keys和values,僅迭代keys以及僅迭代values。下面是例子:
迭代所有的項:
>>> for key, value in phonebook.iteritems():
print (key, value)
987654321 A.N Other
012345678 A Person
僅迭代所有的keys:
>>> for key in phonebook.iterkeys():
print (key)
987654321
012345678
僅迭代所有的values:
>>> for value in phonebook.itervalues():
print (value)
A.N Other
A Person
與列表一樣,也有不止一種建立字典的方法。到目前為止,我們只使用了逐個列舉並用花括號括起來的方法來建立字典。然而,我們還可以像下面這樣使用字典建構函式建立,需要傳入關鍵字引數來建立我們字典的鍵值對:
>>> dict(a=1, b=2, c=3)
{'a': 1, 'c': 3, 'b': 2}
Sets 和 Frozensets
類似與列表,我們還有集合(Sets) 以及 Frozensets 的資料結構。集合允許我們像列表那樣儲存資料,但不同的是集合裡不允許有重複元素。當我們想確保每個資料只有一份拷貝的時候,這個是非常棒的。Frozensets 幾乎和普通的集合是一樣的,但它是不可變的型別(immutable),這意味著一旦它被建立,它就不能再以任何方式改變。
同樣,我們建立集合的方法有列舉法(注意:相同的元素會自動刪除):
>>> a = {1,2,3,3}
set([1, 2, 3])
也可以使用建構函式:
>>> set([1,2,3,3])
set([1, 2, 3])
Python 提供了強大的集合操作方法,我們可以完成數學中集合的並集、交集、差集等操作,如下:
>>> a = {1,2,3}
>>> b = {3,4,5}
>>> a.union(b)
set([1, 2, 3, 4, 5])
>>>
>>> a.difference(b)
set([1, 2])
>>>
>>> a.intersection(b)
set([3])
元組
最後介紹的 Python 資料型別是元組(tuples)。元組類似與列表,用逗號(,)來分隔儲存的資料,與列表不同的是元組是不可變型別(immutable),列表可以任你插入或改變,而元組不行。所以,元組適用於你的資料是固定且不需改變的情形。從記憶體的角度來看,使用元組有一大好處是,Python可以明確地知道需要分配多少記憶體給元組(同樣 Frozensets 也有這個好處)。
Python 同樣也提供列舉法和構造法來建立一個元組:
>>> my_tuple = (1,2,3,4)
(1,2,3,4)
>>>
>>> a = tuple([1,2,3,4])
>>> type(a)
<class 'tuple'>
關於元組這兒有幾點特殊的情形需要說明。你可以使用空小括號或者使用不傳參的建構函式來建立一個空的元組,但建立僅有一個元素的元組時還需要一個額外的逗號,乍一看好像是錯誤的,但這才是正確的語法。這是因為如果沒有這個逗號,Python 會忽略小括號,僅僅只看到裡面的值。下面的例子說明了這點:
>>> empty_tup = ()
>>> type(empty_tup)
<class 'tuple'>
>>>
>>> empty_tuple = tuple()
<class 'tuple'>
>>>
>>> single_tup = (1)
>>> type(single_tup)
<class 'int'>
>>>
>>> single_tup = (1,)
>>> type(single_tup)
<class 'tuple'>
可以看到一個小逗號作用這麼大!
總結
本文主要總結了Python中我們使用的一些資料結構的不同,也羅列了一些有趣的高階的用法。
參考資料:
http://tech.pro/tutorial/1151/python-data-types-and-their-usage 主要譯自該篇文章
http://docs.python.org/3.3/ Python 官方文件,最權威最全面的Python學習資料