py3中字符串默認的是Unicode(列表及其他不是)
Unicode:A:四字節
中:四字節
utf-8 : A :一字節
歐洲:兩字節
中:三字節
gbk : A :一字節
中:兩字節
①不同編碼之間是不能相互識別,會產生亂碼
②存儲,傳輸的是 utf-8、gbk、或者gb2312等(不可能是Unicode)所以需要轉換:
py3 中的 str 和 bytes
爲啥不直接用bytes :因爲bytes的表現形式是十六進制
表現形式:bytes s = b'sunv' 內部存儲:(utf-8,gbk等) 00101000001010100
中文:b'\xe6\x99\x93'
表現形式:str s = 'sunv' 內部存儲:(Unicode) 0100100101001010
bytes:
print(by.encode('utf-8'))
其形式爲:b'\xe6\x99\x93'(十六進制)
print(by.encode('gbk'))
其形式爲:b'\xcf\xfe'(十六進制)
str (Unicode) ---> bytes(utf-8,gbk) ---> 硬盤存儲或傳輸
(-------忘了要問啥 ----)
補充:
Unicode 因爲是萬國碼,所以可以和任何形式(utf-8,gbk等)編碼方式轉化,
gbk和utf-8轉化必須藉助Unicode。
---------------------------------------------------------------
# 枚舉 enumerate(str,list,tuple,dict,set(都可以)) dict:枚舉鍵
li = ['one','two','there']
for i in enumerate(li,1):
print(i) # (1, 'one') \n (2, 'two') \n (3, 'there')
=========================================================================
關於id 、(is 和 ==)
字符串 若沒有空格,沒有特殊字符,id相同
s = 'poi kl'
r = 'poi kl'
print(s is r) # False
s = 'ssssssssssssssssssssssssssssssss'
r = 'ssssssssssssssssssssssssssssssss'
print(s is r) # True
數字(-5 ~ 256)和字符串相同(id相同)
s1 = 'sunv'
s2 = 'sunv'
print(s1 == s2) # True
print(s1 is s2) # True
列表,字典,元組,set 的 id 都不同
l1 = [1,2,3]
l2 = [1,2,3]
print(l1 == l2) # True
print(id(l1),id(l2)) # 35634632 35633480
print(l1 is l2) # False
對於 int 小數據池
範圍:-5 ~ 256 (都含),創建相同的數字,都指向同一個內存地址
i = 6
j = 6
print(i is j) # True
i = 258
j = 258
print(i is j) # False
i = -5
j = -5
print(i is j) # True
將li = [11,22,33,44,55]
把li中奇數位刪除:
方法一:
del li[1:2] # 1
print(li)
li = li[0::2] # 1
print(li)
方法二li = [11,22,33,44,55] 方法二
for i in range(0,len(li)//2):
del li[i+1]
print(li)
方法三
for i in range(len(li)-1,0,-1):
if 1 % 2 == 1:
del li[i]
print(li)
集合set:
增:(2)
add:
set1 = {1,'sunv',(1,2)}
set1.add('hello')
print(set1) # ##{(1, 2), 1, 'hello', 'sunv'}
update:(迭代添加)
set1.update('別話')
print(set1) # ##{'sunv', 1, (1, 2), '話', '別'}
刪(4):
set1.remove(1) # 刪除元素:1
set.pop() # 隨機刪一個元素且有返回值
set1.clear() # 清空集合
del set # 刪除集合
無改
查(只能for 循環查):
for i in set1:
print(i)
# set = {1,'sunv',[1,2,3]} # 報錯
# set = {1,'sunv',{2,3}} # 報錯
# set = {1,'sunv',(1,2[2,3,4])} # 報錯
list1 = [1,1,2,3,4,5,5]
set1 = set(list1)
print(set1) # {1, 2, 3, 4, 5}
交集。(& 或者 intersection)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2) # {4, 5}
print(set1.intersection(set2)) # {4, 5}
並集。(| 或者 union)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7}
print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}
差集。(- 或者 difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 - set2) # {1, 2, 3}
print(set1.difference(set2)) # {1, 2, 3}
反交集。 (^ 或者 symmetric_difference)
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2) # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
子集與超集
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)
print(set1.issubset(set2)) # 這兩個相同,都是說明set1是set2子集。
print(set2 > set1)
print(set2.issuperset(set1)) # 這兩個相同,都是說明set2是set1超集。
frozenset不可變集合,讓集合變成不可變類型。
s = frozenset('barry')
print(s,type(s)) # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>
-----------------------------------------------------------------------------------------------------------------------------------
關於copy
列表:
l1 = [1,2,3]
l2 = l1
l1.append('barry')
print(l1) # [1, 2, 3, 'barry']
print(l2) # [1, 2, 3, 'barry']
字典:
dic = {'name':'barry'}
dic1 = dic
dic['age'] = 18
print(dic) # {'name': 'barry', 'age': 18}
print(dic1) # {'name': 'barry', 'age': 18}
字符串:(不可變)還有數字
s = 'alex'
s1 = s
s3 = s.replace('e','E')
print(s,s1,s3) # alex alex alEx
copy(淺拷貝):
不嵌套時,不隨之改變!
l1 = [1,[22,33,44],3,4]
l2 = l1.copy()
l1[1].append('55')
print(l1,id(l1),id(l1[1])) # [1,[22,33,44,'55'],3,4] 38385992 38387144
print(l2,id(l2),id(l2[1])) # [1,[22,33,44,'55'],3,4] 38408392 38387144
deepcopy(深拷貝):
對於深copy來說,兩個是完全獨立的,改變任意一個的任何元素(無論多少層),另一個絕對不改變
import copy
l1 = [1,[22,33],5,6]
l2 = copy.deepcopy(l1)
l1[0] = 111
print(l1,l2) # [111,[22,33],5,6] [1,[22,33],5,6](深拷貝不變)
l1[1].append('barry')
print(l1,l2) # [111,[22,33,'barry'],5,6] [1,[22,33],5,6](深拷貝不變)