day2.4
day2.4
字典的内置方法
1.类型转换
字典的键:推荐用变量命名的字符串进行使用
字典的键和集合的值有数据类型上的要求
不可变的数据类型可以做字典的键:Number(int,float,bool,complete),str,tuple
可变类型,(不可被应用在set中和字典的键):list dict set
d1 = {
'name': 'jason',
'age': 18,
'hobbies': ['play game', 'basketball']
}
# 按key取值 get
print(d1['name']) # jason 键存在
print(d1['xxx']) # 键不存在直接报错
如果用字典的正常方式取值,如果取值不存在则会报错,
1.使用get键取值时,取值存在时 键存在,取值第一个参数不存在时不会报错,而是返回None.
2.在取值时第二个参数写出你想要输出的值,就会打印你写的值,不写则打印None。如果第一参数参数存在,则不会使用第二参数。
# 修改值
print(id(d1))
d1['name'] = 'jasonDSB' # 键存在是修改值
print(d1, id(d1))
1.在字典中取出key值用中括号括起来,在将另一边的v值修改,在打印输出变量名即可。
# 添加值
d1['pwd'] = 123 # 键不存在则是新增一个键值对
print(d1)
1.随便新建一个key值,键不存在则是新建一个键值对。
# 删除键值对
del d1['name'] # 通用的删除方式
print(d1) # {'age': 18, 'hobbies': ['play game', 'basketball']}
print(d1.pop('age')) # 18 弹出
print(d1) # {'name': 'jason', 'hobbies': ['play game', 'basketball']}
d1.popitem() # 随机弹出一个(使用频率很低 可以忽略)
print(d1)
1.del通用的删除方式
2.可以字典key值来删除键值对,但是会弹出v值
# 统计字典中的键值对的个数 (len)
print(len(d1)) # 3
# 成员运算
print('jason' in d1) # False
print('name' in d1) # True
只能判断key值,
# 获取所有的键 (keys)
print(d1.keys()) # dict_keys(['name', 'age', 'hobbies']) 可以看成是列表
# 获取所有的值 (valus)
print(d1.values()) # dict_values(['jason', 18, ['play game', 'basketball']]) 可以看成是列表
# 获取所有的键值对 (items)
print(d1.items()) # dict_items([('name', 'jason'), ('age', 18), ('hobbies', ['play game', 'basketball'])]) 可以看成是列表套元组
for v in d1.values():
print(v)
#######################了解############################
# 1.update更新字典
# dic = {'k1': 'jason', 'k2': 'Tony', 'k3': 'JY'}
# dic.update({'k1': 'JN', 'k4': 'xxx'})
# print(dic) # 键存在则修改 键不存在则新增
# 2.fromkeys()快速生成字典
# dic = dict.fromkeys(['k1', 'k2', 'k3'], [])
# print(dic) # {'k1': [], 'k2': [], 'k3': []}
"""笔试题"""
# dic['k1'].append(111) # 三个键指向的是同一个列表
# print(dic) # {'k1': [111], 'k2': [111], 'k3': [111]}
# 3.setdefault()
dic = {'k1': 111, 'k2': 222}
# print(dic.setdefault('k3', 333)) # 键不存在则新增键值对 并且有返回结果是新增的v
# print(dic)
print(dic.setdefault('k1', '嘿嘿嘿')) # 键存在 则返回对应的值 不做修改
print(dic)
元组的内置方法
# 类型转换
可以看成不可变的列表,支持for循环的都可以转化成元组。
print(tuple(11)) # 报错
print(tuple(11.11)) # 报错
print(tuple('jason'))
print(tuple([11,22,33,44]))
print(tuple({'name':'jason'}))
print(tuple({11,22,33,44}))
print(tuple(True)) # 报错
# 定义方式
1.在()内用逗号隔开多个任意类型的值。调:如果元组内只有一个值,则必须加一个逗号,否则()就只是包含的意思而非定义元组。
# 运用
t1 = (11, 22, 33, 44, 55, 66)
1.索引取值
print(t1[0])
按索引取值(正向取+反向取):只能取,不能改否则报错!
2.切片操作
print(t1[1:4])
print(t1[-1:-4:-1])
print(t1[-4:-1])
顾头不顾尾,步长
3.间隔
print(t1[1:4:2]) # (22, 44)
4.统计员组内的个数(len)
print(len(t1)) # 6
5.成员运算
print(11 in t1) # True
判断某个元素是否存在,再就是True,不在就是False。
6.统计某个元素出现的次数(count)
print(t1.count(22))
7.元组内元素不能"修改":元组内各个索引值指向的内存地址不能修改
t1[0] = 111
集合内置方法
1.类型转换
但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型
# 去重
集合内不能出现重复的元素(自带去重特性)
# 关系运算
判断两个群体的差异
使用方面:共同好友 共同点赞 ...
我们可以先定义两个集合friends与friends2来分别存放两个人的好友名字:
f1 = {'jason', 'kevin', 'tony', 'jerry'}
f2 = {'jason', 'tom', 'jerry', 'jack'}
1.合集(|):求两个用户所有的好友(重复好友只留一个)
print(f1 | f2)
{'kevin', 'jack', 'tom', 'jason', 'jerry', 'tony'}
2.交集(&):求两个用户的共同好友
print(f1 & f2)
{'jerry', 'jason'}
3.差集(-):求两个用户的独自好友
print(f1 - f2)
{'kevin', 'tony', 'tom', 'Jerry'}
4.对称差集(^):求两个用户独有的好友们(即去掉共有的好友)
print(f1 ^ f2)
{'jack', 'tony', 'tom', 'kevin'}
5.值是否相等(==)
print(f1 == f2)
False
6.父集:一个集合是否包含另外一个集合
包含则返回True 不包含则返回False
垃圾回收机制
# 什么是垃圾回收机制
垃圾回收机制(简称GC)是Python解释器自带一种机,专门用来回收不可用的变量值所占用的内存空间
# 为什么要有垃圾回收机制
程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间如果不及时清理的话会导致内存使用殆尽(内存溢出),导致程序崩溃,因此管理内存是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。
# 垃圾回收机制原理分析
Python的GC模块主要运用了“引用计数”(reference counting)来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用的问题,并且通过“分代回收”(generation collection)以空间换取时间的方式来进一步提高垃圾回收的效率。
1.引用计数
python会将引用计数为0的数据清除
扩展阅读:变量值被关联次数的增加或减少,都会引发引用计数机制的执行(增加或减少值的引用计数),这存在明显的效率问题。
2.标记清除
当内存空间即将溢出(满了)的时候 python会自动启动应急机制
停止程序的运行 挨个检查值的引用计数并给计数为0的数据打上标记
然后一次性清理掉
3.分代回收
根据值存在的时间长短 将值划分为三个等级(1,2,3)
例如:
等级1 检测机制每隔5s来一次
等级2 检测机制每隔1min来一次
等级3 检测机制每隔5min来一次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了