Day06 代码块,数据池,元祖,编码本,深浅copy
01 昨日内容回顾
字典: 增: setdefault() 有责不变,无责添加 dic['key'] = vaulue 删: pop 按照key pop('key') pop('key',None) popitem() 删除最后一个 clear 清空 del dic['key'] 改: dic['key'] = 'v' update() dic1.update(dic) : dic的所有的键值对覆盖并添加到dic1中,dic不变 dic1.update(name='alex') 查: dic['key'] dic.get('key') dic.get('key','设置返回值') for i in dic: print(i) dic.keys() dic.values() dic.items() 类似于列表的容器,没有索引但是可以for循环去遍历。 a, b = [11, 22] a, b = 11, 22 a, b = b, a 创建字典的三种方式: dic = {'name': 'alex'} dic = dict() dic = dict(name='alex', age='12') dic = dict({'name': 'alex', 'age': 12}) dict.fromkeys('abc','alex')
02 作业讲解
03 id is ==
1) is 判断的是两个对象的内存地址id是否相同。
2 )== 比较的两边的数据是否完全相同。
04 小数据池(了解)
# 代码块 # 代码全都是基于代码块去运行的(好比校长给一个班发布命令),一个文件就是一个代码块。 # 不同的文件就是不同的代码块。 # 终端: # 两种优化机制: 小数据池,代码块内的缓存机制。
1) 代码块内的缓存机制
# Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在, 如果存在,会将其重用。换句话说:执行同一个代码块时, 遇到初始化对象的命令时,他会将初始化的这个变量与值存储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字典中的之前的这个值。 # 所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个对象, # 满足缓存机制则他们在内存中只存在一个,即:id相同。 # 注意: # 缓存机制只是在同一个代码块下!!!,才实行。 # 满足此机制的数据类型:int str bool。 # 优点: # 1,节省内存。 # 2,提升性能。
2)小数据池
# 不同代码块之间的优化。 # 适应的数据类型:str bool int # int: -5 ~256 # str: 一定条件下的str满足小数据池。 # bool值 全部。 # 优点: # 1,节省内存。 # 2,提升性能。
# 总结:
# 如果你在同一个代码块中,用同一个代码块中的缓存机制。
# 如果你在不同代码块中,用小数据池。
05 数据类型的补充(总结) ***
int,str,bool,list,tuple,dict,set # str -->list split() # list --> str join() # bool : False 0 '' [] () {} set() # list -->tuple tuple(list) tuple --->list list(tuple) # dict --> list list(dict) 返回键值 ['name','age'] # dict ----> tuple 返回键值('name','age')
元组中只有一个元素并且没有逗号,则他不是元组与元素数据类型相同
tuple1 = (1) 整数 tuple = (1,) 元组
tuple2 = ([1,2,3]) 列表 tuple2 = ([1,2,3],)元组
补充一个坑:
list
在循环一个列表时,最好不要改变列表的大小,这样会影响你的最终结果。
比如循环删除一个列表的时,列表里元素的索引值在发生变化
方法一:
new_l1 = []
for index in range(len(li)):
if index % 2 == 0:
new_l1.append(li[index])
li = new_l1
print(li)
方法二:
del li[1::2] print(li)
方法三:
倒叙循环列表 删除索引为奇数的元素
for index in range(len(li)-1,-1,-1): if index % 2 == 1: li.pop(index) print(li) for i in range(1,11): print(i)
dict 在循环一个字典时,不能改变字典的大小,会报错。
比如要循环删除一个键,会报错。解决办法:
创建一个新列表,将要删除的键添加进去,在循环键,通过键找到值删除
06 四个编码本:
1,不同的编码之间能否互相识别(报错或者出现乱码)。 不能!!
2, 规定:文字通过网络传输,或者硬盘存储不能使用Unicode编码方式。
大前提:
python3x环境:
唯独str类型:他在内部编码方式是unicode
所以 python3x中的字符串不能用于直接的网络传输 文件的存储 '中午请我去吃饭'
补充一个数据类型:bytes类型 与str类型是海尔兄弟。
为啥要有bytes:
bytes内部编码方式非unicode
为啥还要有str? bytes直接就解决了所有问题呀?
bytes 英文: b‘hahaha’ encode('gbk') ### b'hahaha'
bytes 中文: b'你好' encode('gbk') ### b'\xc4\xe3\xba\xc3'
bytes 中文是16进制表示,看不懂。
英文:
str:
表现形式:'alex'
内部编码:unicode
bytes:
表现形式:b'alex'
内部编码:非unicode
中文:
str:
表现形式:'屌丝'
内部编码:unicode
bytes:
表现形式:b'\xe5\xb1\x8c\xe4\xb8\x9d''
内部编码:非unicode
bytes:当你需要网络传输数据,文件存储数据时要考虑到bytes。
str ---> bytes(gbk utf-8)
unicode ---> gbk utf-8
# unicode ---> gbk 字符串 ---> gbk编码方式的bytes
# b1 = s1.encode('gbk') # 编码
# s2 = b1.decode('gbk') # 解码
07 深浅copy
1) 浅copy
在内存中创建一个新的list(dict),但是新的列表里面的元素还是与原列表共用一个。
l1 = [1,'a',[11,22]] l2 = l1.copy() print(id(l1),id(l2)) ### 两个列表的id不相同 所以对列表的相互操作互不影响 print( id(l1[0]),id(l2[0] ) 两个id还是相同的 print( id(l1[-1]),id(l2[-1] ) 两个id还是相同的
2)深copy
深copy会在内存中对原列表或(dict)以及列表里面的可变的数据类型重新创建一份,而 列表中不可变的数据类型还是沿用原来的。
l1 = [1,'a',[11,22]] l2 = copy.deepcopy() print(id(l1),id(l2)) ### 两个列表的id不相同 print( id(l1[-1]),id(l2[-1] ) 两个id是不同的 print( id(l1[0]),id(l2[0] ) 两个id还是相同的
3)切片(浅copy)
4)赋值运算(既不是浅copy也不是深copy) 两个变量指向同一个列表
08 集合(了解)
set1 = {‘alex’,1,2,‘wusir’}
集合本身是一个可变的数据类型,它要求里面的元素是一个不可变的类型(可哈希)
作用:
1)去重
2)关系测试,测试两组数据之前的交集、差集、并集等关系

浙公网安备 33010602011771号