python--知识小结和集合
知识小结
一、
= 表示赋值 ==表示比较值的大小 is 比较内存地址
二、
数字小数据池:在-5~256之内,id在电脑里是一样的 字符串id一样要求: ①:不能有特殊字符 ②:s(一个单字符)*20以内的数字,id是一样的,乘以20以后的数字则id不一样了 剩余的如dict, list ,元祖,tuple,set 没有小数据池
三、
各个编码之间的二进制不能相互转换,会产生乱码
文件的存储,传输,不能用unicode,只能用utf-8 gbk ascii utf-16
四、
bytes的类型,都是在py3的大环境中 对英文:str: 表现形式:a='alex' 中文:表现形式:a=b'alex' 编码形式:utf-8 gbk 对中文:str: 表现形式:a='中国' 编码形式:unicode 中文:表现形式:a=b'x\e23\e24\e25\e26\e27\e28' 三个字节表示一个中文 编码形式:utf-8 gbk
例子:
encode 编码 str---->bytes s1='alex' s11=s1.encode(utf-8) print(sii) 输出:b'alex'
五、集合
集合是可变数据类型,元素无序,去重的。但是集合里面的元素必须是不可变的数据类型。
1:集合的创建,两种方式
set1 = set({1,2,'barry'}) set2={'1','2','barry'}
2:集合的增:
add,直接添加 set={'1','2','barry'} set.add('66') print(set) #{1, 2, 'barry', '66'} update 迭代添加,会自动去除重复 set.update('66') #{1, 2, 'barry', '6'}
3:集合的删:
set= set({1,2,'barry'}) 1.pop set.pop() 随机删除,有返回值 2.remove set.remove(‘1’) 删除元素 # {2,'barry'} 3.clear() set.clear() #清空集合 4.del del set 删除集合
3:集合没有改,因为集合里的元素是不可变数据类型
4:集合的查:
set1 = set({1,2,'barry'}) for i in set1: print(i)
5.两个集合的操作
5.1 交集。(& 或者 intersection)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 1:& set3=set1&set2 print(set3) #{4, 5} 2:intersection set3=set1.intersection(set2) #{4, 5}
5.2 并集。(| 或者 union)
set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} set3=set1|set2 print(set3) #{1, 2, 3, 4, 5, 6, 7, 8} set3=set1.union(set2) print(set3) #{1, 2, 3, 4, 5, 6, 7, 8}
5.3 反交集。
(^ 或者 symmetric_difference) 1:^ set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1^set2) #{1, 2, 3, 6, 7, 8} 2:symmetric_difference print(set1.symmetric_difference(set2)) #{1, 2, 3, 6, 7, 8}
5.4 子集与超集。
1.子集 set1 = {1,2,3,4,5} set2 = {1,2,3,4,5,6} print(set1<set2) #true set1是set2 子集 2.超集 print(set2>set1) #true set2是set2超集
冻结的set:frozenset
5.5差集。(- 或者 difference)
1.- set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} print(set1-set2) #{1, 2, 3} print(set2-set1) #{8, 6, 7} 2:difference print(set1.difference(set2)) #{1, 2, 3} print(set2.difference(set1)) #{8, 6, 7}
六、浅copy
6.1赋值运算:对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。
总结:l1=l2 不管怎么变化都是同时变,保持一致。
l1 = [1,2,3,['barry','alex']]
l2 = l1 #赋值后 l1和l2是一样的
print(l1,l2) # 值一样 [1, 2, 3, ['barry', 'alex']]
[1, 2, 3, ['barry', 'alex']]
print(id(l1),id(l2)) # id一样 28808496 28808496
#l1进行修改后再打印
l1[0] = 111
print(l1,id(l1),l2,id(l2)) #l1和l2同时变化,并且id也是同时变化的
# [111, 2, 3, ['barry', 'alex']] 28808496
[111, 2, 3, ['barry', 'alex']] 28808496
l1[3][0]='云哥' #改变嵌套的内容,l1=l2仍然同时变,保持一致。
print(l1,id(l1),l2,id(l2))
#[111, 2, 3, ['云哥', 'alex']] 28939568
[111, 2, 3, ['云哥', 'alex']] 28939568
6.2浅拷贝copy。
对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
l1 = [1,2,3,['barry','alex']]
l2=l1.copy() #l1与l2地址不一样
print(l2,id(l2),l1,id(l1)) #l2:[1, 2, 3, ['barry', 'alex']] 7821432
#l1: [1, 2, 3, ['barry', 'alex']] 7836976
l2.append('4') #总结:l2改变第一层变化,不影响l1
print(l2,id(l2),l1,id(l1)) #l2:[1, 2, 3, '4', ['barry', 'alex']] 28661880
# l1:[1, 2, 3, ['barry', 'alex']] 28677424
l2[3][0]='云哥' #总结:l2改变第二层(被嵌套的不分)变化,l1进行同步变化
print(l2,id(l2),l1,id(l1)) #l2:[1, 2, 3, ['云哥', 'alex']] 28792952
# l1:[1, 2, 3, ['云哥', 'alex']] 28808496
6.3,深拷贝deepcopy
对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。
import copy
l1 = [1,2,3,['barry','alex']]
l2 = copy.deepcopy(l1)
print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048
l1[1] = 222
print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2915377167048
l1[3][0] = 'wusir'
print(l1,id(l1[3])) # [1, 222, 3, ['wusir', 'alex']] 2915377167240
print(l2,id(l2[3])) # [1, 2, 3, ['barry', 'alex']] 2915377167304