1 元组(tuple)
元组是一种不可变序列。无法通过取索引修改元素。
一般情况下,当希望数据不改变的时候,使用元组,其余情况下都使用列表。
1.1 创建元组
语法:
变量 = (元素1,元素2,...)
# 括号内可以为空
我们可以通过取索引的方式输出元组内的元素,但是不能修改。
TypeError: ‘tuple’ object does not support item assignment
类型错误:“tuple”对象不支持项分配
如果元组不是空的,则元组内至少得有一个,
例:
tup = 10
print(tup, type(tup)) # 输出tup,此时为整型
tup = 10, # 修改tup,在原先的基础上加上,
print(tup, type(tup)) # 输出tup,此时变为tuple
执行结果:
这种方式也同样适用于 str 类型数据。
1.2 元组的解包
概念:将元组中的每一个元素赋值给变量。
tup = 10, 20, 30, 40
a, b, c, d = tup # 将tup中的值分别赋予a,b,c,d
print(a, b, c, d)
执行结果:
注:解包时,变量的个数需要等于元组内元素的个数,否则报错:
小于时:ValueError: too many values to unpack (expected 2)
值错误:太多的值无法解包(应为2)
大于时:ValueError: not enough values to unpack (expected 5, got 4)
指错误:没有足够的值来解包(应为5,得到4)
如果变量个数无法与元组的元素个数保持一致,可以在任意一个变量前加上*
,剩余的元素将以列表的形式返回到加了 * 的变量中。
例:
tup = 10, 20, 30, 40, 50, 60
a, b, *c = tup # 变量不够,在c前面加 *
print(f'a = {a}, b = {b}, c = {c}')
执行结果:
2 可变对象
一般而言,对象当中保存了三个数据。分别是:
- id(标识)
- type(类型)
- value(值)
可变对象指的是对象中的value可以被改变。
我们以a = [1,2,3]
为例。
代码:
a = [1, 2, 3]
print(a, id(a)) # 输出列表a和a的id
a[0] = 10 # 修改列表a中索引值为0的元素
print(a, id(a)) # 输出修改后的a和id
执行结果
通过以上的操作我们可以得出:像a[0] = 10
的这种修改列表的方式只会修改对象的值,而不会修改变量的值。这里通过观察变量a的id在修改前后不变可以看出来。
代码:
a = [1, 2, 3]
print(a, id(a)) # 输出列表a的值和id
a = [10, 2, 3] # 通过向变量a重新赋值来改变a的值
print(a, id(a)) # 输出修改后的a和id
执行结果:
通过以上操作,我们又可以得出:像a = [10,2,3]
的这种修改列表的方式,会改变变量的值。修改后,变量的id会发生改变。系统会为此开辟一个新的内存空间,用于保存新的对象。
总结: 列表是一种可变对象,像a[0] = 10
是通过变量修改对象里面的值,但是不会改变变量指向的对象(依旧指向同一个对象)。而像a = [10,2,3]
这种操作会改变变量所指向的对象(指向不同的对象)。
3 字典(dict)
概念:字典是一种数据结构,被称为映射(mapping)。
字典与列表类似,也是一种用来存储对象的容器。
区别:
- 列表存储数据的性能很好,但是查询数据的性能差。
- 字典中每一个元素都有唯一的key(键),通过key我们可以快速寻找指定的元素。相较于列表,字典存储性能较差,但查询数据性能好。
字典中的元素有key(键)和value(值),所以字典又称为键值对(key-value)结构。字典中可以有多个键值对,每一个键值对称为一个项(item)
语法:
变量 = {key1:value,
key2:value,
...}
# 与列表类似,字典也可以为空
字典的键尽量不要重复,否则键的值会被后来的值覆盖。
3.1 获取字典的元素
根据键获取
语法:
变量[key]
# key必须加引号,否则系统会将其作为变量处理
3.2 字典的使用
3.2.1 使用dict()创建字典
创建字典有两种方式:
- 直接使用{}
- 使用dict()函数
语法:
变量 = dict{key1 = value, key2 = value, ...}
dict()函数也可以将包含有双值子序列的序列转换为字典。如:
代码:
a = dict([('name','葫芦娃'),
('age',10),
('sex','男')])
print(a)
执行结果:
Q:什么是双值子序列?
A:双值序列:指序列中只有2个值,例如:'ab'
,[1,,4]
,('a','b')
子序列:序列中的元素也是序列,则称这个元素为子序列。
结合以上两个概念,双值子序列:指的就是序列中的元素都是子序列,同时每个子序列中只有两个值。例如:[('a',1),('b',2),('c',3)]
3.2.2 使用get()获取字典的值
我们除了通过key获取字典的值外,还可以通过get()获取字典的值。
语法:
字典.get(key,[default])
# default为未找到key时显示的值,可省略
用key获取字典的值时,如果没有找到key,则会报错:
KeyError:‘name1’
但是,如果使用get()获取时,如果没找到key,不会报错,而是会返回None
,如果定义了default,则会返回default值。
3.2.3 修改字典
- 通过key修改k-v
语法:
字典[key] = value
如果没有找到对应的key,则会在字典末尾加上k-v。
- setdefault()方法添加k-v
语法:
字典.setdefault(key,value)
如果key在字典中已经存在,则返回key的值,不对字典做任何操作。
- update()将其他字典中的k-v添加到当前字典中
语法:
字典1.update(字典2)
如果有重复的key,则后面的会覆盖前面的。
- del关键字删除k-v
语法:
del 字典[key]
- popitem()随机删除字典中的k-v
删除之后,会将删除的value作为返回值返回。
语法:
字典.popitem()
- pop()根据key删除k-v
语法:
字典.pop(key,[default])
# 在没有找到key时,会返回default作为返回值
如果字典中没有要删除的k-v,且没有default,则会报错:
KeyError: ‘d’
- clear()清空字典
语法:
字典.clear()