python学习 day8_容器的方法&文件操作
时间:2023-12-20 18:37:02
python学习day8
- 列表的相关函数
-
- 增
-
- 1.append 在向列表末尾添加新元素
- 2.insert 在指定索引之前插入元素
- 3.extend 添加所有元素的迭代
- 删
-
- 1.pop 如果没有索引删除最后一个元素,则通过指定索引删除元素 (推荐)
- 2.remove 通过给予的值来删除,如果多个相同元素,默认删除第一个
- 3.clear 清空列表
- 改查
-
- index 在列表中获得一定值的索引
- count 计算某个元素出现的次数
- sort 列表排序(默认小到大排序)
- 排序字母 (字母排序依据ascii编码)
- 中文可以排序,但不规则可以遵循
- reverse 列表反转操作
- tuple 元组只有两个函数:count、 index 与列表中的方法完全相同
- 深拷贝 和 浅拷贝
-
- (1) 浅拷贝 (只复制一级容器的所有元素,其他层次延续以前的数据)
-
- 方法一
- 方法二 (推荐)
- (2) 深拷贝 (各级元素单独复制一份,形成独立副本)
- (3) 总结:copy 和 deepcopy 谁更快 浅拷贝更快~
- 字典相关函数
-
- 增 fromkeys()
- 删
-
- pop() 按键删除键值对 (如果没有此键,可以设置默认值,防止报错)**
- popitem() 删除最后一个键值对
- clear() 清空字典
- 改
-
- update() 批量更新 (有键就更新,没键就加)
- 查
-
- get() 通过键获取值(如果没有键,可以设置默认值,防止报错)
- 重点语法:
-
- keys() 将字典键组成新的可迭代对象
- values() 将字典中的值组成新的可迭代对象
- items() 将字典的键值对合成一个元组,形成新的可迭代对象
-
- items()解包变量
- 集合相关操作 (交叉并补)
-
- 1.intersection() 交集,简写为:&
- 2.difference() 差集,简写为:-
- 3.union() 并集,简写为:|
- 4.symmetric_difference() 对称差集 (其中包充) 简写为:^
- issubset() 判断是否是子集,简写为:<
- issuperset() 判断是否是父集,简写为:>
- isdisjoint() 检测两集是否不相交 不相交 True 相交False
- 收集相关函数
-
- 增
-
- add() 向集合中添加数据 (一次加一个)
- update() 迭代着增加 (一次加一堆)
- 删
-
- clear() 清空集合
- pop() 随机删除集合中的数据
- discard() 删除集合中指定的值(未删除) 推荐使用)
- remove() 删除集合中指定的值(不存在则报错)(理解)
- 冰冻集合(理解)
-
- 空冰冻集合
- 冰冻集合可遍历
- 只能交叉补
- 文件操作
-
- 1.文件的写入操作
- 2.读取文件的操作
- 3.转换字节流
- 4.存储字节流
- 5.读取字节流
- 复制文件夹 集合.png 这张图片
- 2.将所有读出的二进制字节流写入另一份文件
列表的相关函数
增
1.append 在向列表末尾添加新元素
lst = ["黄俊"] lst.append("王振") print(lst) # ["黄俊","王振"]
2.insert 在指定索引之前插入元素
lst = ['黄俊', '王振'] lst.insert(1,"刘伟") print(lst) # 黄军,刘伟
3.extend 添加所有元素的迭代
写作只能添加另一个序列,不能直接在方法中写多个值
lst = ['黄俊', '王振']
tup = ("宋普东","王赢钱","陈宁波")
lst.extend(tup)
print(lst) # ['黄俊','王振','宋普东','王赢钱','陈宁波']
删
1.pop 通过指定索引删除元素,若没有索引移除最后那个 (推荐)
注意:.pop()会返回被删除值
- 默认删除最后一个
lst = ["魏富强","宋清零","黎建忠","朱家熠"]
res = lst.pop()
print(res) # "朱家熠"
print(lst) # ["魏富强","宋清零","黎建忠"]
- 可以指定下标删除
lst = ["魏富强","宋清零","黎建忠","朱家熠"]
res = lst.pop(1)
print(res) # '宋清零'
print(lst) # ["魏富强","黎建忠","朱家熠"]
2.remove 通过给予的值来删除,如果多个相同元素,默认删除第一个
lst = ["魏富强","宋清零","黎建忠","黎建忠","朱家熠"]
lst.remove("黎建忠")
print(lst) # ["魏富强","宋清零","黎建忠","朱家熠"]
3.clear 清空列表
lst = ["魏富强","宋清零","黎建忠","朱家熠"]
lst.clear()
print(lst) # []
改查
index 获取某个值在列表中的索引
- 当这个值不存在时 , 会报错
lst = ["魏富强","宋清零","黎建忠","朱家熠","魏富强","魏富强"]
res = lst.index("宋清零") # 1
# res = lst.index("宋清零123") # error
print(res)
count 计算某个元素出现的次数
lst = ["魏富强","宋清零","黎建忠","朱家熠","魏富强","魏富强"]
res = lst.count("魏富强")
print(res) # 3
sort 列表排序(默认小到大排序)
lst = [100,200,90,-3,0,12]
lst.sort()
print(lst) # [-3, 0, 12, 90, 100, 200]
从大到小排列:
lst = [100,200,90,-3,0,12]
lst.sort(reverse = True)
print(lst) # [200, 100, 90, 12, 0, -3]
对字母进行排序 (字母排序依照ascii编码)
字母是一位一位的进行比较,如果第一位相同,再去比较第二位,依次类推
lst = ["kobe","james","oneal","jordon","iverson"]
lst.sort()
print(lst) # ['iverson', 'james', 'jordon', 'kobe', 'oneal']
可以对中文进行排序,但是无规律可循
lst = ["王闻","周杰伦","罗志祥","蔡徐坤","王振"]
lst.sort()
print(lst) # ['周杰伦', '王振', '王闻', '罗志祥', '蔡徐坤']
reverse 列表反转操作
lst = [100 ,200,300,-3]
lst.reverse()
print(lst) # [-3, 300, 200, 100]
tuple 元组中的函数只有2个:count、 index 跟列表中的方法使用一模一样
可以对元组中的列表进行列表函数的操作:
tup = (1,2,3,4,[5,6,7])
tup[-1].append(8)
print(tup) # (1, 2, 3, 4, [5, 6, 7, 8])
tup = (1,2,3,[4,5,6,(7,8,9)])
tup[-1][-1] = 100 # 将列表中的元组(7,8,9)这个元素改为100
print(tup) # (1, 2, 3, [4, 5, 6, 100])
深拷贝 和 浅拷贝
我们先来看下下组试验:
a = 19
b = a
print(id(b),id(a)) # 双方id相同
a = 20
print(b) # 19 # 变更了a的赋值,b不变
lst1 = [1,2,3]
lst2 = lst1
lst1.append(4) # 变更了lst1的赋值
print(lst2) # lst2也跟着变了
容器类型中不可变数据的内存地址不会因容器的内存地址改变而改变。
不可变数据: int float bool complex str tuple
(1) 浅拷贝 (只拷贝一级容器所有的元素,其他层级延续以前的数据)
方法一
语法:.copy()
lst = [1,2,3]
lst2 = lst.copy()
lst.append(5)
print(lst) # [1, 2, 3, 5]
print(lst2) # [1, 2, 3]
lst2[0] = 2
print( id(lst[0]))
print( id(lst2[0])) # 对应元素的值不同,双方id不同,反之则相同
方法二 (推荐)
语法:copy.copy()
copy模块.copy函数()
import copy
lst = [1,2,3]
lst2 = copy.copy(lst)
lst.append(10)
print(lst)
print(lst2)
(2) 深拷贝 (所有层级的元素都单独拷贝一份,形成独立的副本)
语法:copy.deepcopy()
import copy
lst = [1,2,3,[4,5,6]]
lst2 = copy.deepcopy(lst)
lst[-1].append(888)
print(lst) # [1, 2, 3, [4, 5, 6, 888]]
print(lst2) # [1, 2, 3, [4, 5, 6]]
print(id(lst[-1]) , id(lst2[-1])) # 不相同
- 深拷贝可以应用在字典当中:
import copy
dic = {
"a":1,"b":[1,2,3]}
dic2 = copy.deepcopy(dic)
dic["b"].append(4)
print(dic) # {'a': 1, 'b': [1, 2, 3, 4]}
print(dic2) # {'a': 1, 'b': [1, 2, 3]}
(3) 总结:copy 和 deepcopy 谁更快 浅拷贝更快~
浅拷贝: 只拷贝第一层级所有的元素, copy.copy()
深拷贝: 拷贝所有层级的元素,都单独开启新的空间 copy.deepcopy()
- (地址:[不可变数据]会暂时指向原数据,[可变数据]会独立开辟新空间)
可变数据: list set dict
不可变数据: int float bool complex str tuple
字典相关函数
增 fromkeys()
推荐写法:
dic = {
}
dic["top"] = "韩国the shy"
dic["middle"] = "肉鸡rookie"
dic["bottom"] = "a_water"
dic["jungle"] = "鞋王"
dic["support"] = "bao_blue"
print(dic)
fromkeys() 使用一组键和默认值创建字典:
lst = ["a","b","c"]
dic = {
}.fromkeys(lst,None) # 将列表所有元素转换成键
print(dic)
出错注意点:
lst = ["a","b","c"]
dic2 = {
}.fromkeys(lst,[1,2]) # 将列表所有元素转换成键,并统一赋予对应值[1,2]
dic2["a"].append(3) # 给键'a'对应的列表增加元素3,别的键对应的列表也都增加了元素3
print(dic2) # {'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}
改进方式:使用推荐写法
dic3 = {
}
dic3["a"] = [1,2]
dic3["b"] = [1,2]
dic3["c"] = [1,2]
dic3["a"].append(3) # 只给键a对应的列表增加了元素3
print(dic3) # {'a': [1, 2, 3], 'b': [1, 2], 'c': [1, 2]}
删
pop() 通过键去删除键值对 (若没有该键可设置默认值,预防报错)**
删除键值对:
dic = {
'top': '韩国the shy', 'middle': '肉鸡rookie', 'bottom': 'a_water', 'jungle': '鞋王', 'support': 'bao_blue'}
res = dic.pop("bottom")
print(res) # a_water 返回的是被删除的键对应的值
print(dic) # {'top': '韩国the shy', 'middle': '肉鸡rookie', 'jungle': '鞋王', 'support': 'bao_blue'}
可以在pop当中设置默认值,预防报错:
dic = {
'top': '韩国the shy', 'middle': '肉鸡rookie', 'bottom': 'a_water', 'jungle': '鞋王', 'support': 'bao_blue'}
res = dic.pop("bottom123","没有")
print(res) # 没有 没有对应值,返回设置的默认值
popitem() 删除最后一个键值对
dic = {
'top': '韩国the shy', 'middle': '肉鸡rookie', 'bottom': 'a_water', 'jungle': '鞋王', 'support': 'bao_blue'}
res = dic.popitem()
print(dic) # {'top': '韩国the shy', 'middle': '肉鸡rookie', 'bottom': 'a_water', 'jungle': '鞋王'}
print(res) # ('support', 'bao_blue') 返回的是被删除的键值对
clear() 清空字典
dic = {
'top': '韩国the shy', 'middle': '肉鸡rookie', 'bottom': 'a_water', 'jungle': '鞋王', 'support': 'bao_blue'}
dic.clear()
print(dic) # {}
改
update() 批量更新 (有该键就更新,没该键就添加)
方法一(推荐):
dic = {
"ww":"大帅哥","spd":"渣男","sql":"负心男"}
newdic = {
"ww":"美男子","wz":"一表人才","yh":"未来的土豪"}
dic.update(newdic)
print(dic) # {'ww': '美男子', 'spd': '渣男', 'sql': '负心男', 'wz': '一表人才', 'yh': '未来的土豪'}
方法二:
dic = {
"ww":"大帅哥","spd":"渣男","sql":"负心男"}
dic.update(hj="未来战士",wyq="警察") # 括号中输入键值对时,用等号连接键值对
print(dic) # {'ww': '大帅哥', 'spd': '渣男', 'sql': '负心男', 'hj': '未来战士', 'wyq': '警察'}
查
get() 通过键获取值(若没有该键可设置默认值,预防报错)
get方法可以预防报错,默认返回None:
dic = {
"ww":"大帅哥","spd":"渣男","sql":"负心男"}
# res = dic["www"]
res = dic.get("www") # 返回None
get方法可以设置默认值:
dic = {
"ww":"大帅哥","spd":"渣男","sql":"负心男"}
res = dic.get("www","该键不存在")
print(res) # 该键不存在
重点语法:
可迭代对象: 容器类型数据 , range对象 , 迭代器
keys() 将字典的键组成新的可迭代对象
dic = {
"wy":"智多星","lzs":"花和尚","zs":"浪里白条"}
res = dic.keys()
print(res) # dict_keys(['wy', 'lzs', 'zs'])
values() 将字典中的值组成新的可迭代对象
dic = {
"wy":"智多星","lzs":"花和尚","zs":"浪里白条"}
res = dic.values()
print(res) # dict_values(['智多星', '花和尚', '浪里白条'])
items() 将字典的键值对凑成一个个元组,组成新的可迭代对象
dic = {
"wy":"智多星","lzs":"花和尚","zs":"浪里白条"}
res = dic.items()
print(res) # dict_items([('wy', '智多星'), ('lzs', '花和尚'), ('zs', '浪里白条')])
items()的变量的解包
dic = {
"wy":"智多星","lzs":"花和尚","zs":"浪里白条"}
res = dic.items()
for k,v in res:
print(k,v)
''' 输出为: wy 智多星 lzs 花和尚 zs 浪里白条 '''
集合的相关操作 (交叉并补)
1.intersection() 交集,简写为:&
同时拥有的元素
set1 = {
"the shy" , "rookie" , "jacklove" , "神秘男孩"}
set2 = {
"蔡国庆","倪萍","赵忠祥","神秘男孩"}
res = set1.intersection(set2)
print(res) # {'神秘男孩'}
# 简写 &
res = set1 & set2
print(res)
2.difference() 差集,简写为:-
某一方与另一方相比没有的元素,取第一个集合里独有的元素
set1 = {
"the shy" , "rookie" , "jacklove" , "神秘男孩"}
set2 = {
"蔡国庆","倪萍","赵忠祥","神秘男孩"}
res = set1.difference(set2)
print(res) # {'rookie', 'jacklove', 'the shy'}
# 简写 -
res = set1 - set2
print(res)
3.union() 并集,简写为:|
双方所有元素的合集(去重)
set1 = {
"the shy" , "rookie" , "jacklove" , "神秘男孩"}
set2 = {
"蔡国庆","倪萍","赵忠祥","神秘男孩"}
res = set1.union(set2) # {'神秘男孩', 'the shy', '蔡国庆', '倪萍', '赵忠祥', 'rookie', 'jacklove'}
print(res)
# 简写 |
res = set1 | set2
print(res)
4.symmetric_difference() 对称差集 (补集情况涵盖在其中) 简写为:^
双方的合集去掉交集后的剩余部分
set1 = {
"the shy" , "rookie" , "jacklove" , "神秘男孩"}
set2 = {
"蔡国庆","倪萍","赵忠祥","神秘男孩"}
res = set1.symmetric_difference(set2)
print(res) # {'赵忠祥', '蔡国庆', 'the shy', 'rookie', '倪萍', 'jacklove'}
## 简写 ^
res = set1 ^ set2
print(res)
issubset() 判断是否是子集,简写为:<
子集:集合内所有元素对方都有
父集:拥有对方所有元素并且还有更多
set1 = {
"张恒","杨