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