#數據類型 Number - 數字類型 數字類型包含int,float,bool,complex類型 int - 整型 整型 - 正數,負數,0 # type(variable) 可以查看變數的類型 # id(variable) 可以查看變數的地址 age = 18 res = type(int) ...
數據類型
Number - 數字類型
數字類型包含int,float,bool,complex類型
int - 整型
- 整型 - 正數,負數,0
# type(variable) 可以查看變數的類型
# id(variable) 可以查看變數的地址
age = 18
res = type(int) # int
res_id = id(age) # 返回記憶體地址
# 二進位整型
intvar = 0b110
print(type(intvar)) # int
print(id(intvar))
# 8進位整型
intvar = 0o127
print(type(intvar)) # int 87
print(id(intvar))
# 16進位整型
intvar = 0xff
print(type(intvar)) # 255
print(id(intvar))
float - 浮點型
# 小數
floatvar = 6.7
print(type(intvar)) # float
print(id(intvar))
# 科學計數法
floatvar = 5.7e5 # 小數點右移
floatvar = 5.7e-2 # 小數點左移
print(floatvar,type(floatvar))
bool - 布爾類型
- True 或 False
boolvar = True
boolvar = False
complex - 複數
# 實數+敘述
complexvar = 3 + 4j
complexvar = -5j
# 可以使用complex函數創建複數
res = complex(3,4) # 3+4j
String - 字元串
String類型也是一種容器類型
字元串定義
# 單引號
strvar = 'The sky is blue'
# 雙引號
strvar = "The sky is blue"
# 三引號 - 支持跨行效果
strvar = '''The sky is blue'''
轉義字元
將無意義字元轉變為有意義的字元,將有意義的字元轉變為無意義的字元
- \t - 製表符縮進
- \n - 換行
- \r - 將當前行中\r後面的字元拉倒當前行的行首
有意義的字元轉變為無意義字元
# 在雙引號內使用雙引號,使用轉義字元取消內部雙引號的意義
print("生活不止眼前的苟且還有詩和\"遠\"方")
python中單引號字元串和雙引號字元串是沒有區別的
元字元串
- r"字元串"- 將字元串原樣輸出,忽略轉義字元的效果
strvar = "python\today" # \t會轉義
strvar = r"python\today" # r會將字元串原樣輸出
字元串格式化輸出
使用占位符,進行字元串的輸出
- %d - 整型占位符
- %f - 浮點型占位符
- %s - 字元串
name = "Evan"
age = 8
# 方式1
print("%s今年%d歲了" % (name,age)) // Evan今年8歲了
# %2d - 表示占兩位數字
print("%s今年%2d歲了" % (name,age)) // Evan今年 8歲了 中間有一個空格,數字之前補空格
# %-2d - 表示占兩位數字,不夠的用空格補,數字之後補空格
print("%s今年%-2d歲了" % (name,age))
# %f
strvar = "這個牙刷%f元" % (9.5)
# %.2f - 保留兩位小數
strvar = "%s真好吃" % ("蘋果")
# 占位符可以用在一個字元串中
print("%s超時,%s%f%d斤" %("大潤發","蘋果",9.9,1))
list - 列表類型
列表是容器類的數據,可以存儲不同數據的類型
定義列表
# 空列表
list = []
listvar = [98,6,9,"jack",True] // 存儲不同類型的數據
索引
- 從0開始
- 倒序索引從-1開始
lis = ["jack","kk","pp","hahaha"]
res = lis[0]
# len(容器類型) - 獲取元素的個數
print(len(ls)) # 4
# 獲取列表中的最後一個元素
print(lis[len(lis)-1]) # len(list)-1 返回列表最後一個元素
print(lis[-1])
數組操作
# 修改列表中的元素
lis = [2,5,6,7]
lis[3] = "jack" # 通過索引找到元素,將該內容修改
tuple - 元組類型
# 定義一個元素元組,加,
tu = (1,)
# 定義元組
tu = ("jack","Evan","kk")
# 元組元素的索引從0開始
print(tu[0]) # jack
元組中的元素可以獲取但是是不可修改的,有序
字元串類型
- 字元串也是一個容器類型,其中只能存儲字元,空格和標點都是字元
- 字元串的索引從0開始
strvar = "Hello World"
print(strvar[0]) # H
字元串中的字元可以獲取但是不可以更改
set - 集合類型
- 集合可以進行交差並補運算
- 集合數無序
- 集合元素是唯一的,自動去重
- 集合中的元素不可通過索引進行獲取
- 集合中的元素是不可修改的
# 定義空集合
setvar = set() # 只有這種方式可以創建空集合
setvar = {"巨石強森","喬丹","施瓦辛格","史泰龍"}
字典
# 定義空字典
dictvar = {}
dictvar = {
"籃球":"喬丹",
"足球":"梅西",
"NFL":"佈雷迪"
}
# 獲取集合中的元素通過key value的形式找到值
print(dictvar["籃球"]) # 喬丹
# 修改字典中的值
dictvar["籃球"] = "Kobe"
set和dict中的註意事項
字典的鍵 和 集合的值 有數據類型上的要求:
(允許的類型範圍)不可變的類型: Number(int float complex bool) str tuple
(不允許的類型)可變的類型 : list set dict
哈希演算法的提出目的是讓數據儘量均勻的在記憶體當中分配,以減少哈希碰撞,提升存儲分配的效率;
哈希演算法一定是無序的散列,所以集合 和 字典都是無序
- 數據在記憶體中隨機存儲,速度快,但是容易出現哈希碰撞,為瞭解決哈希碰撞,提高存儲效率
字典的鍵有要求,值沒要求;字典的值可以任意換掉,但是鍵不可以.
3.6版本之前,完全無序,
3.6版本之後,存儲的時候,保留了字典定義的字面順序,在獲取記憶體中數據時
重新按照字面順序做了排序,所以看起來有序,實際上存儲時還是無序.
變數的緩存機制(在同一個文件中)
針對於3.6版本的機制,3.8版本,只要值相同,記憶體地址就相同
整型
對於整型而言,-5~正無窮範圍內的相同值 id一致
# 1.對於整型而言,-5~正無窮範圍內的相同值 id一致
var1 = 5
var2 = 5
var1 = -100
var2 = -100
print(id(var1) , id(var2) )
浮點型
對於浮點數而言,非負數範圍內的相同值 id一致
# 2.對於浮點數而言,非負數範圍內的相同值 id一致
var1 = 4.67
var2 = 4.67
var1 = -4.67
var2 = -4.67
print(id(var1) , id(var2) )
布爾類型
布爾值而言,值相同情況下,id一致
# 3.布爾值而言,值相同情況下,id一致
var1 = True
var2 = True
print(id(var1) , id(var2) )
複數
複數在 實數+虛數 這樣的結構中永不相同(只有虛數的情況例外)
# 4.複數在 實數+虛數 這樣的結構中永不相同(只有虛數的情況例外)
var1 = 4 +5j
var2 = 4 +5j
# 5j 情況下例外
var1 = 5j
var2 = 5j # 相同
var1 = -5j # 不同
var2 = -5j
print(id(var1) ,id(var2))
容器類型
字元串 和 空元組 相同的情況下,地址相同
列表,元組,字典,集合無論什麼情況 id標識都不同 [空元組例外]
# 5.字元串 和 空元組 相同的情況下,地址相同
var1 = "你"
var2 = "你"
var1 = ()
var2 = ()
print(id(var1) ,id(var2))
# 6.列表,元組,字典,集合無論什麼情況 id標識都不同 [空元組例外]
var1 = (1,2)
var2 = (1,2)
var1 = [1,2,3]
var2 = [1,2,3]
print(id(var1) ,id(var2))
小數據池
小數據池只針對int str bool 空元組() None關鍵字,這些數據類型有效
int類型
不同文件(模塊),部分數據會駐留在小數據池中,在解釋器進行編譯腳本的時候,記憶體會提前開闢一些空間進行保存,-5-256,不同文件定義在這個範圍內的數據,預設使用小數據池中的數據,不重新開闢空間
使用cmd命令行執行python,一行表示一個文件
字元串類型
- 字元串長度為0或1,預設駐留小數據池
s1 = " "
s2 = " "
print(s1 is s2) # True
- 字元串長度>1,且只含大小寫字母,數字,下劃線,預設駐留小數據池
s1 = "oldboy__good666__"
s2 = "oldboy__good666__"
print(s1 is s2) # True
- 用*得到的字元串
# 乘數等於1,無論什麼字元串*1,都預設駐留小數據池
a = "ssjfajflajlj"
b = a*1
print(a is b) # True
# 乘數大於1時,僅包含數字\字母\下劃線時會被緩存,但字元串長度不能大於20
qq = "sssssda" * 10
QQ = "sssssda" * 10
print(qq is QQ) # False
指定駐留
使用sys模塊中的intern函數,指定變數指向同一個記憶體地址
可以指定任意字元串加入到小數據池中,無論聲明多少變數,只要此值相同,都指向同一個地址空間
# 從sys模塊引入intern函數,讓a,b兩個變數指向同一個值
from sys import intern
a = intern("jack"*10)
b = intern("jack"*10)
print(a is b)
無論是變數緩存機制還是小數據池的駐留機制,
都是為了節省記憶體空間,提升代碼效率