def foo(x,y): print(x) print(y)
在实参的角度:
第一种,按照位置传值
fool(1,2)
fool(2,1) #位置不一样,结果也不一样
第二种,按关键字传值
foo(x=1,y=2) foo(y=2,x=1) #明确指明,x的位置
第三种,混着用
foo(1,y=2)
#安位置传值,必须在按关键字传值的前面,否则会报错
问题二:对于一个形参,不能重复赋值。否则报错,例如
foo(1,x=1,y=2)
从形参的角度来分析
#位置参数:1, 必须传值。指的就是形参
2, 一一对应。多一个少一个都不行。
def foo(x,y): print(x) print(y) #从左到右,一一对应,一个个位置来
默认参数: 定义阶段,就传值,默认一个值
def foo(x,y=1) print(x) print(y) foo(1) foo(1,2)
foo(y=2,x=2)
什么时候用默认参数?必须要注意的问题:定义时赋值,默认参数必须放到位置参数的后面
定义阶段,只检测语法,只要语法没有任何错误,就不会报错。
调用阶段,会报错。
1,调用时无需传值,比较方便
2,把变化比较小的参数,定义为默认参数
3,默认参数,在函数定义阶段,就已经确定下来
x=‘male‘
def register(sex=x):
print(sex)
x=None
register()
#还是定义阶段的male,推荐
x=[]
def register(name,name_list=x):
name_list.append(name)
register(‘333‘)
register(‘111‘)
register(‘222‘)
print(x)
#这种模式不推荐
什么时候用,未知参数?
1,经常发生变化的,用未知参数