Python 數(shù)字數(shù)據(jù)類型用于存儲數(shù)值幅疼。
數(shù)據(jù)類型是不允許改變的,這就意味著如果改變數(shù)字數(shù)據(jù)類型的值帜矾,將重新分配內(nèi)存空間玉凯。
Python3 中有六個標準的數(shù)據(jù)類型:
Number(數(shù)字)
String(字符串)
List(列表)
Tuple(元組)
Set(集合)
Dictionary(字典)
Python3 的六個標準數(shù)據(jù)類型中:
不可變數(shù)據(jù):(3 個):Number(數(shù)字)、String(字符串)送火、Tuple(元組);
可變數(shù)據(jù):(3 個):List(列表)先匪、Dictionary(字典)种吸、Set(集合)。
Python3中number 支持 int胚鸯、float骨稿、bool、complex(復(fù)數(shù))姜钳。
在Python 3里坦冠,只有一種整數(shù)類型 int,表示為長整型哥桥,沒有 python2 中的 Long辙浑。
下面看個簡單例子:關(guān)于python中數(shù)據(jù)的存儲形式
a = 10
list1 = [1,2,3,4]
string = 'aaa'
set = (1,2,3,4)
tuple1 = (1,2,3,4)
dict1 = {1:2,2:3}
注意:可以看到number類型和string類型的指存放在frames(棧)中,而其他的類型的指存放在Objects(堆)中拟糕。
那么這是為什么判呕?
首先,計算機中關(guān)于各種數(shù)據(jù)的存儲都需要一個存儲位置送滞,如:1.寄存器侠草、2.棧內(nèi)存、3.堆內(nèi)存犁嗅、4.常量池边涕、5.非RAM存儲區(qū)等。
這里簡要說明一下關(guān)于各種存儲的存儲方式:
1.寄存器
最快的存儲區(qū)褂微,位于處理器內(nèi)部功蜓,但是數(shù)量極其有限。所以寄存器根據(jù)需求進行自動分配宠蚂,無法直接人為控制式撼。
2.棧內(nèi)存
位于RAM當中,通過堆棧指針可以從處理器獲得直接支持求厕。堆棧指針向下移動著隆,則分配新的內(nèi)存;向上移動呀癣,則釋放那些內(nèi)存旅东。這種存儲方式速度僅次于寄存器。
(常用于存放對象引用和基本數(shù)據(jù)類型十艾,而不用于存儲對象)
3.堆內(nèi)存
堆內(nèi)存是區(qū)別于棧區(qū)、全局數(shù)據(jù)區(qū)和代碼區(qū)的另一個內(nèi)存區(qū)域腾节。堆允許程序在運行時動態(tài)地申請某個大小的內(nèi)存空間忘嫉。
4.常量池
常量(字符串常量和基本類型常量)通常直接存儲在程序代碼內(nèi)部(常量池)荤牍。這樣做是安全的,因為它們的值在初始化時就已經(jīng)被確定庆冕,并不會被改變康吵。
5.非RAM存儲區(qū)
如果數(shù)據(jù)完全存活于程序之外,那么它可以不受程序的任何控制访递,在程序沒有運行時也可以存在晦嵌。
現(xiàn)在在來看python中數(shù)據(jù)在計算機存儲的方式
在上述例子中可以看到number和string類型的數(shù)據(jù)直接存放在Frames中,也就是直接存放在棧內(nèi)存中拷姿。存的內(nèi)容是申明的變量+變量的值惭载。而list、tuple响巢、dict描滔、set在棧內(nèi)存中存放的是一個引用地址,地址指向堆內(nèi)存空間踪古,在堆內(nèi)存空間存放著定義的具體的指含长。
總結(jié):一般來講簡單的數(shù)據(jù)類型如數(shù)字Number和字符串String的值以及對象的引用都是存放在棧內(nèi)存中,堆內(nèi)存用于存放對象引用指向的值伏穆。
數(shù)字Number類型的幾種數(shù)學(xué)運算
1.+拘泞、-、*枕扫、/ 加減乘除
a = 10
b = 5
c = a+b
d = a-b
e = a*b
f = a/b
print(c,d,e,f)
2.//陪腌、**、%除法取整铡原、冪運算偷厦、取余
a = 10
b = 3
c = a//b
d = a**b
e = a%b
print(c,d,e)
注意:/的作用是除法,如10/4=2.5燕刻, //的作用是取商,如10//4=2只泼,%是除法取余,如10%3=1
下面看一個有趣的例子
a = -10
b = 3
c = 4
d = 2
print(a//b,a//c,a//d)
print(a%b,a%c,a%d)
結(jié)果:why? 為什么不是-3卵洗,-3请唱,-5,-1 过蹂,-2十绑,0
其實這是因為在數(shù)學(xué)中,關(guān)于負數(shù)的運算規(guī)則
自然數(shù)的取模運算的定義是這樣的:
如果a和d是兩個自然數(shù)酷勺,d非零本橙,可以證明存在兩個唯一的整數(shù) q 和 r,滿足 a = qd + r 且0 ≤ |r| < |d| r為余數(shù)脆诉,q為商
注意:python中規(guī)定向負無窮取整
例子:
-9%7:那么滿足上面定義的規(guī)則就是 -9 = 7(-2)+5,那么5就是余數(shù)甚亭,(-2)就是商
9%-7:那么滿足上面定義的規(guī)則就是9 = -7(-2)-5,那么-5就是余數(shù)贷币,-2為商
如此只剩一個問題:那就是關(guān)于商的確定如,9 = -7(-2)-5亏狰,為什么不是9 = -7(1)-2?
還是上面談到的關(guān)于python中的規(guī)定:向負無窮取整
那么什么是向負無窮取整役纹?如9/7=1.28 如果9/-7向負取整為 -2,所以-10%3向負取整就是商為-4.
上述的例子實現(xiàn)過程如下:
-10%3 :-10 = 3(-4)+2
-10%4 : -10 = 4(-3)+2
-10%5 : -10 = 5*(-2)+0
所以取余結(jié)果為 2暇唾,2促脉,0,取商結(jié)果為-4策州,-3瘸味,-2
數(shù)字的邏輯運算
python中邏輯運算有and、or抽活、not
運算符 | 邏輯表達式 | 描述 | 實例 |
---|---|---|---|
and | x and y | 布爾"與" - 如果 x 為 False硫戈,x and y 返回 False,否則它返回 y 的計算值下硕。 | (a and b) 返回 20丁逝。 |
or | x or y | 布爾"或" - 如果 x 是 True,它返回 x 的值梭姓,否則它返回 y 的計算值霜幼。 | (a or b) 返回 10。 |
not | not x | 布爾"非" - 如果 x 為 True誉尖,返回 False 罪既。如果 x 為 False,它返回 True铡恕。 | not(a and b) 返回 False |
v1 = 1 or 3
v2 = 1 and 3
v3 = 0 and 2 and 1
v4 = 0 and 2 or 1
v5 = 0 and 2 or 1 or 4
v6 = 0 or False and 1
print(v1,v2,v3,v4,v5,v6)
科普:python中所有的數(shù)據(jù)類型都可以轉(zhuǎn)換為布爾值琢感,Number類型中除0之外的所有值都為True,0為False探熔,容器類型中驹针,None型為False,其他都為True诀艰。字符串中空串轉(zhuǎn)換為Fasle柬甥,其他都為True。
python中身份運算符
運算符 | 描述 | 實例 |
---|---|---|
is | is 是判斷兩個標識符是不是引用自一個對象 | x is y, 類似 id(x) == id(y) , 如果引用的是同一個對象則返回 True其垄,否則返回 False |
is not | is not 是判斷兩個標識符是不是引用自不同對象 | x is not y 苛蒲, 類似 id(a) != id(b)。如果引用的不是同一個對象則返回結(jié)果 True绿满,否則返回 False臂外。 |