夜光序言:
对自己承诺:我要强大到任何事情都无法破坏我内心的平和……
正文:
4.6 字典与函数
4.6.1 目标
Python 的数据类型是非常灵活的,字典是非常常用的一种类型,字典可以作为函数参数,函数也可以返回一个字典。
目标是设计一个程序存储省份与其所辖城市的信息,实现查询功能,掌握字典再函数中的应用。
4.6.2 字典与函数
1、字段作为函数参数
字典作为函数参数,如果在函数中改变了字典,那么调用处的字典也同时被改变!也就是说调用处的实际参数与函数的形式参数是同一个变量, 这一点与普通的整数、浮点数、字符串变量不同。
例 4-6-1:字典作为函数参数
def fun(dict):
dict["name"]="aaa"
print("inside:",dict)
dict={"name":"xxx","age":30};
print("before",dict)
fun(dict)
print("after",dict);
结果:
before {'name': 'xxx', 'age': 30}
inside: {'name': 'aaa', 'age': 30}
after {'name': 'aaa', 'age': 30}
由此可见,dict 在函数中变化后,在主程序中也变化了。
2、函数返回字典
字典可以作为函数返回值返回。
例 4-6-2:字典作为函数返回值
def fun():
dict={}
dict["name"]="aaa"
dict["age"]=20
dict["gender"]="male"
return dict
def show(dict):
keys=dict.keys()
for key in keys:
print(key,dict[key])
dict=fun()
print(dict)
show(dict)
结果:
{'name': 'aaa', 'age': 20, 'gender': 'male'}
name aaa
age 20
gender male
4.6.3 字典与字典参数
Python 中除了用"*"表示的元组可变参数外,还有一种是"**"表示的字典可变参数,一般标识为**kargs,这种 kargs 在函数中是一个字典,在调用时实际参数按 key=value 的键值对方式提供参数。
例 4-6-3:具有字典可变参数的函数
def fun(x,y=2,**kargs):
print(x,y)
print(kargs)
fun(1,2)
fun(1,2,z=3)
fun(1,2,a=3,b="demo")
fun(x=1,y=2,z=3)
fun(y=1,x=2,z=5,s="demo")
fun(x=1,z=3)
结果:
1 2
{}
1 2
{'z': 3}
1 2
{'a': 3, 'b': 'demo'}
1 2
{'z': 3}
2 1
{'z': 5, 's': 'demo'}
1 2
{'z': 3}
由此可见在调用时 fun(1,2,a=3,b="demo")使得 kargs={'a': 3, 'b': 'demo'}变成一个字典。
注意如果函数有*args 及**kargs 参数同时存在,那么*args 必须放在**kargs 参数前面,即函数最后两个参数是*args,**kargs。
例 4-6-4:具有元组可变参数与字典可变参数的函数
def fun(x,y=2,*args,**kargs):
print(x,y)
print(args)
print(kargs)
fun(1,2)
fun(1,2,3,4)
fun(1,2,3,4,z=5,s="demo")
结果:
1 2
()
{}
1 2
(3, 4)
{}
1 2
(3, 4)
{'z': 5, 's': 'demo'}
由于*args 的参数时位置参数,因此有*args 出现时,*args 前面的函数参数在调用时不能
以关键字参数的方式出现,只能以位置参数的方式出现,例如下列是错误的调用:
fun(x=1,y=2,3,4)
4.6.4 【案例】字典存储省份与城市
1、案例描述
设计一个程序存储省份与其所辖城市的信息,实现查询功能。
2、案例分析
设计字典 provinces 如下:
provinces={"广东":["广州","深圳"],"四川":["成都", "内江", "乐山"]}
字典 provinces 的 keys 是各个省的名称,一个省的值时一个列表,是它下辖的各个城市。
3、案例代码
#provinces 是全局的变量
provinces={}
def append(province,cities):
global provinces
if province not in provinces.keys():
provinces[province]=cities
else:
print(province+"已经存在")
def show():
for p in provinces.keys():
print(p,provinces[p])
def seekProvince(province):
if province in provinces.keys():
print(province,end=":")
for c in provinces[province]:
print(c,end=" ")
print()
else:
print("没有这个省份")
def seekCity(city):
for p in provinces.keys():
if city in provinces[p]:
print(city+"属于"+p+"省")
return
print("没有这个城市")
append("广东",["广州","深圳"])
append("四川",["成都", "内江", "乐山"])
append("贵州",["贵阳","六盘水","兴义"])
show()
seekProvince("四川")
seekCity("六盘水")
程序结果:
广东 ['广州', '深圳']
四川 ['成都', '内江', '乐山']
贵州 ['贵阳', '六盘水', '兴义']
四川:成都 内江 乐山
六盘水属于贵州省