1. 程式人生 > >Python學習手冊之資料型別

Python學習手冊之資料型別

 在上一篇文章中,我們介紹了 Python 的異常和檔案,現在我們介紹 Python 中的資料型別。

檢視上一篇文章請點選:https://www.cnblogs.com/dustman/p/9979931.html

資料型別
None 型別
None 型別是 Python 的特殊型別,它是 NoneType 的物件型別,表示無值。該物件只有一個值 None。其它語言使用 null 來表示這個物件。
它不支援任何運算也沒有任何內建方法。作為一個物件其布林值為 False。除了和自己比較,None 和任何其他的資料型別比較永遠返回 False

>>> None == True
False
>>> None >>> print(None) None >>> None == None True >>>

如果函式沒有清楚地宣告返回值,則返回 None 物件。

def func():
 print("I like Python!")
temp = func()
print(temp)

執行結果:

>>>
I like Python!
None
>>>

字典
字典(Dictionaries)是 Python 中一個非常有用的內建資料型別。他不像列表一樣通過數字索引來訪問,字典當中的元素是通過鍵來存取。


字典是一個對映型別,在其它語言中被稱為 map。字典用 {} 來標識,使用鍵 : 值 (key : value) 儲存,具有極快的查詢速度,使用 [] 語法來訪問。

sex = {"John":"F","Amy":"M","Echo":"F"}
print(sex["Amy"])
print(sex["John"])

執行結果:

>>>
M
F
>>>

訪問不存在字典裡的鍵值會導致 KeyError 異常。

msg = {
 "name":"John",
 "sex":"M",
 "age":10,
}
print(msg["
name"]) print(msg["age"]) print(msg["son"])

執行結果:

>>>
John
10
KeyError: 'son'
>>>

實際上字典能夠儲存任何型別的資料。

字典為空時的表現形式為 {}

只有不可變的物件可以用作字典的 key,不可變的物件是指那些不能更改的物件。到目前為止,我們遇到的唯一可變物件是列表和字典。可變物件做鍵值會觸發 TypeError 異常。

msg = {
 ['a','b','c']:"a to c"
}

執行結果:

>>>
TypeError: unhashable type: 'list'
>>>
正確使用字典非常重要,需要牢記字典的 key 必須是不可變物件。

字典方法

我們知道字典是可變物件,可以像列表一樣,字典的鍵值儲存的數值可以重新指派另外的值。

不同於列表的是,我們可以通過字典的鍵值儲存資料,不管這個鍵存不存在字典裡。

msg = {
 "name":"John",
 "sex":"M",
 "age":10,
}
msg[2] = "Home"
msg[8] = "Job"
print(msg)

執行結果:

{'name': 'John', 'sex': 'M', 'age': 10, 2: 'Home', 8: 'Job'}

要在字典裡確定一個鍵是否存在詞典裡,你可以使用 in 語法。

msg = {
 "name":"John",
 "sex":"M",
 "age":10,
}
print("name" in msg)
print("job" in msg)
print("age" in msg)

執行結果:

>>>
True
False
True
>>>

我們還可以通過 get 的方法從字典裡取資料,就像前面用 msg["name"] 這樣的方法讀取資料。與這種方法不同的是,當字典裡沒有該鍵值時 get 方法取回的值是 None,而不會觸發 KeyError 異常。

msg = {
 "name":"John",
 "sex":"M",
 "age":10,
 "Job":False,
}
print(msg.get("name"))
print(msg.get(6))
print(msg.get(123,"Not in dictionary!"))

執行結果:

>>>
John
None
Not in dictionary!
>>>
我們還可以指定 get 方法的第二個引數,當鍵值在字典裡不存在是會返回我們指定的值。

下面程式碼執行結果是什麼?

msg = {
 1:1,2:1,3:2,4:3
}
print(msg.get(2,0) + msg.get(8,3))

執行結果:

>>>
4
>>>

元組

元組 (Tuples) 跟列表很想,但是元組不能提供列表類能夠提供給你的很多功能。元組的一大特徵就是不可變。

元組使用圓括號來建立。

msg = ("Hello","World","!",)

你可以像訪問列表一樣,通過索引來訪問元組。

print(msg[1])

給元組的元素重新分配值會觸發 TypeError 異常。

msg[0] = "Thank"

執行結果:

>>>
TypeError: 'tuple' object does not support item assignment
>>>
和列表字典一樣,元組也能巢狀儲存。

我們也可以不用圓括號就建立元組,通過逗號分割來確定元組的分組。

msg = "Hello","World","!"
print(msg[0])

執行結果:

>>>
Hello
>>>

空元祖必須通過圓括號建立。

empty = ()
儘管元組不能改變,但是執行速度快於列表。

列表切片

Python 為列表提供了高階特徵切片 (Slice) 操作功能,大大弱化了獲取一個列表區間的操作。切片操作通過兩個索引數字中間用冒號分割來完成,返回從第一個數字索引到第二個數字索引的一個新列表。

msg = [0,1,2,3,4,5,14,28,32]
print(msg[2:5])
print(msg[0:1])

執行結果:

>>>
[2, 3, 4]
[0]
>>>
range 函式操作一樣,包含第一個數字索引裡的值,不包含第二個數字索引的值。

如果切片的第一個數字忽略,切片操作從 0 開始,如果切片的第二個數字缺失,切片操作直到列表尾部結束。

msg = [0,1,2,3,4,5,14,28,32]
print(msg[:5])
print(msg[5:])

執行結果:

>>>
[0, 1, 2, 3, 4]
[5, 14, 28, 32]
>>>
切片操作同樣可以作用於元組。

列表切片操作同樣可以提供第三個引數,這一引數將被視為切片的步長 (Step) ,在預設情況下,步長大小為 1、

msg = [0,1,2,3,4,5,14,28,32]
print(msg[:2])
print(msg[2:8:2])

執行結果:

>>>
[0, 1]
[2, 4, 14]
>>>
[2:8:2] 將會取出列表從索引 2 開始直到索引 8 並且每隔 2 個取一個列表的元素。

索引操作也可以使用負數,在這種情況下,位置計數將從列表的末尾開始。

msg = [0,1,2,3,4,5,14,28,32]
print(msg[1:-1])

執行結果:

>>>
[1, 2, 3, 4, 5, 14, 28]
>>>
如果步進使用負值,則切片操作將從後向前執行。
使用 [::-1] 切片是一種常見的方法來反轉列表。

列表生成式
列表生成式即 List Comprehensions,是 Python 內建的非常強大卻簡單的可以用來建立列表的生成式。

# a list comprehension
cubes = [i**2 for i in range(5)]
print(cubes)

執行結果:

>>>
[0, 1, 4, 9, 16]
>>>

列表生成式同樣可以包含 if 條件判斷,一遍建立一個符合一定條件的列表。

cubes = [i**2 for i in range(5) if i**2 % 2 ==0]
print(cubes)

執行結果:

>>>
[0, 4, 16]
>>>

通過列表生成式生成一個非常大的列表會引發 MemoryError 異常。

even = [2*i for i in range(10**150)]

執行結果:

>>>
MemoryError
>>>
這個問題我們可以通過 迭代器 來解決這個問題,迭代器將會在下一篇文章中講到。

字串格式化

我們經常會輸出劣勢 '尊敬的客戶,您好!您尾號xx的賬戶向xx公司完成xx交易,餘額xx'之類的字串,而 xxx 的內容都是根據變數變化的。
所以,需要一種簡便的格式化字串的方式。String 物件提供了一個 format 方法。

# string formatting
nums = [1,2,3]
msg = "Numbers:{0} {1} {2}".format(nums[0],nums[1],nums[2])
print(msg)

執行結果:

>>>
Numbers:1 2 3
>>>
每一個引數對應字串裡相應的佔位符 {}。使用數字的方式不僅可以交換引數的位置,甚至可以在字串裡面換位,比如 {1} 在最前面。

字串格式化也可以用命名引數替換。

msg = "{a},{b}".format(a=5,b=15)
print(msg)

執行結果:

>>>
5,15
>>>

Python 還提供了另一種格式化的方法。這種格式化方式和 C 語言一致用 % 實現,舉例如下:

s = 'Hello,%s' % 'Python'
print(s)
s = 'Hi,%s,you have $%d' % ('man',100)
print(s)

執行結果:

>>>
Hello,Python
Hi,man,you have $100
>>>

% 運算子就是用來格式化字串的,下圖是常見的佔位符。

在字串內部,%s 表示用字串替換,%d表示用整數替換,有幾個 %? 佔位符,後面就跟幾個變數或者值,順序需要對應好。如果只有一個 %?,括號可以省略。

常用方法

字串方法

Python 標準庫內建一些常用的方法。
join - 用一個字串作為分隔符連線字串列表。
replace - 對字串進行替換操作。
startswith - 字串是否以另一個字串開頭。
endswith - 字串是否以另一個字串結束。
upperlower - 返回字串以大寫或小寫的形式。
split - 切割字串為列表。

print(",".join(["man","and","boy"]))
print("Hello me".replace("me","world"))
print("This is a man".startswith("This"))
print("This is a woman".endswith("woman"))
print("this is a boy".upper())
print("THIS IS A GIRL".lower())
print("man,and,boy".split(","))

執行結果:

man,and,boy
Hello world
True
True
THIS IS A BOY
this is a girl
['man', 'and', 'boy']

數學方式
maxmin - 查詢一組數裡最大和最小的值。
abs - 絕對值。
round - 四捨五入
sum - 數字列表裡數字的總和。

print(max(9,8,7,4,5,2,1))
print(min(1,2,3,4,0,-5))
print(abs(-41))
print(abs(32))
print(sum([100,455,78,-584]))

執行結果:

>>>
9
-5
41
32
49
>>>

列表方法
標準庫提供了一些非常有用的函式,allany 函式為我們對列表進行條件判斷提供了方便。函式 enumerate 也提供了另一種方式來遍歷列表的方法。

nums = [14,51,48,46,11]
if all([i > 6 for i in nums]):
 print("All larger than 6")
if any([i % 2 == 0 for i in nums]):
 print("At least on is even")
for v in enumerate(nums):
 print(v)

執行結果:

>>>
All larger than 6
At least on is even
(0, 14)
(1, 51)
(2, 48)
(3, 46)
(4, 11)
>>>

 

 

“今年的我們已與去年不同,我們的愛人亦是如此,如果變化中的我們依舊愛著那個變了的另一半,那是幸運所致。”    

                                      -- 毛姆(英國小說家/故事聖手)