形式参数和实际参数
#形参:在函数定义的参数 称为形式参数,相当于变量名
def func(x,y):print(x,y)
#实参:调用函数阶段传入的值,相当于变量值
func(1,2)
#1.调用阶段 实参(变量值)会绑定给形参(变量名)
#2.绑定管子只能在函数体内使用
#3.调用时生效 调用结束后结束绑定关系#实参相当于传入的值,值可以是
#形式一
func(1,2)
#形式二
a=1
b=2
func(1,2)
#形式三
func(int('1'),2)
func(func(1,2),func(2,3))
1 2
1 2
1 2
1 2
1 2
2 3
None None
形参实参的具体使用
1.位置参数:按照从左到右顺粗定义的参数称之为位置参数
位置形参:按照从左到用的顺序定义的变量名
特点:必须被传值 !! 多一个不行少一个也不行
位置实参:从左到右有顺粗依次传入的值
特点:必须按照顺序与形参一一对应
def func(x,y):print(x,y)
func(1,2)
func(2,1)
1 2
2 1
1 3
关键词参数
关键字实参:函数调用阶段 按照key=value的形式传入的值
特点:可以完全不参照顺序 指名道姓的赋值
def func(x,y):print(x,y)
func(y=3,x=1)
1 3
位置实参和关键字实参混合使用
- 位置实参必须放在关键字实参前
- 不能为同一个形参重复传值
def func(x,y):print(x,y)
func(1,y=2)
#以下报错
#func(y=2,1)
# func(1,2 x=3,y=1)
默认参数
默认形参:在定义函数阶段就已经被赋值的形参,称之为默认参数
特点:在调用阶段可以不用为其赋值
def func(x,y=3):print(x,y)
func(x=1)
func(x=1,y=444)def register(name,age=18,gender='male'):print(name,age,gender)
register('momo',19,'male')
1 3
1 444
momo 19 male
位置形参与默认形参的昏庸
- 位置形参必须在默认形参左边
- 默认参数最开始的值实在函数定义阶段被赋值的 被赋予的是值的内存地址
- 虽然默认值可以被指定为任意数据类型,但是不推荐使用可变类型
函数定义理想状态 函数调用只和函数本身有关系 不受外部代码的影响
# #报错
# def func(x=2,y):
# pass
def func (y,x=3):pass
#示范一
m=2
def func(x,y=m):#y=>2的内存地址print(x,y)
m=333333
func(1)
#示范二
m=[11111,]
def func(x,y=m):#y=>m的内存地址print(x,y)
m.append(333333)
func(1)
#默认参数不定义为可变类型,在函数内判断定义
def func(x,y,z,l=None):if l is None:l=[]l.append(x)l.append(y)l.append(z)print(l)
func(1,2,3)
new_l=[111,222]
func(1,2,3,new_l)
1 2
1 [11111, 333333]
[1, 2, 3]
[111, 222, 1, 2, 3]
可变长度参数
在调用函数时,传入的值(实参)的个数不确定
而 实参是用来对形参赋值的,所以对应着,针对溢出的实参,必须有对应的形参来接收
#I:I:用来接收溢出的位置实参 溢出的实参会被*保存成元组然后赋值给其后的内容
#规范 定义为*args
def func(x,y,*z):print(x,y,z)
func(1,2,3,4,5)
#案例 求和
def mysum(*args):res=0for item in args:res+=itemreturn res
print(mysum(1,2,3,4,5,6))
#用来接收溢出的关键字实参 **形参名 会将溢出的关键字实参保存成字典格式,然后赋值给其后的形参
def func(x,y,**kargs):print(x,y,kargs)
func(1,2,a=3,b=4,c=5)
1 2 (3, 4, 5)
21
1 2 {'a': 3, 'b': 4, 'c': 5}
#II:*用在实参中 实参中带*先将*后的值打散成位置实参
def func(x,y,z):print(x,y,z)
func(*[11,22,33])#func(11,22,33)
#func(*[11,22]) 缺少或多值会报错
#**
func(*{'x':1,'y':2,'z':3})
func(**{'x':1,'y':2,'z':3})#不可以多或少参数
11 22 33
x y z
1 2 3
#III:形参和实参都带*
def func(x,y,*args):print(x,y,args)
func(1,2,[3,4,5,6])
func(1,2,*[3,4,5,6])#=func(1,2,3,4,5,6)
func(*'hello')
#**
def func(x,y,**kargs):print(x,y,kargs)
func(**{'y':222,'x':111,'a':333,'b':444})
1 2 ([3, 4, 5, 6],)
1 2 (3, 4, 5, 6)
h e ('l', 'l', 'o')
111 222 {'a': 333, 'b': 444}
混用*和**
*args必须在**kargs之前
def func(*args,**kargs):print(args)print(kargs)
func(1,2,3,x=4,y=5)def index(x,y,z):print('index....',x,y,z)
def wrapper(*args,**kargs ):print(args,kargs)#打包成元组index(*args,**kargs)#分散成 位置参数 和 关键字参数 传入
wrapper(1,2,z=3)#为wrapper传的参数实际上是给index用的
(1, 2, 3)
{'x': 4, 'y': 5}
(1, 2) {'z': 3}
index.... 1 2 3