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

查看 Python Docs,複數類型解釋如下:

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學習資料


轉載自:http://blog.csdn.net/hazir/article/details/10159709

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章