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结束

 

段尾

 

posted @ 2023-05-12 01:33  Snom  阅读(176)  评论(0)    收藏  举报