python函数进阶与参数处理
可变参数
可变参数也称为不定长参数
传入函数中实际参数可以是任意多个
常见形式
*args
**kwargs
*args
接收任意多个实际参数,并将其放到一个元组中
使用已经存在的列表或元组作为函数的可变参数,可以在列表的名称前加*
例子1:
# *args 可以接受任意多个实际参数,并将其放到一个元祖当中
def print_language(*args): # 定义一个函数,希望传进来的都可以被接收,用*args
print(args) # 函数体这里把接收到的参数打印出来,看看是什么
# 调用函数,把不同数量的函数传递进去,用位置参数
print_language("python", "java") # 调用函数,把不同的参数传递进去
print_language("python", "java", "php", "go") # 第二次调用函数,把不同的参数传递进去
打印后
打印后,前面传递进去的参数都被放在一个元祖中,想要把元祖中的参数拿出来分别做处理的话,可以给我们元祖做一个for循环。这样就可以每一个参数都做处理。见例子2.
例子2:
def print_language(*args):
print(args)
for i in args: # 加了for循环,把元祖中的参数拿出来分别做处理。
print(i)
print_language("python", "java", "php", "go")
打印后
这样可以每一个参数拿出来做处理。
例子3:想要通过已经存在的列表或者元祖来作为函数的可变参数的话也是可以的。
先看例子:
def print_language(*args):
print(args)
for i in args:
print(i)
params = ["python", "java", "php", "go"]
print_language(params) # 不带星*
打印
这样是传递进去了,但是这整个列表它是作为了一个元素传递了进去。而我们希望列表当中的单个元素都能够当做一个参数传递进去。这是要注意,传参的时候在列表前面加上*号,加上去相当于做了一个
解包的操作。再来执行以下:
def print_language(*args):
print(args)
for i in args:
print(i)
lan = ["python", "java", "php", "go"] # 列表
print_language(*lan) # 传参时候,列表前面加了*号,相当于解包的操作
打印:
这样就把列表中的每一个元素当做是一个参数传递进来。这些参数又被放到一个元祖当中,这就是调用的一个方式。
总结来看:参数定义的时候,星号*收集了所有的位置参数,并且把它放到一个元祖当中,arg就是一个元祖,这是一个打包的过程。在函数调用的过程当中,星号*可以把我们的列表、元祖把它解包成不同的参数传递进来。
其中:例子3这种方式=====例子2这种方式(两种方式是等价的结果)
**kwargs
接收任意多个类似关键字参数一样显式赋值的实际参数,并将其放到一个字典中
使用已经存在字典作为函数的可变参数,可以在字典的名称前加**
例子1:
def print_info(**kwargs):
print(kwargs)
print_info(Tom=18, Jim=20) # 调用函数
print_info(Tom=18, Jim=20, Lily=12) # 调用函数
打印
调用两次,分别传入不同参数。这时打印出两个字典,关键字传参即:key=values的这种形式,都会被存放到一个字典当中去。同样的话,对传入进来的参数另外做处理的话。可以做一个循环,把里面的key或者values拿出来做对应的处理即可。
在定义函数的时候,两个**号实现了打包的过程,把key=values打包成一个字典。
同样的话,我们也可直接用一个字典来作为函数的一个可变参数的传入的值:
def print_info(**kwargs):
print(kwargs)
params = {'Tom':18, 'Jim':20, 'Lily':12}
print_info(**params)
返回:
17:35:49