1. 函数的使用原则
储备知识:
函数的使用应该分为两个明确的阶段:
1定义阶段:只检测语法,不执行函数体代码、
def fun():
print(‘from func’)
2调用阶段:会触发函数体代码的执行
先定义后调用
示范一
def foo():
print(‘from foo’)
bar
foo()
示范二
def bar ():
print(‘from bar’)
def foo():
print(‘from foo’)
foo()
示范三
def foo():
print(‘from foo‘)
bar()
def foo():
print(’from bar‘)
foo()
示范四
def foo():
print(’from foo’)
bar()
foo()
def bar():
print(‘from bar’)
*************************************************************************************************************
2. 函数的返回值
return 值:
注意点:
1,函数的返回值没用类型限制
2,函数的返回值没有个数限制
2.1 返回多个值:多个返回值用逗号分隔开,返回的是元组形式
def func():
print('from func')
return 1,1,1,'hello',[1,2,3]
res =func()
print(res,type(res))
2.2返回1个值:返回的就是该值本身
def func():
return 123
res =func()
print(res,type(res))
2.3 返回0个值或者干脆没用retunrn:返回None
def func():
retunrn
pass
res=func()
print(res)
return 除了有多个返回值的功能,还有结束函数执行的功能
函数内可以有多个return,但只要执行一次,整个函数就立即结束
def func():
print(1)
return
print(2)
return
print(3)
func()
************************************************************************************************************************
3 函数参数的使用
细分:
1.位置参数:
1.1位置参数:在定义阶段,按照从左到右的顺序依次定义的的形参称之为位置形参
特点:但凡按照位置定义的形参,必须被传值,多一个不行,少一个也不行
def func(‘x,y,z’):
print(‘x,y,z’)
func(1,2) 错,少了一个
func(1,2,3) 对
func(1,2,3,4) 错,多了一个
1.2位置实参:在调用阶段,按照从左到右的顺序依次传入的值称之为位置实参
特点:
1.与形参一一对应
def func(x,y,z):
print(x,y,z)
func(2,1,3,)
2.关键字实参:在调用阶段,按照key:value的形式定义的实参称之为关键字实参
特点:可以完全打乱顺序,但是仍然能为指定的形参传值(总结:指名道姓地为指定形参传值)
def func(x,y,z):
print(x,y,z)
func(x=1,y=2,z=3)
fun(1,2,3)
func(z=3,y=2,x=1)
实参的形式可以是位置实参与关键字实参混合使用,但是必须循序原则:
1.位置实参必须放在关键字实参的前面
2.不能对同一个形参重复传值
func(1,z=3,y=2)
func(z=3,1,y=2) #错误
func(1,z=3,x=2,y=3) #错误
*************************************************************************************************
1 可变长参数: 2 可变长指的是实参值的个数不固定 3 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs 4 5 ===========*args=========== 6 def foo(x,y,*args): 7 print(x,y) 8 print(args) 9 foo(1,2,3,4,5) 10 11 def foo(x,y,*args): 12 print(x,y) 13 print(args) 14 foo(1,2,*[3,4,5]) 15 16 17 def foo(x,y,z): 18 print(x,y,z) 19 foo(*[1,2,3]) 20 21 ===========**kwargs=========== 22 def foo(x,y,**kwargs): 23 print(x,y) 24 print(kwargs) 25 foo(1,y=2,a=1,b=2,c=3) 26 27 def foo(x,y,**kwargs): 28 print(x,y) 29 print(kwargs) 30 foo(1,y=2,**{'a':1,'b':2,'c':3}) 31 32 33 def foo(x,y,z): 34 print(x,y,z) 35 foo(**{'z':1,'x':2,'y':3}) 36 37 ===========*args+**kwargs=========== 38 39 def foo(x,y): 40 print(x,y) 41 42 def wrapper(*args,**kwargs): 43 print('====>') 44 foo(*args,**kwargs) 45 46 #5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递 47 可以保证,传入的参数中一定包含某些关键字 48 def foo(x,y,*args,a=1,b,**kwargs): 49 print(x,y) 50 print(args) 51 print(a) 52 print(b) 53 print(kwargs) 54 55 foo(1,2,3,4,5,b=3,c=4,d=5) 56 结果: 57 2 58 (3, 4, 5) 59 3 60 {'c': 4, 'd': 5}