形参:定义阶段才有的形参,形式参数,没有什么用,可是具备意义,只是占个位置,方便调用。app
实参:调用阶段才有的实参,实际的参数,具备具体的值函数
在函数定义的阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名。ui
def func(x,y):#定义阶段才有的形参 print(x) print(y) print(func(1,2)) #调用阶段才有的实参 #输出: 1 2 None
在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值。code
位置形参:一个一个的写形参,就叫位置形参it
位置实参:一个一个的写形参,就叫位置实参io
位置形参和位置实参要从左到右一一对应。class
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置参数。变量
def func(x,y): print(x) print(y) print(func(1,2))
==注意:==按照位置定义的参数都必须被传值,多一个不行少一个也不行。总结
在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。
fun(1,2)
特色:按照位置为对应的形参依次传值。
在调用函数时,按照key=value的形式为指定的参数传值,称为关键之实参。
==调用的时候,能够打破位置实参必须和位置形参一一对应的传值的规定==
def func(x,y): print(x) print(y) print(func(x=1,y=2)) #输出: 1 2 None
特色:能够打破位置的限制,但仍能为指定的形参赋值。
注意:
def func(x,y): print(x) print(y) print(func(1,2)) print(func(x, y=2))# 会报错NameError: name 'x' is not defined print(func(y=2,x))#会报错SyntaxError: positional argument follows keyword argument print(func(x,x=1))#报错NameError: name 'x' is not defined #输出: 1 2 None
在定义阶段,就已经被赋值
==默认形参必须放在位置形参的后面==
def func(x,y=10): print(x) print(y) func(2) #输出: 2 10 # fun(1,2) #输出: 1 2
特色:在定义阶段就已经被赋值,意味着在调用的时候能够不用为其赋值。
注意:
m = 10 def foo(x=m): print(x) m=111 print(foo()) #输出: 10 None
默认参数的值一般应该是不可变类型
def register(name,hobby,hobby_list=[]): hobby_list.append(hobby) print(name,hobby) print(name,hobby_list) register('chen','read') register('python','zuopao') register('shui','pioa') #输出: chen read chen ['read'] python zuopao python ['read', 'zuopao'] shui pioa shui ['read', 'zuopao', 'pioa']
def register(name,hobby,hobby_list=None): if hobby_list is None: hobby_list = [] hobby_list.append(hobby) print(name,hobby) print(name,hobby_list) register('chen','read') register('python','zuopao') register('shui','pioa') #输出: chen read chen ['read'] python zuopao python ['zuopao'] shui pioa shui ['pioa']
实参的应用:取决于我的的习惯
形参的做用: