Python中的數據類型
一、數字
1、int(整型)
長整數:不過是大一些的整數。。
跟C語言不同,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上由於機器內存有限,我們使用的長整數數值不可能無限大。
2、float(浮點型)
浮點數用來處理實數,即帶有小數的數字。類似於C語言中的double類型,佔8個字節(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。
3、complex(複數)
複數由實數部分和虛數部分組成,一般形式爲x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裏的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
二、字節(bytes):
Pthon3對文本和二進制數據做了更爲清晰的區分,文本是Unicode,由str表示,二進制數據由bytes類型表示;python3不會以任意隱式方式混用str和bytes,不能拼接字符串和字節包,也無法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然)。
字節和字符的轉化
#!/usr/bin/env python # Author:dayi123 msg = "劉毅" print(msg.encode()) print(b'\xe5\x88\x98\xe6\xaf\x85'.decode())
三、布爾值:
真或假 1 或 0
四、字符串
1、萬惡的字符串拼接:
python中的字符串是一個字符數組,每次創建字符串時候需要在內存中開闢一塊連續的空間,並且一旦需要修改字符串的話,就需要再次開闢空間,萬惡的+號每出現一次就會在內從中重新開闢一塊空間。
2、字符串格式化輸出:
name = "dayi123" print "i am %s " % name #輸出: i am alex
PS: 字符串是 %s;整數 %d;浮點數%f
3、字符串的操作:
(1)、字符串常用功能:移除空白、分割、長度、索引、切片
(2)、字符串的操作
1)去掉空白:
username = input("user:") if username.strip() == "dayi123": #strip 移除空白 print("welcome")
2)字符串分割
name= "dayi123,dayi,liuyi" name2 = name.split(",") #將name轉化爲列表並賦值給name2 print(name2) print("|".join(name2)) #強name2列表轉化爲字符串,以“|”分割 job = "liuyi" print('' in job) #判斷“job”是不是字符串 print(job.capitalize()) #強”job”中字符串分割打印出來 msg = "hello,{job},it's been a long {age} since time sopken...." #msg2 = msg.format(job='dayi',age=22) #print(msg2) #打印通過msg格式化後的字符串 msg2 = "hello{0},dddd{1}" print(msg2.format('dayi',22)) #直接格式化後打印出來
3)字符串切片:
name = "liu yi" print(name[2:4]) #打印第二到第三個字符串 print(name.center(40,'-')) #打印name中40個字符串,不夠則以“—”填充 print(name.find('l')) #查找“l”是第幾個字符
4)判斷輸入的是不是數字:
age =input("your age:") if age.isdigit(): #判斷輸入的是不是數字 age = int(age) print("your age:",age) else: print("invalid data type")
5)判斷字符串:
name= 'daf!df34' print(name.isalnum()) #判斷輸入的字符串中有沒有特殊符號 print(name.endswith('df')) #判斷輸入的字符串是不是以“df”結尾 print(name.startswith('da')) #判斷輸入的字符串是不是以“da”開頭 print(name.upper().upper()) #” upper()”將所有的字符串轉化成大寫 print(name.upper().lower()) #” lower()”將所有的字符串轉化成小寫
五、列表
1 創建列表:
name_list = ['alex', 'seven', 'eric'] #列表裏面可以存任何東西 或 name_list = list(['alex', 'seven', 'eric'])
2、列表基本操作:索引、切片、追加、刪除、長度、切片、循環、包含
3、列表操作:
(1)索引和切片操作:
>>> age = 34
>>> name =["dayi123",34,"liu",35,age] #創建一個列表,可以包括字符串、數字及變量
>>> name[0:2] #取列表中第0個元素到第1個元素
['dayi123', 34]
>>> name[-3:-1] #取列表中倒數第2個到倒數第3個元素
['liu', 35]
>>> name[-3:]
['liu', 35, 34]
>>> name[:3] #取列表中前三個元素
['dayi123', 34, 'liu']
>>> name[:4][1:3] #取列表中前四個元素,再取前四個元素的1到2個元素
[34, 'liu']
>>> name[:4][1:3][1]
'liu'
>>> name[:4][1:3][1][1] #切片,取字符
'i'
(2)更改數據操作:
>>> name[2] = "liuyi" #更改列表中第二個元素的值,更改爲“liuyi”
>>> name
['dayi123', 34, 'liuyi', 35, 34]
(3)插入及追加操作:
>>> name.insert(4,'dayi') #在第4個元素處插入“dayi”
>>> name
['dayi123', 34, 'liuyi', 35, 'dayi', 34]
>>> name.append("day") #在結尾插入一個元素”day”
>>> name
['dayi123', 34, 'liuyi', 35, 'dayi', 34, 'day']
(4)刪除操作
>>> name.remove("day") #刪除列表中的元素”day”
>>> name
['dayi123', 34, 'liuyi', 35, 'dayi', 34]
>>> del name[2:4] #刪除第2個元素到第3個元素
>>> name
['dayi123', 34, 'dayi', 34]
>>> del name #刪除整個列表
(5)判斷列表中某個元素存在個數:
name =["dayi123",34,"liu",35,3,34,3,4,5,6,7,8,9,0] if 3 in name: #如果3存在列表name中 num_of_ele = name.count(3) #判斷3在列表name中的個數 print("[%s] 3 is/are in name" %num_of_ele)
(6)查找列表中的元素並更改值:
name= ["dayi123",34,"liu",35,3,34,3,4,5,6,7,8,9,0] #方法一:只能更改最先查找的元素的值 if 3in name: num_of_ele = name.count(3) #判斷3在列表name中存在的個數 position_of_ele = name.index(3) #獲取3的下標,即3是列表中第幾個元素 name[position_of_ele] = 3333 #更改下標爲position_of_ele的元素值爲3333 print("[%s] 3 is/are in name" %num_of_ele) print(name) #方法二:更改查找到所有元素的值 for i in range(name.count(3)): #3存在幾次則循環幾次 ele_index = name.index(3) #獲取3的下標 name[ele_index] = 666 #更改值爲666 print(name)
(7)把小列表追加到大列表:
name = ["dayi123",34,"liu",35,3,34,3,4,5,6,7,8,9,0] name2 = ["nihaoa",3344,55] name.extend(name2) #擴展進來一個新的列表,將name2擴展到name中 name.reverse() #反轉列表 name.sort() #排序,Python3中如果同時存在字符串會報錯 print(name)
(8)刪除元素:
name.pop() #刪除最最後一個元素
name.pop(2) #刪除最後一個元素
(9)複製列表:
importcopy #引入copy模塊 name = [34,"dayi123",["liuyi",35,3],34,3,4,5,6,7,8,9,0] #列表中還可以包含列表 name3 =name.copy() #將name列表再複製一份 name4 =copy.copy(name) #通過引入copy模塊在複製一份copy模塊 name5 =copy.deepcopy(name) #通過” deepcopy”深度複製一份name列表 name[1] = "Dayi123" #更改列表中第一個元素的值 name[2][2] =55555 #更改列表中包含的列表中第二個元素的值 print(name) print(name3) #列表中的列表時存在另一個內存空間中 print(name4) print(name5) #通過深度複製可以將列表中的列表複製出來 print(id(name),id(name3),id(name5)) #打印內存地址 print(id(name[2]),id(name3[2]),id(name5[2])) #通過打印內存地址可以看到copy到的列表中包含 的列表內存地址相等,deepcopy到的不相等
六、元組(不可變列表)
1、創建元組:
ages = (11, 22, 33, 44, 55) 或 ages = tuple((11, 22, 33, 44, 55))
2、元組操作
r = (1,2,3,4,5,6) #只讀列表,元組 #r[1] = 3 #不能修改,修改會報錯 print(r)
七、字典(無序)
1、創建字典:
person = {"name": "mr.wu", 'age': 18} 或 person = dict({"name": "mr.wu", 'age': 18})
2、常用操作:索引、新增、刪除、(鍵、值、鍵值對)、循環、長度
id_db= { #創建一個字典 456789123456789909: { 'name':"dayi123", 'age':34, 'add':"tainshui" }, 12345677890987678: { 'name':"liu", 'age':3, 'add':"gasu" }, 12345677890987678: { 'name':"liu", 'age':3, 'add':"gasu" }, } #print(id_db) #字典中的值不能重複,所以只打印一次重複值 print(id_db[12345677890987678]) #打印‘12345677890987678’中的值 id_db[12345677890987678]['name'] = "liuyi" #將’ 12345677890987678’值改爲‘liuyi’ id_db[12345677890987678]['qq_of_wife'] = 110110110 #在‘12345677890987678’中新增值 print(id_db) del id_db[12345677890987678]['add'] #刪除‘12345677890987678’中的‘add’ print(id_db) id_db[12345677890987678].pop("age") #刪除‘12345677890987678’中的‘age’ print(id_db) v = id_db.get(12345677890987678) #讀取12345677890987678中的值,賦給“v” print(v) dic2 = { 'name':'haha', 456789123456789909: { 'name':"wangwang", 'age': 24, 'addr':'china' }, } id_db.update(dic2) #根據dic2更新id_db的值 print(id_db) #更新後,沒有的值會增加,都存在的會根據dic2中的更改,dic中獨有的不會變 print(id_db.items()) #將字典轉化爲列表 print(id_db.values()) #打印value值 print(id_db.keys()) #打印key值 print(456789123456789909 in id_db) #判斷列表中是否存在456789123456789909 print(id_db.setdefault(4567,"haha")) #如果字典中存在4567則打印出來,不存在,就設置爲haha #把列表[1,2,34,5,6]中的值取出來當字典中的key,並賦值爲"eee" print(id_db.fromkeys([1,2,34,5,6],'eee')) print(id_db.popitem()) #隨機刪除列表中鍵值 print(id_db) #循環打印字典中key,value效率低,因爲要有一個dict to list的轉化過程 #for k,v in id_db.items(): # print(k,v) for key in id_db: #效率高 print(key,id_db[key ])
八、set(集合、無序、不重複序列)
1創建集合
方法一、s1 ={11,12}
S2 = set()
方法二、set([11,12,13,14])
2操作集合
1)、創建、添加元素、清空集合
s =set() #創建空集合 s.add(123) #給集合中添加一個元素 s.add(123) #集合中元素不重複 print(s)s.clear() #清除集合中元素print(s)
2)、更新操作:
s1 ={11,22,33} s2 = {22,33,44} #print(s1.difference(s2)) #s1中存在s2中不存在的打印出來 #s3 = s1.symmetric_difference(s2) #s1中不存在的,s2中都不存在的都打印出來 #print(s3) #s1.difference_update(s2) #查找s1中存在s2中不存在,將結果更新到s1中,s1中僅有僅s1中有的元素 #print(s1) s1.symmetric_difference_update(s2)#將s1中s2中非共同元素移到s1中(s1中只有s1、s2非共同元素) print(s1)
3)、集合中的刪除操作:
s1 = {11,22,33} #s1.remove(11) #移除一個元素,不存在沒有提示 #print(s1) #ret = s1.pop() #移除一個元素,隨機移除, 並獲取移除元素,pop裏面不能加參數 #print(ret) s1.discard(22) #如果不存在會有提示 print(s1.discard(333))
4)、交集、並集操作:
s1 = {11,22,33} s2 = {22,33,44} s3 = s1.intersection(s2) #獲取s1和s2的交集 print(s3) s1.intersection_update(s2) #將交集更新至s1 print(s1) s4 = s1.union(s2) #並集操作 print(s4) #li = [22,33,44,55,66] li = "dayi123" s2.update(li) #將可迭代的東西更新至s2,可以是列表,字典,字符串 print(s2)
3 python2中集合的用法
a & b #求交集 a.intersection(b)
a | b #求並集 a.union(b)
a – b # 求差集 a.difference(b)
a ^ b #求對稱差集 a.symmetric_difference(b)
a.issubset(b) #a 是b 的子集
a.issuperset(b) # a 是否包含b
九、字符的編碼與解碼
1、字符的編碼與解碼
(1)在python2默認編碼是ASCII, python3裏默認是unicode
(2)unicode 分爲 utf-32(佔4個字節),utf-16(佔兩個字節),utf-8(佔1-4個字節),utf-16就是現在最常用的unicode版本,不過在文件裏存的還是utf-8,因爲utf8省空間
(3)在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
2、python3的字符編碼與解碼
#!/usr/bin/envpython # -*-coding:utf-8 -*- #python不需要表明字符編碼爲utf-8,默認爲utf-8 #Author:dayi123 s =" 劉毅" t =s.encode("utf-8") #將字符串解碼成bytes print(t) y =t.decode("utf-8") #將bytes編碼爲字符串 print(y) x =s.encode('gbk') #將utf格式字符串解碼爲gbk格式的bytes print(x) print(x.decode('gbk')) #將gbk格式的bytes編碼爲utf-8格式的字符串
3、python2的字符編碼與解碼
#!/usr/bin/envpython #Author:dayi123 importsys print(sys.getdefaultencoding()) #顯示默認的字符編碼 msg ="劉毅" print(msg) #將字符串解碼爲unicode再編碼爲gbk msg_gb2312= msg.decode("utf-8").encode("gb2312") print(msg_gb2312) gb2312_to_gbk= msg_gb2312.decode("gbk").encode("gbk") print(gb2312_to_gbk)