函数基本使用
回顾
1.函数的使用原则:先定义,定义只检测语法,后调用,
def foo(x,y):
print(x)
print(y)
return 123
foo(1,2)
类型提示(Type hinting)
def foo(x:'描述信息',y:'描述信息')->'返回值是整型':
只有函数体后加括号才能运行
定义函数三种格式
无参
def foo():
pass
有参
def bar(x,y):
pass
空参
def spam():
pass
函数返回值
def foo():
return 123,'xx',[1,2,3]
a,b,c=foo()
print(a,b,c) # 123 xx [1,2,3]
调用函数的三种格式
def foo():
return 123
foo()
res = foo()*10
print(foo())
函数参数
形参:函数定义阶段,括号内指定的参数(变量名)
实参:函数调用阶段,括号内传入的值(变量值)
二者关系:
在函数调用时,会将实参值绑定给形参名
函数调用完毕后则解除绑定
位置形参
在函数定义阶段,按照从左到右的顺序依次定义的形参
特点:必须被传值
def foo(x,y,z):
print(x,y,z)
foo(1,2,3)
位置实参
在函数调用阶段,从左到右的顺序依次传入的值
def foo(x,y,z):
print(x,y,z)
foo(1,2,3)
foo(3,2,1)
关键字实参
在函数调用阶段,按照key=value的格式来传值
特点:可以打乱顺序,仍可以为指定的形参赋值
def foo(x,y,z):
print(x,y,z)
foo(x=1,y=2,z=3)
foo(1,2,z=3)
默认形参
在函数定义阶段,已经为形参赋值
特点:定义阶段已经有值,意味着在调用阶段可以不用为其传值
def foo(x,y=111)
print(x)
print(y)
foo(111)
foo(111,3333)
def register(name,age,gender='male'):
print(name)
print(age)
print(gender)
register('egon',18)
register('jack',19)
register('tom',20)
register('lili',21,'female')
注意:
1.可以混用位置形参与关键字形参,但是位置形参需在默认形参前面
2.默认形参的值推荐不可变类型
3.默认形参的值只在函数定义阶段被赋值一次
例1
m = 100
def foo(x,y=m):
print(x,y)
m=200
foo(1) # 1 100
例2
m = [111,222,333]
def foo(x,y=m):
print(x,y)
m.append(666)
foo(1) # 1 [111,222,333,666]
例3
def register(name,hobby,hobbies=None):
if hobbies is None:
hobbies = []
hobbies.append(hobby)
print('%s的爱好%s' % (name,hobbies))
register('egon','read')
register('tom','music')
register('jack','drink')
可变长参数:*与**
在形参中带*:*会将溢出的 位置实参值 汇总成元组,然后赋值给紧跟其后的形参名
def foo(x,*y): # y =(2,3,4)
print(x,y)
foo(1,2,3,4)
在形参中带**:**会将溢出的 关键字实参值 汇总成字典,然后赋值给紧跟其后的形参名
def foo(x,**y): # y={'a':11,'c':33,'b':22}
print(x,y)
foo(1,a=11,b=22,c=33)
在实参中带*
def foo(x,y,z):
print(x,y,z)
foo(*[11,22,33]) # foo(11,22,33)
在实参中带**
def foo(x,y,z):
print(x,y,z)
foo(**{'x':1,'z':3,'y':2}) # foo(y=2,z=3,x=1)
重点:
def index(a,b,c):
print(a,b,c)
def wrapper(*args,**kwargs):
index(*args,**kwargs)
wrapper(1,c=3,b=2)
命名关键字参数
def foo(x,y,*args,m=666,n):
print(x,y)
print(m,n)
foo(1,2,m=777,n=888)