標籤:tar code 轉義 聲明 訪問 程式員 特殊 遞增 相互
在聲明變數時會用到資料類型,在前面已經用到一些資料類型,例如整數和字串等。在Python中所有的資料類型都是類,每一個變數都是類的“執行個體”。沒有基礎資料型別 (Elementary Data Type)的概念,所以整數、浮點和字串也都是類。
Python有6種標準資料類型:數字、字串、列表、元組、集合和字典,列表、元組、集合和字典可以儲存多項資料,他們每一個都是一種資料結構,本書中把他們統稱為“資料結構”類型。
本章先介紹數字和字串,列表、元組、集合和字典資料類型後面章節會詳細介紹。
數字類型
Python數字類型有4種:整數類型、浮點類型、複數類型和布爾類型。需要注意的是布爾類型也是數字類型,它事實上是整數類型的一種。
整數類型
Python整數類型為int,整數類型的範圍可以很大,可以表示很大的整數,這隻受所在電腦硬體的限制。
給Python 2的提示 Python
3不再區分整數和長整數,只要你需要所有的整數都可以是長整數。
預設情況下一個整數值,例如16表示的十進位整數。那麼其他進位,如位元、八位元和十六進位整數表示方式如下:
例如整數值28、0b11100、0B11100、0o34、0O34、0x1C和0X1C都同一個數字。在Python
Shell輸出結果如下:
>>> 2828>>> 0b1110028>>> 0O3428>>> 0o3428>>> 0x1C28>>> 0X1C28
浮點類型
浮點類型主要用來儲存小數數值,Python浮點類型為float,Python只支援雙精確度浮點類型,而且是與本機相關。
浮點類型可以使用小數表示,也可以使用科學計數法表示,科學計數法中會使用大寫或小寫e表示10的指數,如e2表示102。
在Python Shell中運行樣本如下:
>>> 1.01.0>>> 0.00.0>>> 3.36e2336.0>>> 1.56e-20.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(Null 物件)、False、0、0.0、0j(複數)、‘‘(Null 字元串)、[](空列表)、()(空元組)和{}(空字典)這些數值會轉換為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中字串表示方式三種:
- 一般字元串
很多程式員習慣於使用單引號(‘)表示字串。下面樣本表示的都是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編碼替代需要轉義的特殊字元,代碼第④行與代碼第③是等價的。
- 原始字串(raw string)
在一般字元串前面加字母r,表示字串是原始字串,原始字串是直接按照字串的字面意思來使用,沒有逸出字元。在Python
Shell中運行範例程式碼如下:
>>> s = ‘Hello\tWorld‘ ①>>> print(s)Hello World>>> s = r‘Hello\tWorld‘ ②>>> print(s)Hello\tWorld
代碼第①是一般字元串,代碼第②是原始字串,他們的區別只是在字串前面加字母r。從輸出結果可見,原始字串中的\t沒有被當成定位字元使用。
- 長字串
字串中包含了換行縮排等排版字元,則可以使用長字串。在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方法。
提示 在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。
提示
函數與方法的區別?方法是定義在類中的函數,在類的外部調用時需要通過類或對象調用,例如上述代碼source_str.find(‘r‘)就是調用字串對象source_str的find方法,find方法是在str類中定義的。而通常的函數不是類中定義的,也稱為頂層函數,他們不屬於任何一個類,調用時直接使用函數即可,例如上述代碼中的len(source_str),就是調用len函數,只不過它的參數是字串對象source_str。
字串與數字相互轉換
在實際的編程過程中,經常會用到字串與數字相互轉換。下面從兩個不同的方面介紹字串與數字相互轉換。
- 字串轉換為數字
字串轉換為數字可以使用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
- 數字轉換為字串
數字轉換字串有很多種方法,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/topic/1507.html
配套原始碼
http://www.zhijieketang.com/group/8
電子書
https://yuedu.baidu.com/ebook/5823871e59fafab069dc5022aaea998fcc2240fc
作者微博:@tony_關東升br/>郵箱:[email protected]
Python讀者服務QQ群:628808216
《Python從小白到大牛》第6章 資料類型