1. 程式人生 > 其它 >函式基本使用

函式基本使用

函式基本使用

回顧
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)