官术网_书友最值得收藏!

2.6 數據類型

數據類型主要有整數型、浮點型、復數型、字節型、布爾型、字符串型6種,開發人員應該牢固掌握這些數據類型,只有這樣才能減少在編寫程序時犯的錯誤。

2.6.1 整數型

整數型(int)數據就是沒有小數部分的數字,Python中的整數包括正整數、0和負整數,不同于強類型的編程語言,它的整數不分類型,或者說它只有一種類型的整數。Python整數的取值范圍是無限的,無論多大或者多小的數字,Python都能輕松處理。當所用數值超過計算機自身的計算能力時,Python會自動轉用高精度計算(大數計算)。

提示

強類型的編程語言會提供多種整數類型,每種類型的長度都不同,能容納的整數的大小也不同,開發者要根據實際數字的大小選用不同的類型。例如C語言提供了short、int、long、long long 4種類型的整數,它們的長度依次遞增,初學者在選擇整數類型時往往比較迷惑。

【例2-18】 整數類型應用示例。

輸入如下代碼:

     # 將21賦值給w
     w = 21
     print(w)
     print(type(w))
     # 給y賦一個很大的值
     y = 9999999999999999
     print(y)
     print(type(y))
     # 給z賦一個很小的值
     z = -76543399988777779
     print(z)
     print(type(z))

運行結果如下:

     21
     <class 'int'>
     9999999999999999
     <class 'int'>
     -76543399988777779
     <class 'int'>

y是一個極大的數字,z是一個很小的數字,Python都能正確輸出,不會發生溢出,這說明Python對整數的處理能力非常強大。無論對于多大或者多小的整數,Python只用一種類型存儲,就是int。

在Python中,可以使用多種進制來表示整數。

(1)十進制。平時常見的整數就是十進制形式,它由0~9共10個數字排列組合而成。使用十進制形式的整數不能以0作為開頭,除非這個數值本身就是0。

(2)二進制。由0和1兩個數字組成,書寫時以0b或0B開頭。例如,101對應的十進制數是5。

(3)八進制。八進制整數由0~7共8個數字組成,以0o或0O開頭。注意,第一個是數字0,第二個是大寫或小寫的字母O。

(4)十六進制。由0~9共10個數字以及A~F(或a~f)6個字母組成,書寫時以0x或0X開頭。

【例2-19】 不同進制數據Python代碼應用示例。

嘗試輸入如下代碼:

     #二進制
     bin1 = 0b101
     print('bin1Value: ', bin1)
     bin2 = 0B110
     print('bin2Value: ', bin2)
     #八進制
     oct1 = 0o26
     print('oct1Value: ', oct1)
     oct2 = 0O41
     print('oct2Value: ', oct2)
     #十六進制
     hex1 = 0x45
     hex2 = 0x4Af
     print("hex1Value: ", hex1)
     print("hex2Value: ", hex2)

運行結果如下:

     bin1Value:  5
     bin2Value:  6
     oct1Value:  22
     oct2Value:  33
     hex1Value:  69
     hex2Value:  1199

為了提高數字的可讀性,Python 3.x允許使用下畫線“_”作為數字(包括整數和小數)的分隔符。通常每隔3個數字添加一個下畫線,類似于英文數字中的逗號。下畫線不會影響數字本身的值。

【例2-20】 數字分隔符應用示例。

輸入如下代碼:

     pi = 3.141_159_265_3
     c = 299_792_458
     print('圓周率 = {}'.format(pi))
     print('光速 = {} m/s'.format(c))

運行結果如下:

     圓周率 = 3.1411592653
     光速 = 299792458 m/s

2.6.2 浮點型

在編程語言中,小數通常以浮點數(float)的形式存儲。浮點數和定點數是相對的:小數在存儲過程中,如果小數點發生移動,就稱為浮點數;如果小數點不動,就稱為定點數。

Python中的小數有兩種書寫形式:aEn或aen。中間的字母e大小寫都可以,a為尾數部分,是一個十進制數;n為指數部分,是一個十進制整數;E或e是固定的字符,用于分割尾數部分和指數部分。整個表達式等價于a乘以10的n次方。

注意

只要寫成指數形式,就表示小數,即使它的最終值看起來像一個整數。例如14E3等價于14000,但14E3是一個小數。

提示

Python只有float一種小數類型。C語言有float和double兩種小數類型,float能容納的小數范圍比較小,double能容納的小數范圍比較大。

【例2-21】 浮點類型應用示例。

輸入如下代碼:

     a = 25.5
     print("a : ", a)
     print("Type a : ", type(a))
     b = 0.6789123456
     print("b : ", b)
     print("Type b : ", type(b))
     c = 0.00000000000000000000000957
     print("c : ", c)
     print("Type c: ", type(c))
     d = 987654321123456789.789
     print("d : ", d)
     print("Type d : ", type(d))
     e = 34e5
     print("e: ", e)
     print("Type e : ", type(e))

運行結果如下:

     a :  25.5
     Type a :  <class 'float'>
     b :  0.6789123456
     Type b :  <class 'float'>
     c :  9.57e-24
     Type c:  <class 'float'>
     d :  9.876543211234568e+17
     Type d :  <class 'float'>
     e:  3400000.0
     Type e :  <class 'float'>

2.6.3 復數型

復數(complex)是Python的內置類型,直接書寫即可。換句話說,Python語言本身就支持復數,而不依賴于標準庫或者第三方庫。復數由實部(real)和虛部(imag)構成,在Python中,復數的虛部以j或者J作為后綴,具體格式為:a + bj。

【例2-22】 復數類型應用示例。

輸入如下代碼:

     # 內置函數生成復數
     com1 = complex(12, 102)
     print(com1)
     # 定義生成復數
     com2 = 12 + 102j
     print(com2)
     # 復數計算
     print('com1 + com2 = {}'.format(com1 + com2))
     print('com1 * com2 = {}'.format(com1 * com2))

運行結果如下:

     (12+102j)
     (12+102j)
     com1 + com2 = (24+204j)
     com1 * com2 = (-10260+2448j)

2.6.4 字節型

bytes只負責以字節序列的形式(二進制形式)存儲數據,至于這些數據到底表示什么內容(字符串、數字、圖片、音頻等),完全由程序的解析方式決定。如果采用合適的字符編碼方式(字符集),bytes可以恢復成字符串;反之亦然,字符串也可以轉換成bytes。

bytes是Python 3.x新增的類型。bytes只是簡單地記錄內存中的原始數據,至于如何使用這些數據,bytes并不在意,bytes并不約束使用方式。bytes類型的數據非常適合在互聯網上傳輸,可以用于網絡通信編程;bytes也可以用來存儲圖片、音頻、視頻等二進制格式的文件。

字符串和bytes存在著千絲萬縷的聯系,可以通過字符串來創建bytes對象,或者說將字符串轉換成bytes對象。有以下3種方法可以實現:

(1)如果字符串的內容都是ASCII字符,那么直接為字符串添加b前綴就可以轉換成bytes。

(2)bytes是一個類,調用它的構造方法,也就是bytes(),可以將字符串按照指定的字符集轉換成bytes;如果不指定字符集,那么默認采用UTF-8。

(3)字符串本身有一個encode()方法,該方法專門用來將字符串按照指定的字符集轉換成對應的字節串;如果不指定字符集,那么默認采用UTF-8。

【例2-23】 使用不同方式創建bytes對象示例。

輸入如下代碼:

     #通過構造函數創建空 bytes
     b1 = bytes()
     #通過空字符串創建空 bytes
     b2 = b''
     #通過b前綴將字符串轉換成 bytes
     b3 = b'I love python/'
     print("b3: ", b3)
     print(b3[3])
     print(b3[7:22])
     #為 bytes()方法指定字符集
     b4 = bytes('大家好', encoding='UTF-8')
     print("b4: ", b4)
     #通過 encode()方法將字符串轉換成 bytes
     b5 = "大家好".encode('UTF-8')
     print("b5: ", b5)

運行結果如下:

     #通過構造函數創建空 bytes
     b1 = bytes()
     #通過空字符串創建空 bytes
     b2 = b''
     #通過b前綴將字符串轉換成 bytes
     b3 = b'I love python/'
     print("b3: ", b3)
     print(b3[3])
     print(b3[7:22])
     #為bytes()方法指定字符集
     b4 = bytes('大家好', encoding='UTF-8')
     print("b4: ", b4)
     #通過encode()方法將字符串轉換成 bytes
     b5 = "大家好".encode('UTF-8')
     print("b5: ", b5)

從運行結果可以發現,對于非ASCII字符,print輸出的是它的字符編碼值(十六進制形式),而不是字符本身。非ASCII字符一般占用2字節以上的內存,而bytes是按照單字節來處理數據的,所以不能一次處理多字節。

2.6.5 布爾型

類似于其他編程語言,Python提供了布爾(bool)類型來表示True或False,比如比較算式5>3,在程序世界稱為真,Python使用True來代表;再比如比較算式4>20,在程序世界稱為假,Python使用False來代表。True和False是Python中的關鍵字,當作為Python代碼輸入時,一定要注意字母的大小寫,否則解釋器會報錯。

值得一提的是,布爾類型可以被作為整數對待,即True相當于整數值1,False相當于整數值0。

【例2-24】 布爾類型運算示例。

輸入如下代碼:

     a = False + 10
     b = True + 10
     print('a = {}'.format(a))
     print('b = {}'.format(b))

運行結果如下:

     a = 10
     b = 11

這里只是說明在Python中布爾類型可以這么使用,但不建議這么使用。

總的來說,布爾類型就是用于代表某個事情的真或假,如果這個事情是正確的,用True(或1)表示;如果這個事情是錯誤的,用False(或0)表示。

布爾類型在循環和判斷語句中將大顯身手,請看下面的例子。

【例2-25】 布爾類型真假示例。

輸入如下代碼:

     print('me' == 'you')
     print('100' == 100)
     print(2 < 1)
     print(4 > 2)
     print('me' != 'you')

運行結果如下:

     False
     False
     False
     True
     True

2.6.6 字符串型

所謂字符串,就是由零個或多個字符組成的有限序列,若干個字符的集合就是一個字符串(string)。Python中的字符串必須由雙引號""或者單引號''包圍,具體格式如下:

     "字符串內容"
     '字符串內容'

字符串的內容可以包含字母、標點、特殊符號、中文、韓文等全世界的所有文字。

Python字符串中的雙引號和單引號沒有任何區別,而有些編程語言的雙引號字符串可以解析變量。以下字符串都是符合Python語法的字符串:

     '我愛Python'
     'www.hao123.com'
     'love1314'
     '3.141592653'

上面介紹了Python字符串的定義和構成,下面對Python字符串中的一些常見問題和用法進行講解。

1.字符串中的引號

當字符串內容中出現引號時,需要進行特殊處理,否則Python會解析出錯,譬如下面的一行代碼:

     'I'm a good person!'

由于上面的字符串中包含單引號,此時Python會將字符串中的單引號與第一個單引號配對,這樣就會把'I'當成字符串,而后面的m a great person!就變成了多余的內容,從而導致語法錯誤。對于這種情況,有以下兩種處理方案:

1)使用不同的引號包圍字符串

如果字符串內容中出現了單引號,那么可以使用雙引號包圍字符串,反之亦然。譬如以下代碼:

2)對引號進行轉義

在引號前面添加反斜杠“\”就可以對引號進行轉義,讓Python把它作為普通文本對待,譬如以下代碼:

     str1 = 'I\'m a good person!'
     str2 = "引文雙引號是\",中文雙引號是""
     print(str1)
     print(str2)

以上兩種處理方法運行結果相同,如下所示:

     I'm a good person!
     引文雙引號是",中文雙引號是“。

2.字符串的換行

Python不是格式自由的語言,它對程序的換行、縮進都有嚴格的語法要求。要想換行書寫一個比較長的字符串,必須在行尾添加反斜杠“\”。

【例2-26】 字符串轉換應用示例。

輸入如下代碼:

運行結果如下:

     I love Python.  I Love Coding.  I Love Monday.

可以看出“\”對一行長代碼進行了換行顯示。

換行在之前簡單介紹過,這里再使用字符串進行代碼實踐,希望讀者對這種用法能有自己的理解,熟練掌握。

3.長字符串

所謂長字符串,就是可以直接換行(不用加反斜杠“\”)書寫的字符串。Python長字符串由3個雙引號"""或者3個單引號'''包圍,語法格式如下:

     """長字符串內容"""
     '''長字符串內容'''

在長字符串中放置單引號或者雙引號不會導致解析錯誤。如果長字符串沒有賦值給任何變量,那么這個長字符串就不會起任何作用,和一段普通的文本無異,相當于被注釋掉了。

當程序中有大段文本內容需要定義成字符串時,優先推薦使用長字符串形式,因為這種形式非常強大,可以在字符串中放置任何內容,包括單引號和雙引號。

【例2-27】 長字符串應用示例。

輸入如下代碼:

運行結果如下:

     黃山境內分為溫泉、云谷、玉屏、北海、松谷、釣橋、浮溪、洋湖、福固9個管理區,有千米以上高峰88座,
     黃山境內有大量的文化遺存,如古蹬道、古楹聯、古橋、古亭、古寺、古塔等。
     另有現存摩崖石刻300余處。

長字符串中的換行、空格、縮進等空白符都會原樣輸出,所以以上代碼的輸出就是“long_str”這個長字符串原有的格式。

4.Python原始字符串

Python字符串中的反斜杠“\”有著特殊的作用,就是轉義字符。轉義字符有時會帶來一些麻煩,例如要表示一個包含Windows路徑D:\Program Files\Python 3.10\python.exe的字符串,在Python程序中不能直接這樣輸入,無論是普通字符串還是長字符串。

因為“\”的特殊性,需要對字符串中的每個“\”都進行轉義,也就是寫成D:\\Program Files\\Python 3.10\\python.exe這種形式才行。這種寫法需要特別謹慎,稍有疏忽就會出錯。為了解決轉義字符的問題,Python支持原始字符串。在原始字符串中,“\”不會被當作轉義字符,所有的內容都保持“原汁原味”的樣子。

在普通字符串或者長字符串的開頭加上r前綴,就變成了原始字符串,具體格式如下:

     str1 = r'原始字符串內容'
     str2 = r"""原始字符串內容"""

以剛才的Windows環境路徑為例進行代碼實戰。

【例2-28】 Windows環境路徑應用示例。

輸入如下代碼:

     ori_str = r'D:\Program Files\Python 3.10\python.exe'
     print(ori_str)

運行結果如下:

     D:\Program Files\Python 3.10\python.exe

如果普通格式的原始字符串中出現引號,程序同樣需要對引號進行轉義,否則Python照樣無法對字符串的引號精確配對;但是和普通字符串不同的是,此時用于轉義的反斜杠會變成字符串內容的一部分。

注意

Python原始字符串中的反斜杠仍然會對引號進行轉義,因此原始字符串的結尾處不能是反斜杠,否則字符串結尾處的引號會被轉義,導致字符串不能正確結束。

主站蜘蛛池模板: 勃利县| 诸城市| 洮南市| 芜湖县| 永德县| 修水县| 上蔡县| 开平市| 大关县| 天峻县| 乌拉特前旗| 镇巴县| 雷山县| 邛崃市| 邵武市| 张家港市| 新泰市| 公安县| 全南县| 鞍山市| 临夏市| 简阳市| 兖州市| 凉城县| 电白县| 宽甸| 湘潭市| 阿荣旗| 博乐市| 井冈山市| 邢台县| 莆田市| 康马县| 邻水| 遵化市| 钟山县| 斗六市| 义乌市| 乐昌市| 东兰县| 象州县|