day07
1.今日内容
1.深浅copy
2.集合类型
3.字符编码
2.深浅copy
案例
list1 = ['egon', 'lxx', [1, 2]]
# 一、二者分隔不开,list1改list2也跟着改,因为指向的就是同一个地址
# 这不叫copy
list2 = list1
list1[0] = 'EGON'
print(list2)
浅copy
# 默认情况下都是浅copy
# 二、需求:
# 1.拷贝一下原列表产生一个新的
# 2.想让两个列表完全独立开,针对的是改操作,不是读操作(改操作就用浅拷贝)
# 三、如何copy列表
# 新瓶装旧酒(列表内不可变类型的拷贝)
# 浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表
l1 = [111, 222, [333, 444]]
l2 = l1.copy()
l3 = l1[:]
print(id(l1[0]), id(l1[1]), id(l1[2]))
print(id(l2[0]), id(l2[1]), id(l2[2]))
l1[2][0] = 666
l1[0] = 777
print(l1)
print(l2)
man = ["上海", [100, ]]
woman = man.copy()
man[1][0] -= 30
print(man)
print(woman)
深copy
# 深copy:拷贝所有层
from copy import deepcopy
l1 = [111, 222, [333, 444]]
l2 = deepcopy(l1)
print(id(l1[0]), id(l1[1]), id(l1[2]))
print(id(l2[0]), id(l2[1]), id(l2[2])) # 对于可变类型,造了一个新的列表
# l1[2][0] = 666
# print(l1)
# print(l2)
l1[0] = 777
print(l1)
print(l2)
3.集合类型
集合类型part1
# 1.集合作用
# 1.1 关系运算
friends1 = ['wangmiaolu', 'egon', 'kevin']
friends2 = ['jerry', 'egon', 'kevin']
l = []
for x in friends1:
if x in friends2:
l.append(x)
print(l)
集合类型part2
# 1.2 去重
# 2.定义:在{}内用逗号分隔开多个元素,多个元素满足以下三个条件
# 1.集合内元素必须为不可变类型
# 2.集合内元素无序
# 3.集合内元素没有重复
# s=set({1,2})
s = {1, 2}
# 集合内元素必须为不可变类型
s = {1, [1, 2]} # 会报错
# 集合内元素无序
s = {1, 'a', 'z', 'b', 4, 7}
# 集合内元素没有重复
s = {1, 1, 1, 1, 1, 1, 1, 'a', 'b'}
print(s)
# 了解
# 默认是空字典
s = {}
print(type(s))
# 定义空集合
s = set()
print(s, type(s))
集合类型part3
# 3.类型转换
set({1, 2, 3})
res = set('hello world')
print(res)
print(set([1, 1, 1, 1, 1, 1]))
# 报错因为集合里面有可变类型
print(set([1, 1, 1, 1, 1, 1, 1, 1, [11, 222]]))
print(set({'k1': 1, 'k2': 2}))
集合类型-内置方法
# 4.内置方法、符号集合关系运算
# ========关系运算符=======
friends1 = {"wangmiaolu", "kevin", "egon"}
friends2 = {"jerry", "kevin", "egon"}
# 4.1 取交集:两者共同的好友
res = friends1 & friends2
print(res)
# 符号集合关系运算
print(friends1.intersection(friends2))
# 4.2 取并集/合集:两者所有的好友
res2 = friends1 | friends2
print(friends1.union(friends2))
print(res2)
# 4.3 取差集:取friends1独有的好友
res3 = friends1 - friends2
print(friends1.difference(friends2))
print(res3)
# 取friends2独有的好友
print(friends2-friends1)
print(friends2.difference(friends1))
# 4.4 对称差集:求两个用户独有的好友们(即去掉共有的好友)
res4 = friends1 ^ friends2
print(friends1.symmetric_difference(friends2))
print(res4)
集合类型-父子集
# 4.5 父子集:包含的关系
s1 = {1, 2, 3}
s2 = {1, 2, 4}
# 不存在包含关系,下面比较均为False
print(s1 > s2)
print(s1 < s2)
s1 = {1, 2, 3}
s2 = {1, 2}
print(s1 > s2) # 当s1大于或等于s2时,才能说s1是s2他爹
print(s1.issuperset(s2))
# s1<s2=>True
print(s1.issubset(s1))
s1 = {1, 2, 3}
s2 = {1, 2, 3}
print(s1 == s2) # s1与s2互为父子
print(s1.issuperset(s2))
print(s2.issuperset(s1))
集合类型-去重
# =========去重========
# 1.只能针对不可变类型去重
print(set([1, 1, 1, 1, [1, 1, 2, 3]]))
print(set[1, 1, 1, 2])
# 2.无法保证原来的顺序
l = [1, 'a', 'b', 'z', 1, 1, 2]
l = list(set(l))
print(l)
# 关于可变类型的去重
l = [
{'name': 'alex', 'age': 18, 'sex': 'male'},
{'name': 'jack', 'age': 73, 'sex': 'male'},
{'name': 'tom', 'age': 20, 'sex': 'female'},
{'name': 'egon', 'age': 18, 'sex': 'male'},
{'name': 'egon', 'age': 18, 'sex': 'male'},
]
new_l = []
for dic in l:
if dic not in new_l:
new_l.append(dic)
print(new_l)
集合类型-其他操作、其他内置方法
# 其他内置方法
# discard比remove容错性更好
s = {1, 2, 3}
# s.discard(3)
# print(s)
# 删除元素不存在则报错
# s.remove(4)
# 需要掌握的内置方法2:update
# s.update({1, 3, 5})
# 需要掌握的内置方法3:pop
# res = s.pop()
# print(res)
# 需要掌握的内置方法4:add
s.add(4)
print(s)
4.数据类型总结与分类
# 按存值个数区分
# 只能存一个值 数字、字符串
# 可以存放多个值:可称为容器类型 列表、元组、字典
# 按照访问方式区分
# 直接访问:只能通过变量名访问整个值 数字
# 顺序访问:可以用索引访问指定的值,索引代表顺序,又称为序列类型 字符串、列表、元组
# 按可变不可变区分
# 可变类型 列表、字典、集合
# 不可变类型 数字、字符串、元组