數據類型
- 導讀
- 一、數據類型的分類
- 1.1 Number(數字)
- 1.1.1 靜態數據類型
- 1.1.2 動態數據類型
- 1.2 String(字符串)
- 1.3 bool(布爾類型)
- 二、數據類型的轉換
- 2.1 隱式類型轉換
- 2.2 顯式類型轉換
- 2.2.1 `int(x[,base])`——將x轉換為一個base進制的整數
- 結語
導讀
大家好,很高興又和大家見面啦!!!
在上一篇內容中我們介紹了Python中的常量與變量的相關內容。常量也就是不可改變的量,與之對應的變量則是可以改變的量。
Python中的常量可以分為四類:
- 數字常量
- 字符串常量
- 布爾常量
- 特殊常量——None
而Python中的變量與C/C++中的變量不一樣的是,在Python中變量在定義時是不需要指明數據類型的,變量的數據類型會根據定義變量時的初始值來進行確定。
計算機語言作為人類與計算機交流的工具,它的作用就是用來給計算機下達相關的指令來使計算機執行相關的操作。
程序猿在使用計算機語言與計算機進行溝通時,則需要通過所使用的語言來描述想要傳達的信息。
就比如描述一個人的年齡可以通過整數來描述;描述一個人的姓名可以通過字符串來描述;描述一件衣服的價格可以通過浮點數來描述;描述一件事的真假可以通過布爾值來描述……
這里就涉及到了我們在描述這些數據時所對應的數據類型,在C語言中,我們已經接觸到的數據類型可以分為以下幾個大類:
- 整型數據類型
- 浮點型數據類型
- 指針型數據類型
- 數組型數據類型
- 布爾型數據類型
- 自定義數據類型
而這些大類中又會分為幾個小類,這里我們以整型和浮點型為例,這里我們不考慮無符號數據類型:
- 整型可分為:
- 字符型數據類型(
char
) - 短整型數據類型(
short
) - 整型數據類型(
int
) - 長整型數據類型(
long int
) - 更長的整型數據類型(
long long int
)
- 字符型數據類型(
- 浮點型可分為:
- 單精度浮點型數據類型(
float
) - 雙精度浮點型數據類型(
double
)
- 單精度浮點型數據類型(
從這里我們可以看到,C 語言這種面向過程的計算機語言在語法上是非常的精細的,通過C語言我們可以很詳細的描述一件事情發生的經過,但是相對應的,在處理同一件事情上,C語言的代碼量是相比于其它語言更加龐大的,因此C語言無法處理特別復雜的問題。
C++作為面向對象的計算機語言,它相比于C語言則是能夠處理更加高度抽象化的問題,因此在C++中舍棄了C語言中的部分數據類型,如指針類型。
那么在Python中,其數據類型又會和C/C++之間有哪些不同之處呢?在今天的內容中我們將會介紹Python中的數據類型。
一、數據類型的分類
Python 作為一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言,它相比于C/C++而言,代碼的可讀性更強,描述事物的過程更加直接,因此在Python中,其數據類型主要有以下幾類:
- Number(數字)
- String(字符串)
- bool(布爾類型)
- List(列表)
- Tuple(元組)
- Set(集合)
- Dictionary(字典)
在這七種數據類型中,根據其對應類型的值是否可變可以將其分為兩類:
- 不可變類型——數字、字符串、布爾、元組這四種數據類型的值是不可變的;
- 可變類型——列表、集合、字典中這三種數據類型的值是可變的。
這里所說的可變可不變,我們通過具體的代碼來進行理解:
# 數據類型
a = 1 # 數字(Number)
b = 'A' # 字符串(String)
c = True # 布爾(bool)
tup = (a, b, c) # 元組(Tuple)
在代碼中,我們分別展示了這四種類型的變量以及這些變量所對應的值,我們在描述數字、字符串、和布爾這三種數據類型的值時,實際上說的是這些數據類型的常量值,這些常量值是不可變的;
而對于元組而言,它相比于C語言中的數組來說在存儲數據這一塊的能力要更加的強大,元組中的數據可以是不同類型的數據,但是一旦元組中的數據確定后,就無法再對這些數據進行修改,如下所示:
可以看到,此時程序是會報錯——類型錯誤:元組類型不支持項分配。這就好比于位于元組中的值被打包成為了一個常量,和我們在C語言中接觸的常量字符串一樣,常量字符串中的值是無法被修改的。
對于列表、字典、集合而言,它們的值則是可以進行修改的,如下所示:
lis = [a, b, c] # 列表(List)
dic = {a: 1, b: 'A', c: True} # 字典(Dictionary)
Set = {a, b, c} # 集合(Set)
這里我們列舉了這三種數據類型的變量及其對應的值,這些變量我們可以理解為是元組類型的升級版,如果說將元組類型看做是常量字符串的話,那這里的三種類型就可以理解為字符數組。
在C/C++中,常量字符串中的字符是無法在后續的運行中進行更改的,而字符數組中的值則是可以在后續的運行中進行修改,如下所示:
可以看到,此時我們可以完成對字符數組中的元素的修改,但是無法修改常量字符串中的元素。
在前面我們也說過,元組我們可以理解為常量字符串,元組中的元素就行常量字符串中的元素一樣,是無法進行修改的,而列表、字典和集合這三種類型的變量就如同字符數組一樣,我們可以對其值進行修改,這里我以列表為例,如下所示:
從測試結果中可以看到,此時列表中的值在經過修改后發生了變化。相信大家現在應該理解了什么是值可變,什么是值不可變,這里我們就不再繼續展開。
1.1 Number(數字)
Python中的數字主要可以分為三種數據類型:
-
整型(
int
)——通常被稱為是整型或整數,是正或負整數,不帶小數點。布爾(bool)是整型的子類型。 -
浮點型(
float
) - 浮點型由整數部分與小數部分組成,浮點型也可以使用科學計數法表示( 2.5 e 2 = 2.5 × 1 0 2 = 250 2.5e2 = 2.5 × 10^2 = 250 2.5e2=2.5×102=250) -
復數(
complex
)- 復數由實數部分和虛數部分構成,可以用a + bj
,或者complex(a,b)
表示, 復數的實部a和虛部b都是浮點型。
對于Python而言,為了使編程語言簡潔化,保證解決問題的方式只有一種,因此Python中舍棄了C語言中的字符型(char
)、短整型(short
)、長整型(long
)、更長的整型(long long
)這些表示整型的數據類型,只保留了整型(int
),通過int
來表示所有類型的整型;對于浮點型而言,Python同樣舍棄了雙精度浮點型(double
),只保留了單精度浮點型(float
),通過float
來表示所有類型的小數。
這時可能有朋友就會問了,那如果舍棄了這些數據類型,此時int
所包含的數值范圍是多少呢?會不會出現溢出的情況呢?
這個問題就涉及到了兩個概念——靜態數據類型與動態數據類型。
1.1.1 靜態數據類型
所謂的靜態數據類型,簡單的理解就是不可改變的數據類型,如C/C++中的數據類型。
當我定義一個整型變量之后,那該變量就只能是整型,相對應的該變量的取值范圍就是 ? 2 31 ~ 2 31 ? 1 -2^{31}~2^{31}-1 ?231~231?1,具體的值我們可以在VS中通過頭文件<limits.h>
中獲取,如下所示:
一個整型變量的值就是一個周期函數,當值達到最小值后再減1就會回到最大值,當值達到最大值后再加1就會回到最小值,如下所示:
在C/C++中所有的數據類型都是如此,每一個數據類型所創建的變量只能存儲其對應的數值范圍內的數,該存儲范圍是不能發生改變的,也就是說其變量的類型不會根據存儲的值的大小而產生變化;
靜態數據類型除了變量的取值范圍不會改變外,其變量的數據類型也不會發生改變,如下所示:
在這次測試中,我們將整型變量a賦值了一個字符串,整型變量b賦值了一個雙精度浮點型小數。
- 從打印結果可以看到,字符串是能夠正常打印,但是雙精度浮點型的小數無法打印;
- 從監視窗口可以看到,即使我們此時賦予變量a和變量b的值一個為字符類型一個為雙精度浮點型,但是變量a和變量b的數據類型并沒有因此發生改變。
從以上兩個例子可以得到結論以下結論:
- 靜態數據類型的變量的取值范圍不會改變;
- 靜態數據類型的變量的數據類型不會改變;
這里有朋友可能就會好奇了,為什么將字符串賦予整型變量不會對結果產生影響?
- 這是因為字符類型同樣也是整型的一個分支,只不過其字節大小比整型小;
- 將字符串賦值給整型變量,就相當于將短整型的數據賦值給整型變量,因此二者并不會發生沖突。
1.1.2 動態數據類型
與靜態數據類型相對應的就是動態數據類型。
動態數據類型與靜態數據類型剛好相反,動態數據類型的變量的取值范圍會隨著存儲值的大小而發生改變,動態數據類型的變量也會因為其值的數據類型的變化而發生變化。
在Python中創建的變量就屬于動態數據類型的變量,如下所示:
從這里的測試結果不難發現,在Python中變量的數據類型、取值范圍會隨著值的不同而發生變化。因此對于Python而言,其變量的數據類型為動態數據類型,并且其變量具有以下特點:
- 變量的取值范圍可視為負無窮大到正無窮大;
- 變量的數據類型會根據其存儲值的數據類型的改變而改變
1.2 String(字符串)
在C/C++中,字符類型屬于整型的一個小分支,字符串類型為指針類型的一個小分支。在C/C++中,整型和指針類型都是能夠進行±整數的類型,因此C/C++可以實現字符+整數,字符串+整數,如下所示:
在C/C++中,字符±整數實際上是字符對應的ASCII碼值±整數;字符串±整數實際上是字符串的地址進行±整數。
但是在Python中不同類型的變量是無法進行+運算的,這里的不同類型指的是前面我們提到的七種類型,但是對于同一類型的不同分支則是可以進行運算的,如下所示:
但是如果是不同類型的變量,則無法進行+運算,如下所示:
因此,在Python中,舍棄了C/C++中的字符類型,而重新創建了一個新的數據類型——字符串類型。
字符串類型的值既可以用單引號''
表示,也可以用雙引號""
表示。因此Python中就沒有了字符和字符串之分,所有用單引號或者雙引號表示的對象都被劃分為了字符串類型。
1.3 bool(布爾類型)
在C語言中,我們通過引用頭文件<stdbool.h>
之后,就可以解鎖布爾類型。
C/C++中的布爾類型的值有兩個——真(true
)和假(false
)。布爾類型的值常用于判斷語句中,如下所示:
在條件語句中,當判斷語句的結果為真,則執行對應的分支中的語句。從上例可以看到,因為a的布爾值為真,所以執行的是if
語句中的內容,而b的值為假,所以執行的是else
語句中的內容。
在Python中布爾類型的值同樣也是兩個——真(True
)和假(False
)。
這里要注意的是Python中的布爾值的首字母是大寫,而C/C++中布爾值的首字母是小寫。
Python中布爾型被歸為了整型的一個分支,但是其使用方式與C/C++中一致,都是用于判斷語句中,如下所示:
對于布爾類型而言,不管是C/C++還是Python,布爾值的判斷都滿足:
- 0為假,值為0;
- 非0為真,值為1
也就是說布爾值在進行整型運算時,真對應的整型值就是1,假對應的整型值就是0,如下所示:
還有其他的數據類型我們會在后面的篇章中再著重介紹,這里就不再展開,目前只需要了解即可。接下來我們就需要繼續學習Python中的數據類型之間是如何相互轉換的。
二、數據類型的轉換
在C語言中我們在介紹操作符時有提到過一個概念——隱式類型轉換和顯示類型轉換。
簡單的理解就是在不同類型的值進行運算時,運算的過程中自動進行類型轉換的現象稱為隱式類型轉換,通過強制類型轉換操作符完成轉換的現象稱為顯式類型轉換。
如果有不了解的朋友可以回顧以下【C語言必學知識點四】操作符中的十二、表達式求值的相關內容,里面有詳細介紹C語言中的隱式類型轉換,這里就不再展開。
而在Python中同樣也有隱式類型轉換和顯示類型轉換一說。
2.1 隱式類型轉換
在Python中,隱式類型轉換主要出現同類型的不同分支中,如下所示:
在這次測試中我們分別測試了整型與布爾型、整型與浮點型、浮點型與復數型這同一大類的數據類型下的三種情況下不同類型的值的運算,從測試結果中我們可以看到,整型與布爾型的值相加得到的新值e的數據類型為整型,整型與浮點型的值相加得到的新值c的數據類型為浮點型,浮點型的值與復數型的值相加得到的新值的數據類型為復數型。
隱式轉換的規則為:在同一大類的不同分支的數據類型的值進行運算時,較小的數據類型會優先轉換成較大的數據類型。
在這整個運算過程中,不同類型的值進行相加時,實際上為了保證不丟失數據,較小的數據類型都會先通過隱式轉換的方式變成較大的數據類型在與之進行運算。
因此我們不難得到在Number中的這些數據類型的大小關系為:
b o o l < i n t < f l o a t < c o m p l e x bool < int < float < complex bool<int<float<complex
2.2 顯式類型轉換
在C/C++中為了實現不同類型的數據之間的運算,是通過強制類型轉換操作符才能得以實現,如下所示:
可以看到在C語言中取模操作符是無法用于double類型的操作對象,此時我們就需要通過強制類型轉換操作符將double類型的對象強制轉換為整型,如下所示:
可以看到此時程序就能正常運行。
像C/C++這種為了完成不同類型的數據之間的運算,將其中一種類型強制轉換成另一種類型的方式就是顯式類型轉換。
C/C++中的顯式類型轉換是通過強制類型轉換操作符()
來實現,而在Python中則是通過內建函數來實現。Python中用于進行類型轉換的函數如下所示:
對于不同的函數如何進行使用,大家可以參考Python3 數據類型轉換,里面有詳細的介紹。這里我給大家簡單的介紹幾個我們會用到的內建函數;
2.2.1 int(x[,base])
——將x轉換為一個base進制的整數
該函數的語法如下所示:
int(x, base=10)
# x——轉換的對象(字符串或者數字)
# base——轉換的進制(默認十進制)
從函數的語法中可知,該函數僅用于將字符串或者數字轉換成base進制的整數,具體的進制由傳入的參數base來決定,base的默認參數為10,也就是說,我們如果不對base傳參的情況下,函數默認將x轉換成十進制的整數,如下所示:
可以看到在打印的結果中,雖然a與b的值都是打印的10,但是一個為字符串,一個為整數。當我們對函數傳入第二個參數后,其值則變為了2,也就是說函數將"10"
轉換成了2進制的整數。
那是不是說該函數只需要傳入一個或者兩個參數就夠了呢?然而這個函數并不是這么簡單,我們要給函數傳入的參數需要根據base來決定。
對于不同進制而言,其取值范圍如下所示:
進制 | 取值范圍 |
---|---|
二進制 | 0~1 |
八進制 | 0~7 |
十進制 | 0~9 |
十六進制 | 0~9與a~f |
下面我們以十六進制為例來進行測試:
可以看到此時函數是能夠正常的進行轉換的,如果轉換的字符串中存在一個不在范圍內的字符,又會有什么結果呢?
可以看到此時程序再次運行后,就出現了值錯誤的提示。這還沒完,如果我們將參數改為整型又會如何呢?
可以看到,此時又出現了類型錯誤。函數不能轉換非字符串的內容。
之所以會有這種結果,是因為該函數的底層邏輯是將數字或字符串轉換成十進制的整數,而非是進行不同進制的相互轉換。
也就是說,當我們要將字符串轉換成不同進制的整數時,我們首先需要保證字符串的內容符合要轉換的進制的取值范圍,其次,在轉換的過程中,函數會先通過相應的進制來識別字符串中的內容,最后,函數會將識別到的內容轉換為十進制的整數。
這也就是為什么第一次測試中對于字符串"123456789abcdef"
轉換之后得到的是一個很大的數,而非十六進制格式的結果;
該函數的操作數可以為數字,實際上就是進行的一個取整的工作,如下所示:
可以看到,該取整的過程實際上是取得參數的整數部分,因此該函數更多的情況下是用于字符串轉整數,這個在后面的內容中會詳細說明,這里就不再繼續展開。
相信大家現在應該能夠理解Python中的數據類型以及類型之間的轉換了,在后面的學習中,我們會對這一塊的內容繼續深入的學習,這里就不再繼續展開。
結語
今天的內容到這里就全部結束了,在下一篇內容中我們將介紹《Python中的輸入與輸出》的相關內容,大家記得關注哦!如果大家喜歡博主的內容,可以點贊、收藏加評論支持一下博主,當然也可以將博主的內容轉發給你身邊需要的朋友。最后感謝各位朋友的支持,咱們下一篇再見!!!