[Python基础]Python中的参数
在调用函数时,通常会传递参数,函数内部的代码保持不变,针对不同的参数处理不同的数据
一、形参与实参
介绍
- 形参:定义函数时的参数变量
- 实参:调用函数时的参数变量
即:参数传递的过程,就是 把实参的引用 传递给 形参 ,使用实参的值来执行函数体的过程。
示例
def sum(num1, num2): # num1和num2就是形式参数,即形参
print(num1 + num2)
sum(1, 2) # 1和2就是实际参数,即实参
二、关键字参数
介绍
在定义好一个函数后,如果不想按照定义的形参顺序进行传递实参,或者说函数定义的形参太多,再进行顺序传递时容易搞乱顺序时,可以采用关键字传参
示例
def sum(num1, num2):
print(num1) # 1
print(num2) # 2
sum(num2=2, num1=1)
需要注意的是,如果使用了关键字参数,那么位置参数必须在关键字参数前面,否则就会报错,如:
def sum(num1, num2):
print(num1)
print(num2)
sum(num2=2, 1)
"""
sum(num2=2, 1)
^
SyntaxError: positional argument follows keyword argument
"""
三、缺省参数(默认参数)
介绍
在定义一个函数时,可以给这个函数的形参一个默认值,那么这个参数就是缺省参数,也叫默认参数
- 调用函数时,如果给缺省参数传值,那么缺省参数将使用传递的值,如果没有给缺省参数传值,那么缺省参数会使用默认值
示例
def sum(num1, num2=5):
print(num1) # 1
print(num2) # 2
sum(1, 2)
def sum(num1, num2=5):
print(num1) # 1
print(num2) # 5
sum(1)
需要注意的是,和关键字参数一样,如果使用了缺省参数,那么位置参数必须在缺省参数前面,否则就会报错,如:
def sum(num1, num2=5):
print(num1)
print(num2)
sum(num2=1, 1)
"""
sum(num2=1, 1)
^
SyntaxError: positional argument follows keyword argument
"""
四、收集参数(可变参数)
介绍
Python中接收可变参数有两种形式:
- 接收
元组
:形参前定义加一个*
- 接收
字典
:形参前定义加两个*
一般在给多值参数命名时,习惯使用以下两个名字
- *args:存放
元组
参数 - **kwargs:存放
字典
参数(kw即keyword,kwargs即键值对参数
)
示例
首先是直接在调用函数时直接在实参位置传递多个参数,此时:
- 如果函数定义的形参前有一个
*
,即是接收多个参数为元组 - 如果函数定义的形参前右两个
*
,即是接收多个键值对参数为字典
def test1(*args):
print("有%d个参数" % len(args))
print(args, type(args))
def test2(**kwargs):
print("有%d个参数" % len(kwargs))
print(kwargs, type(kwargs))
test1(1, 2, 3, 4, 5, 6)
"""
有6个参数
(1, 2, 3, 4, 5, 6) <class 'tuple'>
"""
test2(key1=1, key2=2, key3=3, key4=4, key5=5, key6=6)
"""
有6个参数
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5, 'key6': 6} <class 'dict'>
"""
一般不建议使用这种直接将参数一个个当做实参传递的方式,而是定义好实参参数后再传递,如:
def test1(*args):
print("有%d个参数" % len(args))
print(args, type(args))
def test2(**kwargs):
print("有%d个参数" % len(kwargs))
print(kwargs, type(kwargs))
args = 1, 2, 3, 4, 5
test1(*args)
"""
有5个参数
(1, 2, 3, 4, 5) <class 'tuple'>
"""
kwargs = {
'key1': 1,
'key2': 2,
'key3': 3,
'key4': 4,
'key5': 5
}
test2(**kwargs)
"""
有5个参数
{'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4, 'key5': 5} <class 'dict'>
"""
通过这种方式先定义好参数后再通过实参的方式进行传递时,需要注意:
- 如果传递的不是键值对类型,即传递的是元组类型,需要在传递实参时在前面加一个
*
,如上述例子中test1(*args)的*args
- 如果传递的是键值对类型,即传递的是字典类型,需要在传递实参时在前面加两个
**
,如上述例子中的test2(**kwargs)的**kwargs
五、打包与解包
介绍
上述可变参数中出现的*
的含义就是打包或者解包的含义:
*
出现在形参中,即是打包的含义,就是将传递过来的参数打包成一个可变参数*
出现在实参中,即是解包的含义,就是将封装好的参数解包成一个个单个参数
实例
args = 1, 2, 3, 4, 5
print(args) # (1, 2, 3, 4, 5)
print(*args) # 1 2 3 4 5