首页 > 技术文章 > 函数的参数

Mr-shen 2019-11-09 19:47 原文

函数的参数

1、参数的类型

函数的参数分为形参和实参

1、形参

定义函数时括号内声明的参数,本质是一个变量名,用来接收外部传来的参数

2、实参

调用函数时括号内传入的值,值可以是常量、变量、表达式或三种的组合

def index(a):  # 形参:相当于变量名
    print(a)
    print(b)
    if a > b:
        print(a)
    else:
        print(b)
b = 2
a = 1
index(a)  # 实参:相当于变量值

2、传参方式

1、位置参数 positional arguments

调用函数时通过位置传入的实参与形参一一对应

def index(a,b):
    if a>b:
        return a
    else:
        return b
index(1,3)# 按照位置顺序向形参中传参

2、关键字参数

1、调用函数时按照key=value形式指定实参可以不按顺序传参

2、关键字参数与位置参数混用时,位置参数一定要在前

3、并且不可以对同一个形参重复赋值

def res(a,b,c,d):
    print(a,b,c,d)
res(1,2,d=3,c=4)#混用关键字参数与位置参数,位置参数在前,关键字参数在后指定参数传参

3、默认参数

在定义函数时已经为形参进行赋值,需要经常改变的参数定义成位置参数,很少改变的定义成默认参数

1、默认参数必须在位置参数之后

2、默认参数仅在定义阶段赋值一次

def res(a, b, c, d=5):
    print(a, b, c, d)
d = 8# 在定义时已经被赋值一次,此处修改无效
res(1, 2, c=3)#默认参数可以在实参中不写直接调用
res(1, 2, c=3,d=8)# 如果修改默认参数在调用时修改

3、默认参数通常设为不可变类型

如果设置成可变类型,则每次调用都是在上次调用的基础上加值

def res(a, b, c, d=[]):
    d.append(c)
    print(a, b, c, d)
res(1, 2, c=3)
res(1, 2, c=3)
res(1, 2, c=3)
>>>
1 2 3 [3]
1 2 3 [3, 3]
1 2 3 [3, 3, 3]

可以修改如下:

# 第一种解决方案
def res(a, b, c, d=None):
    if d == None:# 如果是None则定义一个空列表
        d=[]
    d.append(c)
    print(a, b, c, d)
res(1, 2, c=3)
res(1, 2, c=4)
res(1, 2, c=5)

# 第二种解决方案
def res(a, b, c, d):
    d.append(c)
    print(a, b, c, d)
res(1, 2, 3,d=[])
res(1, 2, 4,[])
res(1, 2, 5,[])

4、可变长参数

调用函数时,实参的个数不固定,而实参传参有位置参数和关键字参数,所有有两种解决方案

1、位置参数*args,在定义阶段形参最后一个参数args前加个星号,可以接受所有实参中的溢出的位置参数,默认以元组的形式保存下来

  • 官方认证为*args,但是只要有星号后面是什么参数都有可变长类型的效果

  • *是打散传入的容器类型,如果不打星号就默认转换溢出的参数形成元组

def res(a, b, c,*args):
    print(a, b, c,args)
res(1, 2, 3,4,5,6,7,8)
>>>
1 2 3 (4, 5, 6, 7, 8)
def res(a, b, c,*args):
    print(a, b, c,*args)# 将输入的参数本来转换成元组的,打散
res(1, 2, 3,4,5,6,7,8)
>>>
1 2 3 4 5 6 7 8

2、关键字参数**kwargs,在定义阶段最后一个形参用,将调用时所有溢出的关键字参数转换为字典{关键字:参数}赋值给形参

官方认证为**kwargs,但是只要有星号后面是什么参数都有可变长类型的效果

def res(a, b, c, **kwargs):# 将调用时溢出的关键字参数转换成字典
    print(a, b, c, kwargs)


res(1, 2, 3, d=1, f=4, e=7)
>>>
1 2 3 {'d': 1, 'f': 4, 'e': 7}

def res(a, b, c, **kwargs):
    print(a, b, c, *kwargs)# 一个*是打散字典拿到key值,打散字典只能是一个*


res(1, 2, 3, d=1, f=4, e=7)
>>>
1 2 3 d f e

5、命名关键字参数

1、在位置可变长参数和关键字可变长参之间

2、在调用阶段,一定要以关键字参数的形式传值

3、关键字参数一定要在位置参数后面

def index(a,b,c=1,*args,d,**kwargs):
    print(a,b,c,args,d,kwargs)
index(1,2,3,4,5,6,d=2,f=4,g=8)
>>>
# 1 2 3 (4, 5, 6) 2 {'f': 4, 'g': 8}

6、组合使用

必须按照定义顺序:位置参数,关键字参数,*args,命名关键字参数,**kwargs

推荐阅读