《Python從小白到大牛》第6章 數據類型

《Python從小白到大牛》已經上市!
《Python從小白到大牛》第6章 數據類型
在聲明變量時會用到數據類型,在前面已經用到一些數據類型,例如整數和字符串等。在Python中所有的數據類型都是類,每一個變量都是類的“實例”。沒有基本數據類型的概念,所以整數、浮點和字符串也都是類。

Python有6種標準數據類型:數字、字符串、列表、元組、集合和字典,列表、元組、集合和字典可以保存多項數據,他們每一個都是一種數據結構,本書中把他們統稱爲“數據結構”類型。

本章先介紹數字和字符串,列表、元組、集合和字典數據類型後面章節會詳細介紹。

數字類型

Python數字類型有4種:整數類型、浮點類型、複數類型和布爾類型。需要注意的是布爾類型也是數字類型,它事實上是整數類型的一種。

整數類型

Python整數類型爲int,整數類型的範圍可以很大,可以表示很大的整數,這隻受所在計算機硬件的限制。

給Python 2的提示 Python
3不再區分整數和長整數,只要你需要所有的整數都可以是長整數。

默認情況下一個整數值,例如16表示的十進制整數。那麼其他進制,如二進制數、八進制數和十六進制整數表示方式如下:

  • 二進制數:以 0b 或0B爲前綴,注意0是阿拉伯數字,不要誤認爲是英文字母o。

  • 八進制數,以0o或0O爲前綴,第一個字符是阿拉伯數字0,第二個字符是英文字母o或O。

  • 十六進制數:以 0x或0X爲前綴,注意0是阿拉伯數字。

例如整數值28、0b11100、0B11100、0o34、0O34、0x1C和0X1C都同一個數字。在Python
Shell輸出結果如下:

>>> 28
28
>>> 0b11100
28
>>> 0O34
28
>>> 0o34
28
>>> 0x1C
28
>>> 0X1C
28

浮點類型

浮點類型主要用來儲存小數數值,Python浮點類型爲float,Python只支持雙精度浮點類型,而且是與本機相關。

浮點類型可以使用小數表示,也可以使用科學計數法表示,科學計數法中會使用大寫或小寫的e表示10的指數,如e2表示102。

在Python Shell中運行示例如下:

>>> 1.0
1.0
>>> 0.0
0.0
>>> 3.36e2
336.0
>>> 1.56e-2
0.0156

其中3.36e2表示的是3.36×102,1.56e-2表示的是1.56×10-2。

複數類型

複數在數學中是非常重要的概念,無論是理論物理學,還是電氣工程實踐中都經常使用。但是很多計算機語言都不支持複數,而Python是支持複數的,這使得Python能夠很好地用來進行科學計算。

Python中複數類型爲complex,例如1+2j表示的是實部1,虛部2的複數。在Python
Shell中運行示例如下:

>>> 1+2j
(1+2j)
>>> (1+2j) + (1+2j)
(2+4j)

上述代碼實現了兩個複數(1+2j)的相加。

布爾類型

Python中布爾類型爲bool,bool是int的子類,它只有兩個值:True和False。

注意
任何類型數據都可以通過bool()函數轉換爲布爾值,那些被認爲“沒有的”、“空的”值會轉換爲False,反之轉換爲True。如None(空對象)、False、0、0.0、0j(複數)、''(空字符串)、[](空列表)、()(空元組)和{}(空字典)這些數值會轉換爲False,否則是True。

示例如下:

>>> bool(0)
False
>>> bool(2)     
True
>>> bool(1)
True
>>> bool('')
False
>>> bool('  ')
True
>>> bool([])
False
>>> bool({})
False

上述代碼中bool(2)和bool(1)表達式輸出的True,這說明2和1都能轉換爲Ture,在整數中只有0是轉換爲False的,其他類型亦是如此。

數字類型相互轉換

學習了前面的數據類型後,大家會思考一個問題,數據類型之間是否可以轉換呢?Python通過了一些函數可以實現不同數據類型之間的轉換。如:數字類型之間互相轉換以及整數與字符串之間的轉換。本節先討論數字類型的互相轉換。

除複數外,其他的三種數字類型整數、浮點和布爾都可以互相進行轉換,轉換分爲隱式類型轉換和顯式類型轉換。

隱式類型轉換

多個數字類型數據之間可以進行數學計算,由於參與進行計算的數字類型可能不同,此時會發生隱式類型轉換。計算過程中隱式類型轉換規則如表6-1所示。

表 6‑1隱式類型轉換規則

操作數1類型 操作數2類型 轉換後的類型
布爾 整數 整數
布爾、整數 浮點 浮點

布爾數值可以隱式轉換爲整數類型,布爾值True轉換爲整數1,布爾值False轉換整數0。在Python
Shell中運行示例如下:

>>> a = 1 + True
>>> print(a)
2
>>> a = 1.0 + 1
>>> type(a)         ①
<class 'float'>
>>> print(a)
2.0
>>> a = 1.0 + True
>>> print(a)
2.0
>>> a = 1.0 + 1 + False
>>> print(a)
2.0

從上述代碼表達式的運算結果類型,可知表6-1所示的類型轉換規則,這裏不再贅述。另外,上述代碼第①行使用了type()函數,
type()函數可以返回傳入數據的類型,\<class 'float'\>說明是浮點類型。

顯式類型轉換

在不能進行隱式轉換情況下,則可以使用轉換函數進行顯式轉換了。除複數外,三種數字類型整數、浮點和布爾都有自己的轉換函數,分別是int()、float()和bool()函數,bool()函數在6.1.4節已經介紹過了,這裏不再贅述。

int()函數可以將布爾、浮點和字符串轉換爲整數。布爾數值True使用int()函數返回1,False使用int()函數返回0;浮點數值使用int()函數會截掉小數部分。int()函數轉換字符串會在下一節再介紹。

float()函數可以將布爾、整數和字符串轉換爲浮點。布爾數值True使用float()函數返回1.0,False使用float()函數返回0.0;整數值使用float()函數會加上小數部分(.0)。float()函數轉換字符串會在下一節再介紹。

在Python Shell中運行示例如下:

>>> int(False)
0
>>> int(True)
1
>>> int(19.6)
19
>>> float(5)
5.0
>>> float(False)
0.0
>>> float(True)
1.0

字符串類型

由字符組成的一串字符序列,稱爲“字符串”,字符串是有順序的,從左到右,索引從0開始依次遞增。Python中字符串類型是str。

字符串表示方式

Python中字符串表示方式三種:

  • 普通字符串。採用單引號(')或雙引號(")包裹起來的字符串。

  • 原始字符串(raw
    string)。在普通字符串前加r,字符串中的特殊字符不需要轉義,按照字符串的本來“面目”呈現。

  • 長字符串。字符串中包含了換行縮進等排版字符,可以使用三重單引號(''')或三重雙引號(""")包裹起來,這就是長字符串。
  1. 普通字符串

很多程序員習慣於使用單引號(')表示字符串。下面示例表示的都是Hello World字符串:

'Hello World'
"Hello World"
'\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064'    ①
"\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"    ②

Python中的字符采用Unicode編碼,所以字符串可以包含中文等亞洲字符。代碼第①行和第②行的字符串是用Unicode編碼表示的字符串,事實上它表示的也是Hello
World字符串,可通過print函數將Unicode編碼表示的字符串輸出到控制檯,則會看到Hello
World字符串。在Python Shell中運行示例如下:

>>> s = 'Hello World'
>>> print(s)
Hello World
>>> s = "Hello World"
>>> print(s)
Hello World
>>> s = '\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064'
>>> print(s)
Hello World
>>> s = "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"
>>> print(s)
Hello World

如果想在字符串中包含一些特殊的字符,例如換行符、製表符等在普通字符串中則需要轉義,前面要加上反斜槓(\),這稱爲字符轉義。表6-2所示是常用的幾個轉義符。

表 6‑2 轉義符

字符表示 Unicode編碼 說  明
\t \u0009 水平製表符
\n \u000a 換行
\r \u000d 回車
\" \u0022 雙引號
\' \u0027 單引號
\\ \u005c 反斜線

在Python Shell中運行示例如下:

>>> s = 'Hello\n World'
>>> print(s)
Hello
 World
>>> s = 'Hello\t World'
>>> print(s)
Hello    World
>>> s = 'Hello\' World'
>>> print(s)
Hello' World
>>> s = "Hello' World"  ①
>>> print(s)
Hello' World
>>> s = 'Hello" World'      ②
>>> print(s)
Hello" World
>>> s = 'Hello\\ World' ③
>>> print(s)
Hello\ World
>>> s = 'Hello\u005c World' ④
>>> print(s)
Hello\ World

對於字符串中的單引號(')和雙引號(")也可以不要轉義符,在包含單引號的字符串中使用雙引號包裹字符串,見代碼第①行;在包含雙引號的字符串中使用單引號包裹字符串,見代碼第②行。另外,可以在使用Unicode編碼替代需要轉義的特殊字符,代碼第④行與代碼第③是等價的。

  1. 原始字符串(raw string)

在普通字符串前面加字母r,表示字符串是原始字符串,原始字符串是直接按照字符串的字面意思來使用,沒有轉義字符。在Python
Shell中運行示例代碼如下:

>>> s = 'Hello\tWorld'  ①
>>> print(s)
Hello   World
>>> s = r'Hello\tWorld'  ②
>>> print(s)
Hello\tWorld

代碼第①是普通字符串,代碼第②是原始字符串,他們的區別只是在字符串前面加字母r。從輸出結果可見,原始字符串中的\t沒有被當成製表符使用。

  1. 長字符串

字符串中包含了換行縮進等排版字符,則可以使用長字符串。在Python
Shell中運行示例代碼如下:

>>> s  ='''Hello
 World'''
>>> print(s)
Hello
 World
>>> s = """ Hello \t            ①
        World"""
>>> print(s)
 Hello  
        World

在長字符串中如果包含特殊字符,也需要轉義的,見代碼第①行。

字符串格式化

在實際的編程過程中,經常會遇到將其他類型變量與字符串拼接到一起,並進行格式化輸出。例如計算的金額需要保留小數點後四爲、數字需要右對齊等,這些都需要格式化。

在字符串格式化時可以使用字符串的format()方法,以及佔位符。在Python
Shell中運行示例如下:

>>> name = 'Mary'
>>> age = 18
>>> s = '她的年齡是{0}歲。'.format(age)        ①
>>> print(s)
她的年齡是18歲。
>>> s = '{0}芳齡是{1}歲。'.format(name, age) ②
>>> print(s)
Mary芳齡是18歲。
>>> s = '{1}芳齡是{0}歲。'.format(age, name) ③
>>> print(s)
Mary芳齡是18歲。
>>> s = '{n}芳齡是{a}歲。'.format(n=name,  a=age)    ④
>>> print(s)
Mary芳齡是18歲。

字符串中可以有佔位符({}表示的內容),配合format()方法使用,會將format()方法中的參數替換佔位符內容。佔位符可以用參數索引表示,見代碼第①行、第②行和第③行,也可以使用參數的名字表示佔位符,見代碼第④行,n和a都是參數名字。

佔位符中還可以有格式化控制符,對字符串的格式進行更加精準控制。不同的數據類型在進行格式化時需要不同的控制符,這些格式化控制符如表6-3所示。

表 6‑3字符串格式化控制符

控制符 說  明
s 字符串格式化
d 十進制整數
f、F 十進制浮點數
g、G 十進制整數或浮點數
e、E 科學計算法表示浮點數
o 八進制整數,符號是小英文字母o
x、X 十六進制整數,x是小寫表示,X是大寫表示

格式控制符是位於佔位符索引或佔位符名字的後面,之間用冒號分隔,例如{1:d}表示索引爲1的佔位符格式參數是十進制整數。在Python
Shell中運行示例如下:

>>> name = 'Mary'
>>> age = 18
>>> money = 1234.5678
>>> "{0}芳齡是{1:d}歲。".format(name, age)   ①       
'Mary芳齡是18歲。'
>>> "{1}芳齡是{0:5d}歲。".format(age, name)  ②
'Mary芳齡是   18歲。'
>>> "{0}今天收入是{1:f}元。".format(name, money)       ③
'Mary今天收入是1234.567800元。'
>>> "{0}今天收入是{1:.2f}元。".format(name, money)     ④
'Mary今天收入是1234.57元。'
>>> "{0}今天收入是{1:10.2f}元。".format(name, money)   ⑤
'Mary今天收入是   1234.57元。'
>>> "{0}今天收入是{1:g}元。".format(name, money)       
'Mary今天收入是1234.57元。'
>>> "{0}今天收入是{1:G}元。".format(name, money)       
'Mary今天收入是1234.57元。'
>>> "{0}今天收入是{1:e}元。".format(name, money)       
'Mary今天收入是1.234568e+03元。'
>>> "{0}今天收入是{1:E}元。".format(name, money)       
'Mary今天收入是1.234568E+03元。'
>>> '十進制數{0:d}的八進制表示爲{0:o},十六進制表示爲{0:x}'.format(28) 
'十進制數28的八進制表示爲34,十六進制表示爲1c'

上述代碼第①行中{1:d}是格式化十進制整數,代碼第②行中{0:5d}是指定輸出長度爲5的字符串,不足用空格補齊。代碼第③行中{1:d}是格式化十進制浮點數,從輸出的結果可見,小數部分太長了,如果想控制小數部分可以使用代碼第④行的{1:.2f}佔位符,其中表示保留小數兩位(四捨五入)。如果想設置長度可以使用代碼第⑤行的{1:10.2f}佔位符,其中10表示總長度,包括小數點和小數部分,不足用空格補位。

字符串查找

在給定的字符串中查找子字符串是比較常見的操作。字符串類(str)中提供了find和rfind方法用於查找子字符串,返回值是查找子字符串所在的位置,沒有找到返回-1。下面只具體說明find和rfind方法。

  • str.find(sub[, start[,
    end]])。在索引start到end之間查找子字符串sub,如果找到返回最左端位置的索引,如果沒有找到返回-1。start是開始索引,end是結束索引,這兩個參數都可以省略,如果start省略說明查找從字符串頭開始;如果end省略說明查找到字符串尾結束;如果全部省略就是查找全部字符串。

  • str.rfind(sub[, start[,
    end]])。與find方法類似,區別是如果找到返回最右端位置的索引。如果在查找的範圍內只找到一處子字符串,那麼這裏find和rfind方法返回值相同的。

提示 在Python文檔中[]表示可以省略部分,find和rfind方法參數[, start[,
end]]表示start和end都可以省略。

在Python Shell中運行示例代碼如下:

>>> source_str = "There is a string accessing example."
>>> len(source_str)             ①
36
>>> source_str[16]              ②
'g'
>>> source_str.find('r')            
3
>>> source_str.rfind('r')
13
>>> source_str.find('ing')
14
>>> source_str.rfind('ing')
24
>>> source_str.find('e', 15)
21
>>> source_str.rfind('e', 15)
34
>>> source_str.find('ing', 5)
14
>>> source_str.rfind('ing', 5)
24
>>> source_str.find('ing', 18, 28)
24
>>> source_str.rfind('ingg', 5)
-1

上述代碼第①行len(source_str)返回字符串長度,注意len是函數,不是字符串的一個方法,它的參數是字符串。代碼第②行source_str[16]訪問字符串中索引16的字符。

上述字符串查找方法比較類似,這裏重點解釋一下source_str.find('ing',
5)和source_str.rfind('ing',
5)表達式。從圖6-1可見ing字符串出現過兩次,索引分別是14和24。source_str.find('ing',
5)返回最左端索引14,返回值爲14;source_str.rfind('ing', 5)返回最右端索引24。

圖6-1 source_str字符串索引

提示
函數與方法的區別?方法是定義在類中的函數,在類的外部調用時需要通過類或對象調用,例如上述代碼source_str.find('r')就是調用字符串對象source_str的find方法,find方法是在str類中定義的。而通常的函數不是類中定義的,也稱爲頂層函數,他們不屬於任何一個類,調用時直接使用函數即可,例如上述代碼中的len(source_str),就是調用len函數,只不過它的參數是字符串對象source_str。

字符串與數字相互轉換

在實際的編程過程中,經常會用到字符串與數字相互轉換。下面從兩個不同的方面介紹字符串與數字相互轉換。

  1. 字符串轉換爲數字

字符串轉換爲數字可以使用int()和float()實現,這兩個函數在6.2.2節介紹了實現數字類型之間的轉換,事實上這兩個函數也可以接收字符串參數,如果字符串能成功轉換爲數字,則返回數字,否則引發異常。

在Python Shell中運行示例代碼如下:

>>> int('9')
9
>>> int('9.6')
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    int('9.6')
ValueError: invalid literal for int() with base 10: '9.6'
>>> float('9.6')
9.6
>>> int('AB')
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    int('AB')
ValueError: invalid literal for int() with base 10: 'AB'
>>>

默認情況下int()函數都將字符串參數當成是十進制數字進行轉換,所以int('AB')會失敗。int()函數也可以指定基數(進制),在Python
Shell中運行示例如下:

>>> int('AB', 16)
171
  1. 數字轉換爲字符串

數字轉換字符串有很多種方法,6.3.2節介紹的字符串格式化可以實現將數字轉換爲字符串。另外,Python中字符串提供了str()函數。

可以使用str()函數可以將任何類型的數字都轉換爲字符串。在Python
Shell中運行示例代碼如下:

>>> str(3.24)
'3.24'
>>> str(True)
'True'
>>> str([])
'[]'
>>> str([1,2,3])
'[1, 2, 3]'
>>> str(34)
'34'

從上述代碼可以str()函數很強大,什麼類型都可以轉換。但缺點是不能格式化,如果格式化字符串需要使用format函數。在Python
Shell中運行示例代碼如下:

>>> '{0:.2f}'.format(3.24)
'3.24'
>>> '{:.1f}'.format(3.24)
'3.2'
>>> '{:10.1f}'.format(3.24)
'       3.2'

提示 在格式化字符串時,如果只有一個參數,佔位符索引可以省略。

本章小結

本章主要介紹了Python中的數據類型,讀者需要重點掌握數字類型與字符串類型,熟悉數字類型互相轉換,以及數字類型與字符串之間的轉換。

配套視頻

http://edu.51cto.com/sd/f907b

配套源代碼

http://www.zhijieketang.com/group/8

電子書

https://yuedu.baidu.com/ebook/5823871e59fafab069dc5022aaea998fcc2240fc

作者微博:@tony_關東昇br/>郵箱:[email protected]
智捷課堂微信公共號:zhijieketang
Python讀者服務QQ羣:628808216

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