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.数据类型总结与分类

# 按存值个数区分
# 只能存一个值                                                数字、字符串
# 可以存放多个值:可称为容器类型                                  列表、元组、字典

# 按照访问方式区分
# 直接访问:只能通过变量名访问整个值                               数字
# 顺序访问:可以用索引访问指定的值,索引代表顺序,又称为序列类型          字符串、列表、元组

# 按可变不可变区分
# 可变类型                                                    列表、字典、集合                 
# 不可变类型                                                   数字、字符串、元组
posted @ 2023-12-01 02:03  王苗鲁  阅读(4)  评论(0编辑  收藏  举报