Python基础笔记3(字典&推导式&拆包)
1. 字典
JSON是浏览器可以识别的一种数据类型,数据结构。这个JSON数据与字典类似,用于进行网络交互。
像列表如果很长,想修改列表中一个元素,同过下标的方式进行修改容易出错,想要快速定位到某个数据也很不方便。
基于此原因,Python发明了一种特殊的下标,可以快速找到想要的数据。
拥有这种特殊下标的数据类型就是字典。
字典的定义格式
{key: value, key2: value....}
key可以理解为:我们自己可以定义的下标
value可以理解为:我们要存储的真正的数据
字典只要存储一个数据,就必须用key:value(我们常称之为键值对)组成
student_info = {'id': 1, 'name': '安娜', ‘age’: 20}
如果当前这个学生的信息比较多,可以回车换行去写(主流)
student_info = {
'id': 1,
'name': '安娜',
'age': 20,
'score': {'语文': 90, '数学': 80}
}
print(student_info['id']) # 1
print(student_info['age']) # 20
print(student_info['score']['数学']) # 80
2.字典的常见操作
通过[key]取值的方式获取value值。key不存在则报错
通过字典中的get方法获取不存在的key,防止报错
如果获取的这个key在字典中不存在,则默认返回一个默认值:None
get方法可以传入第二个参数:如果key不存在,则返回自定义的第二个参数
print(student_info.get('phone')) # 不存在,返回None
print(student_info.get('phone', '当前没有联系方式')) # 不存在,返回设置的 当前没有联系方式
字典值的修改
student_info['age'] = 18
print(student_info['age']) # 18
添加一个新的键值对 如果当前key不存在,赋值后会新增一个键值对
student_info['address'] = '长沙' # {'id': 1, 'name': '安娜', 'age': 18, 'score': {'语文': 90, '数学': 80}, 'address': '长沙'}
删除地址信息
del student_info['address']
print(student_info) # {'id': 1, 'name': '安娜', 'age': 18, 'score': {'语文': 90, '数学': 80}}
# del student_info # 直接将字典对象删除
# student_info.clear() # 结果{} 不会删除字典对象 只会将字典对象中的键值对清空
遍历字典中的keys键
for item in student_info: # 另外还有一种方式是student_info写成student_info.keys()
print(item)
打印出的结果为:
id
name
age
score
遍历字典中的values值
for item in student_info.values():
print(item)
打印出的结果:
1
安娜
18
{'语文': 90, '数学': 80}
遍历字典中所有的key / values
for item in student_info.items():
print(item)
打印出来的结果(是以元组的形式返回):
('id', 1)
('name', '安娜')
('age', 18)
('score', {'语文': 90, '数学': 80})
3. 推导式
只存在列表推导式,字典推导式,集合推导式。不存在元组推导式
列表推导式
通常生成偶数列表的方式
int_list = []
for item in range(1, 21):
if item % 2 == 0:
int_list.append(item)
print(int_list)
通过列表推导式生成列表
int_list = [item for item in range(1, 21) if item % 2 == 0]
print(int_list) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[] 元素保存的容器类型
item 生成的元素,是一个变量
for item in range(1, 21) 生成元素的一段代码
if item % 2 == 0 生成元素中的筛选条件
在列表推导式中使用三个for循环
a = [(x, y, z) for x in range(1, 3) for y in range(3) for z in range(3, 7, 2)]
print(a)
(x, y, z) 生成的元素,()代表元组,x,y,z代表元组中的元素
for x in range(1, 3) 生成x的方式,通过range方法,x生成值1,2(1到3,不含3)
for y in range(3) 生成y的方式,通过range方法,y生成0,1,2
for z in range(3, 7, 2) 生成z的方式,通过range的方法,z生成3,5。开始于3,结束于7不含7,步长为2
三个for是并列关系,相互组合,x*y*z种组合
[(1, 0, 3), (1, 0, 5),
(1, 1, 3), (1, 1, 5),
(1, 2, 3), (1, 2, 5),
(2, 0, 3), (2, 0, 5),
(2, 1, 3), (2, 1, 5),
(2, 2, 3), (2, 2, 5)]
例如:
一个list里面的元素,如[1, 2, 3, 4.....100],变成[[1, 2, 3], [4, 5, 6], .....]
a = [x for x in range(1, 101)]
b = [a[x: x+3] for x in range(0, len(a), 3)]
print(b)
集合推导式
int_set = {item for item in range(1,21) if item % 2}
print(int_set) # {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
字典推导式
int_dict = {x: x**2 for x in range(1, 11)}
print(int_dict)
结果
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
所谓的推导式,其实是根据某个规律生成一些元素,将元素填充到指定的容器类型中
扩充:生成一个随机数字的列表
from random import randint
data = [randint(1, 10) for _ in range(10)]
print(data)
结果:[3, 7, 4, 10, 1, 9, 4, 9, 3, 9]
_为临时变量,一般代表用不到的变量,不会占用内存,节约内存。相当于一个占位符。很少用这种方式。
4.拆包
int_list = [1, 2, 3, 4]
b, a, c, d = int_list
print(a, b, c, d) # 2 1 3 4
变量位置需要和元素位置对应
变量个数必须和元素个数一致
int_tuple = (1, 2, 3, 4)
b, a, c, d = int_tuple
print(a, b, c, d) # 2 1 3 4
int_set = {1, 2, 3, 4}
b, a, c, d = int_set
print(a, b, c, d) # 2 1 3 4
集合和元组的拆包和列表没什么区别。
字典拆包
info = {'name': '安娜', 'age': 19}
# a, b = info # name age
# a, b = info.values() # 安娜 19
# print(a, b)
for k, v in info.items():
print(k, v)
执行结果为:
name 安娜
age 19
for循环是最常用的一种字典拆包 将key -> k, value -> v
有两个变量,进行数据的交换
a = 1
b = 2
a, b = b, a
print(a, b) # 2,1
扩展:
为何没有元组推导式,因为生成器
data = (item for item in range(10))
print(data) # <generator object <genexpr> at 0x00000204B1B85CC8>
生成器的使用
for i in data:
print(i) # 依次打印0-9
生成器是一种特殊的对象,scrapy框架中会用到,节约内存,理论上可以加载无穷大数据
用到了懒加载:即如果没有使用这个生成器对象,不会生产出任何数据,一旦调用了这个对象,才会生产值
可以使用print(data.__next__())来加载生成器中的数据,用一次生产一个值。如上面data生成器,第一次0,第二次用打印1,最终打印到9结束
段尾

浙公网安备 33010602011771号