摘要:數字在中,整型長整型浮點數負數布爾值等都可以稱之為數字類型。數字類型的復雜度整數比浮點數簡單浮點數比復數簡單。布爾類型布爾類型其實就是數字和的變種而來,即真或假,實際上就是內置的數字類型的子類而已。
上篇文章中我們簡單的體驗了Python語言基本概念與語法,那么在繼續深入下去的過程中,不妨先學習幾個常見的Python內置數據類型?這也是大部分Python教科書的學習目錄,由淺至深,慢慢深入。
Python常用的幾種數據類型就是以下幾種,其實Python內部的數據類型還是很多的,多歸多但是很少有我們用到了,太多了也記不了,把常用的幾個玩熟練了就OK了。
那么接下來我們會學到那些內置的數據類型呢?
雖然說我們是在學習數據類型,但其實只是在學習每一個類型所提供的API而已,你所需要的大部分功能,Python都已經幫我們封裝好了,不需要擔心任何效率的問題,當你熟悉了這些API之后,靈活的組合應用,因為這在開發的過程中是必不可少的,那么接下來就讓我們開始漫長的數據類型API學習之旅吧。
所有的數據類型所具備的方法都存在相對應的類里面,當創建一個類型的對象時,該對象所具備的功能都保存在相應的類中。
數字在Python3中,整型、長整型、浮點數、負數、布爾值等都可以稱之為數字類型。
創建數字類型類型的對象
int類型通常都是數字,創建數字類型的方式有兩種,且在創建的時候值兩邊不需要加雙引號或單引號。
第一種創建整型的方式
>>> number = 9 >>> type(number)
第二種創建整型的方式
>>> number = int(9) >>> type(number)
以上兩種創建整型對象的方式都可以創建的,但是他們也是有本質上的區別,第一種方式實際上會轉換成第二種方式,然后第二種方式會把括號內的數據交給__init__這個構造方法,構造方法是int類的,然后構造方法會在內存中開辟一塊空間用來存放數據,但實際上我們在用時候是沒有任何區別的。
構造方法每個數據類型中都會有,這是Python內部所定義的,如下圖所示:
__init__
def __init__(self, x, base=10): # known special case of int.__init__
可以從源碼中看到,__init__的方法有兩個參數,其中base=10是可選的參數,x是我們對象的值,base=10其實就是說把我們的值(默認二進制)以十進制的方式輸出出來,通過下面的實例可以看到:
>>> var=int("0b100",base=2) >>> var 4
通過int()可以將一個數字的字符串變成一個整數,并且如果你指定了第二個參數,還可以將值進制數轉換為整數:
# 將數字字符串轉換為整數,數字字符串通過進制轉換為整數 >>> int("99"),int("100",8),int("40",16),int("10000000",2) (99, 64, 64, 128) # 講進制數轉換為整數 >>> int("0x40",16),int("0b1000000",2) (64, 64)
把二進制的數字4通過十進制輸出出來,4的二進制就是0b100,又有一個知識點就是在類的方法中,所有以__開頭,并且以__結尾的方法都是Python內部自己去調用的,我們在寫代碼的過程中是不需要去調用的,最簡單的例子就是__init__,通過上面的流程圖我們就可以很清楚的看到。
int內部優化機制下圖中我們可以很清楚的看到int類型在創建對象時內存所分配空間的情況
首先我們知道當我們創建第一個對象var1的時候會在內存中開辟一塊空間作為存放var1對象的值用的,當我們創建第二個對象var2的時候也會在內存中開辟一塊空間來作為var2對象的值,那如果這樣說,那是不是說對象var1和var2的值內存是否會同時開辟兩塊呢?我們通過下面的實例可以得到答案:
C:Usersanshe>c:Python35python.exe # 注意我是用的是Python3.5.1 Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2016, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. # 分別創建對象var1和var2 >>> var1=123 >>> var2=123 # 我們可以看到他們的內存地址都是指向的`1502084720` >>> id(var1) 1502084720 >>> id(var2) 1502084720
通過上面的結果我們可以看到var1和var2的內存地址是相同的,就代表他們的值是使用的同一塊空間,那么如果我把var2的值改為456呢?
>>> var2=456 >>> id(var1) 1502084720 >>> id(var2) 2452305956816
可以看到var2的內存地址已經改變了(廢話),因為對象的值不一樣了,所以他才不會改變,OK,我們可以得到一個結論就是:當兩個或者多個對象的值都是同一個的時候,那么這些對象都會使用同一個內存地址,這里的值是是有范圍的,默認范圍是-5~257,得到這個結論之后我們繼續往下看。
這張圖我們同樣創建了兩個對象,但是唯一不同的是我把第一個創建的對象的值作為第二個對象的值,這里他們肯定使用的是同一個內存地址,但是如果我把第一個對象的值改動了呢?
>>> var1=123 >>> var2=var1 >>> id(var1) 1502084720 >>> id(var2) 1502084720 >>> var1=456 >>> id(var1) 2452305956816 >>> id(var2) 1502084720
請自行思考,這里不多做解釋,然后下面我們再來說說剛才的話題,說在-5~257這個范圍內對象的值都會引用同一塊內存地址,我們可以通過下面的實驗來測試:
>>> var1=12345 >>> var2=12345 >>> id(var1) 2452305956816 >>> id(var2) 2452308384720
事實證明我們的結論是完全沒有問題的,注意我上面的實例都是在Python3.5上面執行的哦,var1和var2兩個對象的值同樣是12345,但是他們的內存地址就是不一樣,這就是Python在內部做的優化,他把-5~257這個范圍內我們常用道德數字多對象可引用的,OK,到此結束這個話題。
數字類型的長度限制數字類型在python2.7里面是分整型和長整型這個區別的,也就是說如果你的數字大到一定的范圍,那么python會把它轉換為長整形,一個數字類型包含32位,可以存儲從-2147483648到214483647的整數。
一個長整(long)型會占用更多的空間,64位的可以存儲-922372036854775808到922372036854775808的整數。
python3里long型已經不存在了,而int型可以存儲到任意大小的整型,甚至超過64為。
Python內部對整數的處理分為普通整數和長整數,普通整數長度為機器位長,通常都是32位,超過這個范圍的整數就自動當長整數處理,而長整數的范圍幾乎完全沒限制,如下:
Python2.7.x
>>> var=123456 >>> var 123456 >>> var=10**20 >>> var 100000000000000000000L >>> type(var) # long就是長整型
Python3.5.x
>>> var=123456789 >>> var 123456789 >>> var=10**20 >>> var 100000000000000000000 >>> type(var)
請自行補腦 - - 、
數字類型所具備的方法bit_length
返回表示該數字時占用的最少位數
>>> num=20 >>> num.bit_length() 5
conjugate
返回該復數的共軛復數,復數,比如0+2j,其中num.real,num.imag分別返回其實部和虛部,num.conjugate(),返回其共扼復數對象
>>> num =-20 >>> num.conjugate() -20 >>> num=0+2j >>> num.real 0.0 >>> num.imag 2.0 >>> num.conjugate() -2j
imag
返回復數的虛數
>>> number = 10 >>> number.imag 0 >>> number = 3.1415926 >>> number.imag 0.0
內置的方法還有denominator、from_bytes、numerator、real、to_bytes,實在搞不懂這有什么用,也不太理解,就不做介紹了,你可以通過help(int.numerator)查看該方法的幫助信息等。
混合類型所謂混合類型就是浮點數和整數進行運算,如下所示:
>>> 3.14159 + 10 13.14159
結果和我們想象中的一樣,但是一個浮點數一個正整數它是怎么進行相加的呢?其實很簡單,Python會把兩個值轉換為其中最復雜的那個對象的類型,然后再對相同類型運算。
比如上面的例子中,會先把10轉換為10.0然后再與3.14159相加。
數字類型的復雜度
整數比浮點數簡單、浮點數比復數簡單。
布爾類型(bool)布爾類型其實就是數字0和1的變種而來,即真(True/0)或假(False/1),實際上就是內置的數字類型的子類而已。
# 如果0不是真,那么就輸出"0 is False." >>> if not 0: print("0 is False.") ... 0 is False. # 如果1是真,那么就輸出"1 is True." >>> if 1: print("1 is True.") ... 1 is True.
你還可以使用布爾值進行加減法,雖然從來沒在任何代碼中見過這種形式:
>>> True + 1 # 1 + 1 = 2 2 >>> False + 1 # 0 + 1 = 1 1集合(set)
集合的元素是不允許重復、不可變且無序的集合,集合就像是字典舍棄了值一樣,集合中的元素只能夠出現一切且不能重復。
創建set集合
>>> s = set([11,22,33]) >>> s {33, 11, 22} >>> type(s)
第二種不常用創建set集合的方式
# 這種的創建方式,集合中的元素相當于字典中的key >>> s = {11,22,33} >>> type(s)>>> s {33, 11, 22}
把其它可迭代的數據類型轉換為set集合
>>> li = ["a","b","c"] >>> seting = set(li) >>> seting {"b", "a", "c"} >>> type(seting)
集合同樣支持表達式操作符
# 首先創建兩個集合 >>> x = set("abcde") >>> y = set("bdxyz") >>> x {"a", "d", "b", "c", "e"} >>> y {"y", "d", "b", "x", "z"} # 使用in進行成員檢測 >>> "a" in x True # 差集 >>> x - y {"a", "e", "c"} # 并集 >>> x | y {"b", "y", "z", "a", "d", "e", "c", "x"} # 交集 >>> x & y {"d", "b"} # 對稱差 >>> x ^ y {"y", "z", "a", "e", "c", "x"} # 比較 >>> x > y, x < y (False, False)
集合解析
>>> {x for x in "abc"} {"a", "b", "c"} >>> {x+"b" for x in "abc"} {"bb", "cb", "ab"}集合所提供的方法
add
往集合內添加元素
>>> se = { 11, 22, 33 } >>> se {33, 11, 22} # 元素寫在小括號內 >>> se.add(44) >>> se {33, 11, 44, 22}
?
clear
清除集合內容
>>> se = { 11, 22, 33 } >>> se {33, 11, 22} >>> se.clear() >>> se set()
?
copy淺拷貝
下文介紹
?
difference
尋找集合的元素var1中存在,var2中不存在的
>>> var1 = { 11, 22, 33 } >>> var2 = { 22 ,55 } >>> var1.difference(var2) {33, 11} >>> var2.difference(var1) {55}
?
difference_update
尋找集合的元素var1中存在,var2中不存在的元素,并把查找出來的元素重新復制給var1
>>> var1 = { 11, 22, 33 } >>> var2 = { 22 ,55 } >>> var1.difference_update(var2) >>> var1 {33, 11}
?
discard
移除指定元素,不存在不保錯
>>> var1 = { 11, 22, 33 } >>> var1.discard(11) >>> var1 {33, 22} >>> var1.discard(1123123) >>> var1 {33, 22}
remove
移除指定元素,不存在保錯
>>> var1 = { 11, 22, 33 } >>> var1 {33, 11, 22} >>> var1.remove(11) >>> var1 {33, 22} >>> var1.remove(asda) Traceback (most recent call last): File "", line 1, in NameError: name "asda" is not defined
intersection
交集,查找元素中都存在的值
>>> var1 = { 11, 22, 33 } >>> var2 = { 22, 55, "一二" } >>> var1.intersection(var2) {22}
?
intersection_update
取交集并更更新到A中
>>> var1 = { 11, 22, 33 } >>> var2 = { 22, 55, "一二" } >>> var1.intersection_update(var2) >>> var1 {22}
?
isdisjoint
判斷有沒有交集,如果有返回False,否則返回True
>>> var1 = { 11, 22, 33 } >>> var2 = { 22, 44, 55 } >>> var1.isdisjoint(var2) False >>> var2 = { 66, 44, 55 } >>> var1.isdisjoint(var2) True
?
issubset
是否是子序列,也就是說如果var2的所有元素都被var1所包含了,那么var2就是var1的子序列
>>> var1 = {11,22,33,44} >>> var2 = {11,22} >>> var2.issubset(var1) True
issuperset
是否是父序列
>>> var1 = { 11, 22, 33 } >>> var2 = { 22, 44, 55 } >>> var1.issuperset(var2) True
pop
移除一個元素,并顯示移除的元素,移除時是無序的
>>> var1 = {11,22,33,44} >>> var1.pop() 33 >>> var1 {11, 44, 22}
symmetric_difference
對稱交集,把var1存在且b不存在和var2存在且var1不存在的元素合在一起
>>> var1 = { 11, 22, 33, 44 } >>> var2 = { 11, 22, 77, 55 } >>> var1.symmetric_difference(var2) {33, 44, 77, 55}
symmetric_difference_update
對稱交集,并更新到var1中
>>> var1 = { 11, 22, 33, 44 } >>> var2 = { 11, 22, 77, 55 } >>> var1 {33, 11, 44, 22} >>> var1.symmetric_difference_update(var2) >>> var1 {33, 44, 77, 55}
union
并集,把兩個集合中的所有元素放在一起,如果有重復的則只存放一個
>>> var1 = { 11, 22, 33, 44 } >>> var2 = { 11, 22, 77, 55 } >>> var1.union(var2) {33, 11, 44, 77, 22, 55}
update
更新,把一個集合中的元素更新到另一個集合中
>>> var1 = { 11, 22, 33, 44 } >>> var2 = { 11, 22, 77, 55 } >>> var1.update(var2) >>> var1 {33, 11, 44, 77, 22, 55}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38350.html
摘要:目前提供的字符串格式化方式有兩種百分號方式方式這兩種方式在和中都適用,百分號方式是一直內置存在的,方式為近期才出來的。 This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing % string formatti...
摘要:所謂遞歸其實就是函數本身調用函數,直到滿足指定條件之后一層層退出函數,例如從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢故事是什么呢從前有座山,山里有座廟 所謂遞歸其實就是函數本身調用函數,直到滿足指定條件之后一層層退出函數, 例如 從前有座山,山里有座廟,廟里有個老和尚,正在給小和尚講故事呢!故事是...
摘要:字典在基本的數據類型中使用頻率也是相當高的,而且它的訪問方式是通過鍵來獲取到對應的值,當然存儲的方式也是鍵值對了,屬于可變類型。 字典(dict)在基本的數據類型中使用頻率也是相當高的,而且它的訪問方式是通過鍵來獲取到對應的值,當然存儲的方式也是鍵值對了,屬于可變類型。 創建字典的兩種方式 第一種 >>> dic = {k1:123,k2:456} >>> dic {k1: 123, ...
摘要:列表同字符串一樣都是有序的,因為他們都可以通過切片和索引進行數據訪問,且列表的的是可變的。 列表(list)同字符串一樣都是有序的,因為他們都可以通過切片和索引進行數據訪問,且列表的的是可變的。 創建列表的幾種方法 第一種 name_list = [Python, PHP, JAVA] 第二種 name_list = list([Python, PHP, JAVA]) 創建一個空列表 ...
摘要:元組和列表的為唯一區別就是列表可以更改,元組不可以更改,其他功能與列表一樣創建元組的兩種方法第一種第二種如果元祖內只有一個元素,那么需要加上一個逗號,否則就變成字符串了。 元組(tuple)和列表的為唯一區別就是列表可以更改,元組不可以更改,其他功能與列表一樣 創建元組的兩種方法 第一種 ages = (11, 22, 33, 44, 55) 第二種 ages = tuple((11,...
閱讀 2138·2023-04-25 14:56
閱讀 2469·2021-11-16 11:44
閱讀 2706·2021-09-22 15:00
閱讀 1908·2019-08-29 16:55
閱讀 2187·2019-08-29 14:04
閱讀 2313·2019-08-29 11:23
閱讀 3687·2019-08-26 10:46
閱讀 1916·2019-08-22 18:43