函数参数值可以是任何数据类型,自然也包括序列(元组、列表、字典等)。不过现在讲的并不是直接将序列作为单个的参数值传入函数,而是将序列中的每个元素单独作为函数的参数值,相当于把序列拆开进行传值。现在先看看下面的代码。
def printparams(s1,s2):
print(s1,s2)
printparams('hello','world')
list = ['hello','world']
# 将列表或元组中的元素作为当参数值传递为printparams函数,需要在实参前面加星号(*)
printparams(*list)
输出结果:
hello world
hello world
从上面的代码可以看出,如果想要将列表中的元素作为单个参数值传给函数,需要在列表前面加星号(*)
。
在上面的代码中,printparams函数并未使用可变参数,如果使用可变参数,也可以通过列表或元组参数传值。
def printparams(*ss):
for s in ss:
print('<{}>'.format(s),end = ' ')
list = ['hello','world']
printparams(*list)
print()
# 将字符串作为一个序列传入printparams函数
printparams(*'abcdefg')
print()
printparams(*[1,2,3,4,5,6])
print()
输出结果:
<1> <2> <3> <4> <5> <6>
从上面的代码看出,不仅可以将列表变量前面加星号后传入printparams函数,而且也可以将列表值前面加星号传入printparams函数。如果要传递前面加星号的字符串,那么也会将字符串看作字符的序列进行拆分。
不仅元组和列表可以被拆分后传入函数,字典也可以这么做。
def printparams(**ss):
for item in ss.items():
print('{} = {}'.format(item[0],item[1]))
dict = {'a':40,'b':50,'c':60}
# 将字典中的元素作为单个参数传入函数时,要使用两个星号(**)
printparams(**dict)
printparams(**{'name':'小黑','age':18})
输出结果:
a = 40
b = 50
c = 60
name = 小黑
age = 18
在传递参数时,字典和列表(元组)的区别是字典前面需要加两个星号(定义函数余调用函数都需要加两个星号),而列表(元组)前面只需要加一个星号。可能很多人注意到,在printparams函数中使用字典的方式与不加两个星号的方式完全相同,所以printparams函数可以写成下面的形式。
def printparams(ss):
for item in ss.items():
print('{} = {}'.format(item[0],item[1]))
dict = {'a':40,'b':50,'c':60}
printparams(dict)
printparams({'name':'小黑','age':18})
输出结果:
a = 40
b = 50
c = 60
name = 小黑
age = 18
可以看到,输出的结果完全相同。
[例 7.6] 本例通过add1、add2、add3和add4四个函数对如何使用列表和字典中单个元素作为函数参数传递进行了完整的演示。
def add1(x,y,z):
return x + y + z
print(add1(1,2,3))
# 输出结果:
list = [2,3,4] # 定义一个列表,也可以使用元组
# 将list中的2,3,4拆分,作为单独的参数值传入add1函数,输出结果:
print(add1(*list))
dict = {'x':100,'y':200,'z':12}
# 将字典中的x、y和z拆分成名为x、y、z的3个形参,然后传入函数,输出结果:
print(add1(**dict))
# 用可变参数定义函数
def add2(*numbers):
result = 0
for number in numbers:
result += number
return result
print(add2(1,2,3,4,5))
# 使用星号同样可以拆分列表,并将单个元素作为参数传入add2的可变参数中
print(add2(*list))
# 定义add3函数时,numbers参数前使用两个星号,表示这个参数值接收字典类型数据
def add3(**numbers):
result = 0
for item in numbers.items():
# 将numbers字典中的所有value相加
result += item[1]
return result
# 将字典dict中的元素作为单独的参数传入了add3函数
print(add3(**dict))
# 定义一个只拥有普通形参的add4函数
def add4(numbers):
result = 0
for item in numbers.items():
result += item[1]
return result
# 如果在定义函数时不加双型,那么在调用时也不需要加
print(add4(dict))
输出结果:
6
9
312
15
9
312
312