垃圾回收机制与基本数据类型的内置方法
今日学习内容总结
今天我们就把所有的基本数据类型内置方法学完了。然而学完了不代表学会了。实际应用,长期敲代码才是真确的。实践出真理。
字典的内置方法
字典的内置方法非常重要,但是相对字符串和列表,它没有那么多。至于这么多的内置方法要如何去记忆。我只能说多敲了。
1.类型转换
不多说,直接尝试,代码示例:
# 整型
print(dict(10)) # 报错 'int' object is not iterable
# 浮点型
print(dict(10.11)) # 报错 'float' object is not iterable
# 字符串
print(dict('jason')) # 报错 dictionary update sequence element #0 has length 1; 2 is required
# 列表
print(dict(['jason', 'handsome'])) # 报错 dictionary update sequence element #0 has length 5; 2 is required 但是,并不是列表型不能转换成字典,而是写法必须符合字典
print(dict([['name', 'jason'], ['age', 18], ['hobby', 'run']])) # {'name': 'jason', 'age': 18, 'hobby': 'run'} 除了这种方法外,还有一种方式,那就是使用dict.fromkeys方法
user_list = ['jason', 18, 'run']
new_list = dict.fromkeys(user_list, 'name')
print(new_list) # # {'jason': 'name', 18: 'name', 'run': 'name'} 这就是dict.fromkeys方法的使用
# 元组
print(dict((('name', 'jason'), ('age', 18)))) # {'name': 'jason', 'age': 18} 元组与列表一样,直接写是会报错的,只有类似这种情况才能转换类型 当然,元组也可以使用dict.fromkeys方法
user_tuple = ('jason', 18, 'run')
new_tuple = dict.fromkeys(user_tuple, 'name')
print(new_tuple) # {'jason': 'name', 18: 'name', 'run': 'name'}
# 集合 因为集合是去重,无序,且不可变性的所以我只知道一个用dict.fromkeys方法的转换
user_set = {'jason', 18, 'run'}
new_set = dict.fromkeys(user_set, 'name')
print(new_set) # {'run': 'name', 18: 'name', 'jason': 'name'}
# 布尔值 也不可以转换
print(dict(True)) # 'bool' object is not iterable
2.取值方法
我们知道在字典中取值是按照键取值的,若键存在,则取值成功。若键不存在,则直接报错,停止运行,取值失败。为了我们的程序不会因为取值失败而停止运行,所以我们要学习get取值方法。代码示例:
a = {'name' : 'jason', 'age' : 18, 'hobby' : 'run'}
print(a['name']) # jason
print(a['user']) # 报错 'user' 提示你没有user这个键
# get方法的使用
print(a.get('name')) # jason
print(a.get('user')) # None 键不存在只会告诉你为空值,不会报错
print(a.get('user', '这个键不存在')) # 这个键不存在 当键不存在时,默认打印为None 但是你也可以自己设置
3.字典的增删改
之所以只有增删改是因为我们之前就讲了查询的方法了。这里我们统一说明字典的增删改的使用方法。代码示例:
a = {'name' : 'jason', 'age' : 18, 'hobby' : 'run'}
# 增加键值对
a['pwd'] = 666 # 这里是键不存在,所以直接新增一个键值对,可见字典也是一个可变类型
print(a) # {'name': 'jason', 'age': 18, 'hobby': 'run', 'pwd': 666}
# 删除键值对
# 1.通用方法
del a['name'] # 因为通用,所以不常用 滑稽
print(a) # {'age': 18, 'hobby': 'run'}
# 2.弹出,也就是与列表中的延迟删除类似
print(a.pop('hobby')) # run 与列表一样,先取出来,这个时候还可以用,但一会儿就删除了
print(a) # {'name': 'jason', 'age': 18}
# 3.随机弹出。使用频率很低,不建议使用
a.popitem()
print(a) # {'name': 'jason', 'age': 18}
# 修改值
a['hobby'] = 'study'
print(a) # {'name': 'jason', 'age': 18, 'hobby': 'study'} 只要键存在,我们就可以修改值,不存在则添加键值对
# 字典的更新 update方法
a.update({'name':'老刘', 'age': 20})
print(a) # {'name': '老刘', 'age': 20, 'hobby': 'run'} 键存在则修改 键不存在则新增
4.字典的统计与获取
因为都是记忆行的方法,所以直接代码示例:
a = {'name' : 'jason', 'age' : 18, 'hobby' : 'run'}
# 统计字典中键值对的个数
print(len(a)) # 3 与字符串,列表一样,用len查询,不过需要注意的是,字典的最小单位是键值对
# 成员运算
print('jason' in a) # False
print('name' in a) # True 成员运算也是,判断的是键
# 获取所有的键 所有的值 所有的键值对
print(a.keys()) # dict_keys(['name', 'age', 'hobby']) 可以看做成一个列表
print(a.values()) # dict_values(['jason', 18, 'run']) 可以看做成一个列表
print(a.items()) # dict_items([('name', 'jason'), ('age', 18), ('hobby', 'run')]) 可以看做成列表套元组
# 上述方法,在python3中实现。若在python2中实现,返回的就是一个列表。同时除了这些方法的使用,还可以自己写循环取值
元组内置方法
元组可以看成是不可变的列表,其内置方法的使用介绍如下
1.类型转换
支持for循环的都可以转换成元组,和列表一样。代码示例:
# 整型
print(tuple(10)) # 报错 'int' object is not iterable
# 浮点型
print(tuple(10.1)) # 报错 'float' object is not iterable
# 字符串
print(tuple('jason')) # ('j', 'a', 's', 'o', 'n')
# 列表
print(tuple(['jason', 'handsome', 'nb'])) # ('jason', 'handsome', 'nb')
# 字典
print(tuple({'name':'jason', 'age':18})) # ('name', 'age')
# 集合
print(tuple({'jason', 'handsome', 'nb'})) # ('handsome', 'nb', 'jason')
# 布尔值
print(tuple(True)) # 报错 'bool' object is not iterable
2.元组的特性
当元组内只有一个元素的时候 一定要在元素的后面加上逗号,否则打印数据类型时会打印该元素的数据类型。而一般情况下,我们会将所有可以存储多个数据的类型的数据,若只有一个元素,也会加上逗号。代码示例:
a = (1, 2, 3)
print(type(a)) # <class 'tuple'>
b = (10)
print(type(b)) # <class 'int'>
c = (10.11)
print(type(c)) # <class 'float'>
d = ('jason')
print(type(d)) # <class 'str'>
# 如果加了逗号,结果就不一样了
a = (1, 2, 3)
print(type(a)) # <class 'tuple'>
b = (10,)
print(type(b)) # <class 'tuple'>
c = (10.11,)
print(type(c,)) # <class 'tuple'>
d = ('jason',)
print(type(d)) # <class 'tuple'>
3.元组的内置方法
因为都是常用方法,我直接代码举例了:
a = ('jason', 'handsome', 'NB', '666')
# 1.索引取值
print(a[0]) # jason
print(a[-1]) # 666
# 2.切片与步长 其操作,与含义,与列表中的切片与步长一致
print(a[1:3]) # ('handsome', 'NB')
print(a[-1:-3:-1]) # ('666', 'NB')
print(a[0:3:2]) # ('jason', 'NB')
# 统计元素与成员运算
# 统计元组内元素的个数
print(len(a)) # 4
# 统计元素出现的次数
b = (1, 1, 1, 1, 2, 3, 4, 1 ,1 ,5 ,2)
print(b.count(1)) # 6
# 成员运算
print('jason' in a) # True
print('jas' in a) # False
集合内置方法
集合的特性是无序,去重,不可变的,同时集合内的元素只能是不可变类型,也就是说,类似于列表这种可变的数据类型,是不能作为集合的元素存入的。代码示例:
a = {[1, 2], 'fs'} # 甚至不需要打印结果,直接运行就会报错 unhashable type: 'list'
因为集合的特性,我们也是直接对集合的内置方法进行总结。:
# 类型转换
# 整型
print(set(10)) # 报错 'int' object is not iterable
# 浮点型
print(set(10.11)) # 报错 'float' object is not iterable
# 字符串
print(set('jason ')) # {'n', 'o', 's', ' ', 'j', 'a'}
# 列表
print(set([1, 2, 3])) # {1, 2, 3}
# 字典
print(set({'name':'jason', 1:2})) # {1, 'name'}
# 元组
print(set((1, 2, 3))) # {1, 2, 3}
# 布尔值
print(set(True)) # 报错 'bool' object is not iterable
# 2.两大功能
# 1.去重 集合内不能出现重复的元素(自带去重特性),如果出现了 会被集合自动去重
a = {1, 1, 1, 1, 1, 1, 2, 2, 3}
print(a) # {1, 2, 3}
# 关系运算 判断两个群体内的差异,类似于数学上的并集,交集,补集
a = {'jason', 'handsome', 666}
b = {'jason', 'NB', 666}
print(a & b) # {'jason', 666}
print(a - b) # {'handsome'}
print(b - a) # {'NB'}
print(a | b) # {'jason', 'handsome', 666, 'NB'}
print(a ^ b) # {'handsome', 'NB'}
垃圾回收机制
垃圾回收机制,在python中,python底层针对空间的申请和释放都是设计好的 不需要程序员操心。而垃圾回收机制有3步
1.引用计数,在python的使用中,我们的变量名对应一个值,而一个值,可以对应多个变量名。但是当我们的这个值,没有对应变量名时,python会将引用计数为0的数据清除。这就是引用计数。
2.标记清除,当内存空间即将溢出(满了)的时候 python会自动启动应急机制。停止程序的运行,挨个检查值的引用计数并给计数为0的数据打上标记。最会一次性清理掉
3.分代回收,根据值存在的时间的长短,将值划分为三个等级。在这三个等级中,检查机制会隔不同的时间来检查一次。
今日作业
# 1.去重列表元素并保留原来的顺序
l = ['a', 'b', 1, 'a', 'a']
list_1 = []
for i in l:
if i in list_1:
continue
else:
list_1.append(i)
print(list_1)
# 2. 去重下列数据字典并保留原来的顺序
l = [
{'name': 'lili', 'age': 18, 'sex': 'male'},
{'name': 'jack', 'age': 73, 'sex': 'male'},
{'name': 'tom', 'age': 20, 'sex': 'female'},
{'name': 'lili', 'age': 18, 'sex': 'male'},
{'name': 'lili', 'age': 18, 'sex': 'male'},
]
dict_1 = []
for i in l:
if i in dict_1:
continue
else:
dict_1.append(i)
print(dict_1)
# 3.关系运算
pythons = {'jason', 'oscar', 'kevin', 'ricky', 'gangdan', 'biubiu'}
linuxs = {'oscar', 'tony', 'gangdan'}
# 1.出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs) # {'gangdan', 'oscar'}
# 2.求出所有报名的学生名字集合
print(pythons | linuxs) # {'tony', 'gangdan', 'ricky', 'jason', 'kevin', 'biubiu', 'oscar'}
# 3. 求出只报名python课程的学员名字
print(pythons - linuxs) # {'jason', 'biubiu', 'ricky', 'kevin'}
# 4. 求出没有同时这两门课程的学员名字集合
print(pythons ^ linuxs) # {'biubiu', 'ricky', 'kevin', 'tony', 'jason'}

学习内容总结
浙公网安备 33010602011771号