Python高手之路体验课 第 14 / 18 篇
数据类型-字典,集合与布尔类型
在阅读本系列课程时,你需要跟着老师代码敲敲,看看代码print 输出结果加深理解。
一 字典
1. 字典类型基本介绍
字典用于存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,我们完全可以基于刚刚学习的列表去存放,如下:
# 既然如此,我们为何还要用字典?
info=['albert','male',18]
# 定义列表的目的不单单是为了存储,还要考虑取值,如果我想取出这个人的年龄,可以用
info[2]
# 但这是基于我们已经知道在第3个位置存放的是年龄的前提下,我们才知道索引2对应的是年龄,即:
# # name, sex, age
info=['albert','male',18]
"""
而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,
于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,
比如key=value,这就用到了字典
"""
字典用于标识存储多个值的情况,每个值都有唯一一个对应的key,可以更为方便高效地取值,字典的定义格式如下:
# 在{}内用逗号分隔,可以存放多个key:value的值,key一般是字符串,value可以是任意类型
info={'name':'albert','age':18,'sex':18}
# info=dict({'name':'albert','age':18,'sex':18})
字典可以存储多个值,是无序的,是可变类型,不可哈希。
2. 字典类型常用的方法
(1) 增加元素
通过键值对的方式
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
l1['hobbies'] = "music"
print(l1)
用fromkeys构造一个字典
"""
第一个参数迭代循环的字典的key,第二个参数表示value,
可以多个key循环对应这个value,也可以只有一个key,也可以没有value
"""
a = l1.fromkeys(l1,'I am Albert')
print(a)
b = dict.fromkeys('name') # 必须有一个可迭代类型,作为字典的key
print(b)
b = dict.fromkeys('e') # 也可以迭代
print(b)
# b = dict.fromkeys(1) #报错 数字类型不可迭代
b = dict.fromkeys([1,2,3,])
print(b)
(2) 删除元素
del 通过字典的key删除
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
del l1['name']
print(l1)
pop 或者popitem删除
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
res = l1.pop('name') # 删除指定key的value,并拿到一个返回值
print(res)
print(l1)
res2 = l1.popitem() # 随机返回并删除字典中的一对键和值(一般删除末尾对)。
# 如果字典已经为空,却调用了此方法,就报出KeyError异常。
print(res2)
print(l1)
(3) 更改元素
通过键值对的方式
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male','3':3,
}
l1['name'] = '马一特'
print(l1)
通过setdefault 或者update操作,两者使用和区别如下:
setdefault只添加不修改
d1 = {
'name': 'albert',
'age': 18,
}
d1.setdefault('name', 'Albert')
d1.setdefault('gender', 'male')
print(d1)
update既添加也修改
d1 = {
'name': 'albert',
'age': 18,
}
d1.update({'name': 'Albert', 'gender': 'male'}) # 注意传参方式的不同
print(d1)
(4) 查找元素
通过键值对查找
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
a = l1['name']
print(a)
通过get方法查找
l1 = {
'name': 'albert',
'age': 18,
'gender': 'male'
}
a = l1.get('hobbies') # 找不到不报错
print(a)
通过enumerate 枚举
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
for a in enumerate(d1):
print(a)
通过.keys(),.values(),.items()等方法
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
a = d1.keys()
print(a)
print(list(a)[0])
a = d1.values()
print(a)
print(list(a)[0])
a = d1.items()
print(a)
print(list(a)[0])
通过for循环遍历
d1 = {
'name': 'albert',
'age': 18,
'gender': 'male',
'3':3,
}
for k,v in d1.items():
print(k,v)
(5) 成员运算与长度运算
参考列表的运算方法,成员运算的依据是字典的key,而不是value,长度运算都可以作为参考的依据
二 集合类型
花括号内,多个元素用逗号分割,用来存储多个值,并且是无序的,那么这多个值不能用来取值,但是我们可以使用它来进行去重(比如去掉列表中重复的元素)和关系运算。
# 集合的元素遵循三个原则:
1: 每个元素必须是不可变类型(可作为字典的key)
2: 没有重复的元素
3: 无序
# 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
集合类型可以存多个值,是无序的,是可变类型,不可以哈希。
关系运算练习
有如下两个集合,piano是报名钢琴课程的学员名字集合,violin是报名小提琴课程的学员名字集合
piano={'albert','孙悟空','周星驰','朱茵','林志玲'}
violin={'猪八戒','郭德纲','林忆莲','周星驰'}
1. 求出即报名钢琴又报名小提琴课程的学员名字集合
2. 求出所有报名的学生名字集合
3. 求出只报名钢琴课程的学员名字
4. 求出没有同时这两门课程的学员名字集合
参考答案
# 求出即报名钢琴又报名小提琴课程的学员名字集合
print(piano & violin)
# 求出所有报名的学生名字集合
print(piano | violin)
# 求出只报名钢琴课程的学员名字
print(piano - violin)
# 求出没有同时这两门课程的学员名字集合
print(piano ^ violin)
三 布尔类型
计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人脑能干什么,计算机就应该能干什么,人脑的主要作用是数据运行与逻辑运算,此处的布尔类型就模拟人的逻辑运行,即判断一个条件成立时,用True标识,不成立则用False标识。
#布尔值,一个True一个False
>>> a=3
>>> b=5
>>> a > b #不成立就是False,即假
False
>>> a < b #成立就是True, 即真
True
# 接下来就可以根据条件结果来干不同的事情了:
if a > b:
print(a is bigger than b )
else:
print(a is smaller than b )
# 上面是伪代码,但意味着,计算机已经可以像人脑一样根据判断结果不同,来执行不同的动作。
布尔类型的重点知识
#所有数据类型都自带布尔值
1、None,0,空(空字符串,空列表,空字典等)三种情况下布尔值为False
2、其余均为真
可变类型与不可变类型(重点)
# 1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典
# 2. 不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)