函数的参数分为形参和实参python
定义函数时括号内声明的参数,本质是一个变量名,用来接收外部传来的参数app
调用函数时括号内传入的值,值能够是常量、变量、表达式或三种的组合函数
def index(a): # 形参:至关于变量名 print(a) print(b) if a > b: print(a) else: print(b) b = 2 a = 1 index(a) # 实参:至关于变量值
调用函数时经过位置传入的实参与形参一一对应code
def index(a,b): if a>b: return a else: return b index(1,3)# 按照位置顺序向形参中传参
一、调用函数时按照key=value形式指定实参能够不按顺序传参it
二、关键字参数与位置参数混用时,位置参数必定要在前io
三、而且不能够对同一个形参重复赋值class
def res(a,b,c,d): print(a,b,c,d) res(1,2,d=3,c=4)#混用关键字参数与位置参数,位置参数在前,关键字参数在后指定参数传参
在定义函数时已经为形参进行赋值,须要常常改变的参数定义成位置参数,不多改变的定义成默认参数容器
一、默认参数必须在位置参数以后基础
二、默认参数仅在定义阶段赋值一次变量
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)# 若是修改默认参数在调用时修改
三、默认参数一般设为不可变类型
若是设置成可变类型,则每次调用都是在上次调用的基础上加值
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,[])
调用函数时,实参的个数不固定,而实参传参有位置参数和关键字参数,全部有两种解决方案
一、位置参数*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
二、关键字参数**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
一、在位置可变长参数和关键字可变长参之间
二、在调用阶段,必定要以关键字参数的形式传值
三、关键字参数必定要在位置参数后面
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}
必须按照定义顺序:位置参数,关键字参数,*args,命名关键字参数,**kwargs