函式基本使用
阿新 • • 發佈:2021-07-02
函式基本使用
回顧
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)