day22
1.函数的基本使用
1.函数的使用原则:先定义,后调用
2.定义函数的三种格式:
def foo(): #无参函数
print('hello')
def foo(x,y): #有参函数
res = x + y
def spam(): #空函数
pass
3.函数的返回值
def foo():
return 123
4.调用函数的三种格式
def foo():
return 123
foo() #直接调用
res = f00() * 10
print(res) #表达式的形式
print(foo()) #函数中调用其他函数
# 2.函数的参数
形参:函数定义阶段,括号内指定的参数(变量名)
实参:函数调用阶段,括号内传入的值(变量值)
关系:在函数调用时,会将实参值绑定给形参名,函数调用完毕后则解除绑定
#一 位置形参:
在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参
特点:必须被传值
#二 位置实参:
在函数调用阶段,按照左到右的顺序依次传入的值,称之为位置实参
特点:按照顺序依次为形参赋值
#三 关键字实参
在函数调用阶段,按照key=value的格式来传值,称之为关键字实参
特点:可以打乱顺序,但仍能为指定的形参赋值
注意:可以混用位置实参与关键字实参,但是
1 位置实参必须跟在关键字实参前面
2 不能为同一个形参重复赋值
#四 默认形参
在函数定义阶段,就已经为形参赋值,称之为默认形参
特点: 定义阶段就已经有值了,意味着在调用阶段可以不用为其传值
注意:
1 可以混用位置形参与关键字形参,但是位置形参必须跟在默认形参的前面
2 默认形参的值推荐指向不可变类型
3 默认形参的值只在函数定义阶段被赋值一次
#五 可变长参数:*与**
在形参中带*: *会将溢出的位置实参值汇总成元组,然后赋值给紧跟其后的形参名
def foo(x,*y):
print(x,y)
foo(1) #1
foo(1,2,3,4,5,6) #1 (2,3,4,5,6)
在形参中带**: **会将溢出的关键字实参值汇总成字典,然后赋值给紧跟其后的形参名
def foo(x,**y):
print(x,y)
foo(1,a=111,b=222,c=333) #1 y={"a":111,"c":333,"b":222}
在实参中带*
def foo(x, y, z):
print(x, y, z)
foo(*[11, 22, 33]) # foo(11,22,33)
foo(*"hello") # foo("h","e","l","l","o")
在实参中带**
def foo(x, y, z):
print(x, y, z)
foo(*{"a":1,"b":2,"c":3}) # foo("a","b","c")
foo(**{"a": 1, "b": 2, "c": 3}) # foo(c=3,a=1,b=2)
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): # args=(1,2,3) kwargs={"x":111,"y":222,"z":333}
index(*args,**kwargs) # index(*(1,2,3),**{"x":111,"y":222,"z":333})
# index(1,2,3,x=111,y=222,z=333)
# wrapper(1, 2, 3, x=111, y=222, z=333) 错误
wrapper(1,c=3,b=2) #1 2 3
#命名关键字参数
def foo(x,y,*args,m=666,n):
print(x,y)
print(m,n)
# foo(1,2,m=777,n=888)
# foo(1,2,n=999)
def foo(x,y=111,*args,m,n,**kwargs):
pass