文章目录
一、元组的基本使用
序列:计算机中有序的排列数据的一种数据结构。
序列分为可变和不可变两种。
元组:序列中的一种,表现形式即tuple,是一个不可变序列,没有添加、删改等方法。
列表和元组的原则:
一般,希望数据不改变时用元组,其他情况都用列表。
创建元组
用()创建元组。
my_tuple = (1,2,3,4,5)
print(my_tuple)
print(type(my_tuple))
输出
(1, 2, 3, 4, 5)
<class 'tuple'>
访问元素
用tuple[index]
my_tuple = (1,2,3,4,5)
print(my_tuple[3])
输出
4
给元素赋值会报错
如
my_tuple = (1,2,3,4,5)
my_tuple[3] = 6
print(my_tuple)
报错,TypeError: 'tuple' object does not support item assignment
。
※如果元组非空,它里面至少有一个。
my_tuple = 1,
print(my_tuple)
打印
(1,)
可以分别访问元素并赋值,即元组的解包,
解包指的是将元组每一个元都赋值给一个变量。
tpl = (1,2,3,4,5)
a,b,c,d,e = tpl
print(f'a={a}\nb={b}\nc={c}\nd={d}\ne={e}')
输出
a=1
b=2
c=3
d=4
e=5
解包的运用:
可运用于变量值的交换
如
a = 1
b = 2
a,b = b,a
print(f'a={a}\nb={b}')
打印
a=2
b=1
在对元素解包时,必须要变量的个数与元组的长度一致,会报错;
tpl = (1,2,3,4,5)
a,b = tpl
print(f'a={a}\nb={b}')
会报错,ValueError: too many values to unpack (expected 2)
※当变量和元组中的元素数量不一致,剩余元素用列表表示,即在变量前面加一个*,这样变量将会获取元组中剩余的元素,并且只能加一个*,不能加多个*;
※并且列表的位置可以与元组的任意连续区间对应。并且列表的位置可以与元组的任意连续区间对应。
tpl = (1,2,3,4,5)
a,b,*c = tpl
print(f'a={a}\nb={b}\nc={c}')
打印
a=1
b=2
c=[3, 4, 5]
又如,
tpl = (1,2,3,4,5)
*a,b,c = tpl
print(f'a={a}\nb={b}\nc={c}')
打印
a=[1, 2, 3]
b=4
c=5
二、可变对象
不可变类型:
int、float、string
可变类型:
list、tuple
每个对象在内存中保存了3个数据:
id(标识)
type(类型)
value(值)
举例:
列表a = [1,2,3],在内存中的一定区域,会分别保存一个对象的id(假设为0x111)、type(class list)、value([1,2,3]),
对元素进行改变即对值进行改变,
改对象:
如a[0] = 10,则a变为[10,2,3]
这个操作是通过变量修改对象里面的值,不会改变变量指向的操作。
改变量:
如a = [4,5,6],即a发生了改变,假设id变为0x211,此时为id(0x211)、type(class list)、value([4,5,6])
对变量重新赋值,会改变变量所指向的对象。
修改前:
a = [1,2,3]
print(a,id(a))
打印
[1, 2, 3] 1751338668616
改对象后:
a[0] = 10
print(a,id(a))
打印
[10, 2, 3] 2337822822984
改变量后:
a = [4,5,6]
print(a,id(a))
打印
[4, 5, 6] 1384044909640
将a赋给新变量b:
a = [1,2,3]
b = a
b[0] = 10
print('a:',a,id(a))
print('b:',b,id(b))
打印
a: [10, 2, 3] 1963325084232
b: [10, 2, 3] 1963325084232
显示,a和b的值和id完全一致。
解释:
生成a时,a对应的值为id(假设为0x111)、type(class list)、value([1,2,3]),
将a赋给b时,其实只是将b指向了a对应的内存对象的内存地址,并未分配新的内存空间给b,a和b共用一个内存地址,所以a和b打印出来的结果一致。
a = [1,2,3]
b = a
b = [10,2,3]
print('a:',a,id(a))
print('b:',b,id(b))
打印
a: [1, 2, 3] 2260109775432
b: [10, 2, 3] 2260109775944
此时b和a不一致,因为b是通过列表创建重新生成的,系统会重新分配一个内存地址,所以id会不同。
三、==和is
== 和 !=:
比较的是对象的值是否相等
is和is not比较的是对象的id是否相等
a = [1,2,3]
b = [1,2,3]
print(a == b)
print(a is b)
打印
True
False
!=和is not的用法类似。
四、字典的简介
1.定义
表现形式:dict
字典是一种新的数据结构,即映射(mapping)。
字典的作用:即存储对象的容器。
列表存储数据性能很好,但是查询数据性能很差;
字典中每一个元素都有唯一的名字,通过这个名字可以快速查找到指定的元素,这个唯一的名字称为键(key),通过key可以查找到值(value),所以字典也成为键值对(key-value),每个字典可以有多个键值对,每个键值对称为一项。
字典中键和值的类型:
值可以是任意对象;
键可以是任意不可变的对象,包括int、str、bool、tuple等。
2.创建字典
(1)用{}
语法:{key1:value1,key2:value2,…}
d = {'name':'Tom','age':'20','gender':'male'}
print(d,type(d))
打印
{'name': 'Tom', 'age': '20', 'gender': 'male'} <class 'dict'>
字典的键不能重复,如有重复,则后边的会覆盖前边的。
如
d = {'name':'Tom','age':'20','gender':'male','name':'Jerry'}
print(d,type(d))
打印
{'name': 'Jerry', 'age': '20', 'gender': 'male'} <class 'dict'>
即前边的Tom被覆盖。
字典还可以跨行写,如
d = {
'name':'Tom',
'age':'20',
'gender':'male'
}
print(d,type(d))
输出与之前相同。
(2)用dict()函数
方式一:
d = dict(name = 'Tom',age=20,gender='male')
print(d)
打印
{'name': 'Tom', 'age': 20, 'gender': 'male'}
方式二:
d = dict([('name','Tom'),('age',20)])
print(d,type(d))
打印
{'name': 'Tom', 'age': 20} <class 'dict'>
解释:
dict()函数可以将一个包双值自序列转化为字典。
双值序列:即序列中只有两个值,如[3,4]、(‘name’,'hello)等。
子序列:如果序列中的元素也是序列,称这个元素为子序列,如[(1,2)]即为子学列
3.根据键来获取值
d = {
'name':'Tom',
'age':'20',
'gender':'male'
}
print(d['name'],d['age'],d['gender'])
打印
Tom 20 male
四、字典的使用
1.len()
获取字典的长度即字典中键值对的个数
d = dict([('name','Tom'),('age',20)])
print(len(d))
结果为2
2.in、not in
检查字典中是否含有或不含有指定的键
d = dict([('name','Tom'),('age',20)])
print('hello' in d)
打印
False
3.获取字典里面的值
语法:d[key]
d = dict([('name','Tom'),('age',20)])
print(d['name'])
打印
Tom
如将键赋值给一个变量,则通过变量访问时不需要引号
如
d = {'name':'Tom','age':'20','gender':'male'}
b = 'name'
print(d[b])
打印
Tom
如果键不存在会报错,即KeyError
d = {'name':'Tom','age':'20','gender':'male'}
print(d['hello'])
打印
KeyError: 'hello'
如避免异常,可以用get()方法
语法:get([,default])
根据键来获取字典中的值,也可以指定一个默认值,作为第二个参数,这样当获取不到键的时候会返回默认值。
如
d = {'name':'Tom','age':'20','gender':'male'}
print(d.get('hello','no such key'))
打印
no such key
4.修改字典
语法:d[key] = value
如果存在则覆盖,不存在则添加
d = {'name':'Tom','age':'20','gender':'male'}
d['name'] = 'Jerry'
d['phone'] = '010-11111111'
print(d)
打印
{'name': 'Jerry', 'age': '20', 'gender': 'male', 'phone': '010-11111111'}
5.setdefault()函数
可以向字典当中添加key-value
如果key已经存在于字典中,则返回key的值,不会对字典做任何操作;
如果key不存在,则向字典中添加这个key,并设置value。
key存在时,
d = {'name':'Tom','age':'20','gender':'male'}
result = d.setdefault('name','Jerry')
print(d,result)
打印
{'name': 'Tom', 'age': '20', 'gender': 'male'} Tom
key不存在时,
d = {'name':'Tom','age':'20','gender':'male'}
result = d.setdefault('phone','010-11111111')
print(d,'\n',result)
打印
{'name': 'Tom', 'age': '20', 'gender': 'male', 'phone': '010-11111111'}
010-11111111
6.update()函数
将其他字典中的key-value添加到当前的字典中
d1 = {'a':1,'b':2,'c':3}
d2 = {'d':4,'e':5,'f':6}
d1.update(d2)
print(d1)
打印
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
如存在相同的键,则覆盖
d1 = {'a':1,'b':2,'c':3}
d2 = {'b':4,'e':5,'f':6}
d1.update(d2)
print(d1)
打印
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
7.删除
方式一:del()
删除字典中的key和value
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
del d['a']
del d['b']
print(d)
打印
{'c': 3, 'e': 5, 'f': 6}
方式二:d.popitem()
随机删除字典中的一个键值对,一般情况会删除最后一个键值对。
删除之后会将key-value作为返回值,返回值为元组。
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.popitem()
print('result =',result)
print(d)
打印
result = ('f', 6)
{'a': 1, 'b': 4, 'c': 3, 'e': 5}
方式三:d.pop([,default])
根据keyshanchu字典中的键值对,返回的是被删除的value值
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('b')
print('result =',result)
print(d)
打印
result = 4
{'a': 1, 'c': 3, 'e': 5, 'f': 6}
如被删除不存在的键,则报错
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('z')
print('result =',result)
print(d)
抛出异常:KeyError: 'z'
可以通过在pop中添加第二个参数指定默认值,如果指定,当删除不存在的键时,会返回默认值。
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
result = d.pop('z','no such key')
print('result =',result)
print(d)
打印
result = no such key
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
方式四:d.clear()
用来清空字典
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d.clear()
print(d)
结果为:{}
浅复制(浅拷贝)
copy():用于将字典浅复制,即创建已有字典的副本
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d
print(d,id(d))
print(d2,id(d2))
打印
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 1997496449288
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 1997496449288
d和d2指向同一个对象。
当d中的值改变时,d2中的值也随之改变。
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d
d['a'] = 7
print(d,id(d))
print(d2,id(d2))
打印
{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2121296378120
{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2121296378120
用copy()方法:
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
print(d,id(d))
print(d2,id(d2))
打印
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 3102906251528
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 3102906251608
d和d2指向不同对象。
当d中的值改变时,d2中的值不会改变。
d = {'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
d['a'] = 7
print(d,id(d))
print(d2,id(d2))
打印
{'a': 7, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2430767003912
{'a': 1, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2430767003992
当字典的值为字典时,
d = {'a': {'name':'Tom','age':'20','gender':'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
print(d,id(d))
print(d2,id(d2))
打印
{'a': {'name': 'Tom', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2220628113672
{'a': {'name': 'Tom', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2220628114392
当d中的值的值改变时,
如
d = {'a': {'name':'Tom','age':'20','gender':'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6}
d2 = d.copy()
d['a']['name'] = 'Jerry'
print(d,id(d))
print(d2,id(d2))
打印
{'a': {'name': 'Jerry', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2104435669336
{'a': {'name': 'Jerry', 'age': '20', 'gender': 'male'}, 'b': 4, 'c': 3, 'e': 5, 'f': 6} 2104435670056
复制:即创建已有对象的副本,则原对象改变,副本应该不发生改变,这才是正常的复制。
修改d时,d中的’a’下的’name’的值也发生了改变,此即浅复制,只会复制字典本身,字典中还有字典不会被复制。
总结:浅复制只会复制字典本身,如果字典中还有字典,是不会被复制的。
七、遍历字典
1.方式一:keys()
该方法会返回字典所有的键。
d = {'name':'Tom','age':'20','gender':'male'}
for key in d.keys():
print(d[key])
打印
Tom
20
male
2.values()
返回一个序列,保存字典的值
d = {'name':'Tom','age':'20','gender':'male'}
for value in d.values():
print(value)
打印
Tom
20
male
3.items()
返回字典中所有的项,会返回一个序列,序列中包含双值子序列,双值分别为字典中的key-value。
d = {'name':'Tom','age':'20','gender':'male'}
for key,value in d.items():
print(key,'=',value)
打印
name = Tom
age = 20
gender = male