Python学习之路基础篇--07Python基础+编码、集合 和 深浅Copy
1 小数据池(节省内存)
只有数字和字符串中内存,储存在同一个内存地址中
数字的范围在-5~256中,字符串有以下两个特点:不能含有特殊字符,还有就s*20 不是同一个地址,而要*21就不是了
2 编码
ASCii 中 英文用 8 位 ,一个字节
unicode 中 英文用 32 位 ,四个字节 中文用 32 位 ,四个字节
utf-8 中 英文用 8 位 ,一个字节 中文用 24 位 ,三个字节
gbk 中 英文用 8 位 ,一个字节 中文用 16 位 ,二个字节
特点: 各个编码之间的二进制,是不能互相识别,会产生乱码
文件的储存和传输,不能使用unicode(太大了),而使用utf-8、utf-16、gbk2312和ascii等
在python3中,str在内存中是用unicode编码的
bytes 类型:
对于英文str
表现形式: s = 'eli'
编码方式:unicode
对于英文bytes
表现形式: s = b'eli'
编码方式:utf-8 或 gbk
对于中文str
表现形式: s = '中国'
编码方式:unicode
对于中文bytes
表现形式: s = b'x\e34\e34\e23\e23\e23\12' (有6个字节,故转成了utf-8的形式)
编码方式:utf-8 或 gbk
用encode 编码,将str 转化成 bytes 类型
s1 = 'eli' s1 = s1.encode('utf-8') #b'eli'
2 关于字典和列表的小知识
#删除偶数位的数 # 1 切片 lis = [11, 22, 33, 44, 55, 66] lis = lis[::2]print(lis) # 2 先取一个新列表,然后替换下即可 l1 = [] for i in lis: if lis.index(i) % 2 == 0 : l1.append(i) lis = l1 print(lis) dic = dict.fromkeys([1,2,3],'春哥')print(dic) dic = dict.fromkeys([1,2,3],[]) print(dic) # {1: [], 2: [], 3: []} dic[2].append('袁姐') #因为没有序号,所以添加, 就所有都添加的 print(dic) dic[2].extend('二哥') #迭代式添加print(dic) # 重要的一点,在循环列表和字典的时候,不能删除其元素,如果删除就会报错
0、[]、{}、()、'' 和 set() 转化成bool值 都是False
3 元组
如果是单个元素在元组之中,以没有逗号,原本什么样的数据类型,就是什么样的
tu1 = (1) tu2 = (1,) print(tu1,type(tu1)) print(tu2,type(tu2))
4 集合
是可变的数据类型,其中的元素是不可变的数据类型,无序且不重复(可以用于去重)
#创建 set1 = set({1,3,'barry'}) set2 = {1,2 ,'barry'} print(set1) print(set2) #增 set1 = {'tom', 'eli', 'sofile', 'jay'} set1.add('ALEX') set1.update('shuai') #迭代增加 print(set1) # 删 set1 = {'tom', 'eli', 'sofile', 'jay'} set1.remove('jay') #按元素删除,没有报错 set1.pop() #随机删除 set1.clear() #清除集合 del set1 #删除集合 #print(set1) # 交集(& intersection) set1 = {1, 2, 3, 4, } set2 = {3, 4, 5, 6, } print(set1 & set2) print(set1.intersection(set2)) # 并集 (\ union) print(set1 | set2) # {1, 2, 3, 4, 5, 6} print(set2.union(set1)) # {1, 2, 3, 4, 5, 6} # 差集 (- difference) print(set1 - set2) # {1, 2,} print(set1.difference(set2)) # {1, 2} # 反交集(^ symmetric_difference) print(set1 ^ set2) # {1, 2, 6, 7} print(set1.symmetric_difference(set2)) # {1, 2, 6, 7} # 子集和超集 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'>
5 深浅Copy
赋值的过程,只是将一个的内存地址 赋给另外一个,只是指向同一个内存地址,若改变其值,并不会使另一个改变,因为其的内存地址并为改变
a = 1 b = a print(a, b ) b = 2 print(a, b)
对于列表来说,赋值这行为比作,使两个东西同时指向同一个杯子, 而水是共享的,当你改变杯子里面的水,两个值都会发生变化
当你使用copy 方法时,把这个杯子给copy下来,有同样的内存地址,当你改变其中的项时,改变的其时是那个项所指的内存地址,另一个杯子,并没有改变,相互独立
al = [1,1,1,[22,33]] bl = al.copy() print(al,bl ) al[2] = 99 print(al,bl) print(id(al[2]),id(bl[2]))
然而出现嵌套的情况,就是杯子中还有小杯子,小杯子里的水,是共享的,所以一个改变,另一个也跟着变化(浅copy)
深copy 就是要 import copy
然后再进行copy ,,这样就是所有都复制