1. 程式人生 > >python基礎6-函數的參數

python基礎6-函數的參數

傳值 關鍵字參數 內存空間 war 不能 實例 應該 命名 可變長參數

形參與實參
形參:在函數定義階段,括號內定義的參數的稱為形參,就相當於變量名
實參:在函數調用階段,括號內定義的參數的稱為實參,就相當於變量值
也就是說形參即變量名,實參即變量值,函數調用時,將值綁定到變量名上,函數調用結束,解除綁定
二者區別:
實參:是一個變量,占用內存空間,數據傳送單向,實參傳給形參,不能形參傳給實參
形參:虛擬的,不占用內存空間,形參變量只有被調用時才分配內存單元

具體應用:
#1、位置參數:按照從左到右的順序定義的參數
位置形參:必選參數
位置實參:按照位置給形參傳值
#2、關鍵字參數:按照key=value的形式定義的實參
無需按照位置為形參傳值
註意的問題:
1. 關鍵字實參必須在位置實參右面
2. 對同一個形參不能重復傳值
#3、默認參數:形參在定義時就已經為其賦值
可以傳值也可以不傳值,經常需要變得參數定義成位置形參,變化較小的參數定義成默認參數(形參)
註意的問題:
1. 只在定義時賦值一次
2. 默認參數的定義應該在位置形參右面
3. 默認參數通常應該定義成不可變類型
#4、可變長參數:
可變長指的是實參值的個數不固定
而實參有按位置和按關鍵字兩種形式定義,針對這兩種形式的可變長,形參對應有兩種解決方案來完整地存放它們,分別是*args,*args 沒有key值,**kwargs有key值。

實例1:
def test(x,y): #括號裏面的就是位置形參
print(‘this x:%s‘ %x)
print(‘this y:%s‘ %y)
test(1,2) #再調用時向函數的位置形參傳遞的位置實參

實例2:
def foo(x,y): #定義形參
print(x,y)
foo(1,y=2) #這裏在調用時1賦值給x這個是位置形參,y=2是關鍵字參數,那麽結果就是打印1和2,如果,如果foo(y=2,1)這樣寫那麽是錯誤的,因為x是沒有值的

實例3:
def foo(x=1,y=2): #在定義函數階段,已經為形參賦值了,在定義階段已經賦值,意味著在調用階段
可以不傳值
print(x,y)
foo(x=10) #如果在調用時使用關鍵字參數或者位置參數,那麽實參將覆蓋形參

實例4:
*args示例:
def func(x,y,z,*args):
print(x,y,z)
print(args)
func(1,2,3,4,5,6,) #按照位置將實參傳遞給函數形參,當實參傳遞的參數溢出,則將剩余的實參傳遞給*args參數
func(1,2,3,*[4,5,6]) #傳遞給*args的實參以元組的形式展現
func(*[1,2,3,4,5,6]) #這個傳參方式與func(1,2,3,4,5,6,) 一致
func([1,2,3,4,5,6],1,2,3,4) #列表內的數值代表形參的第一位,以此類推

def func(x,y,z):
print(x,y,z)
l=[1,2,3]
func(*l)
#這裏實參傳遞與上述func(*[1,2,3,4,5,6]) 方法一致

**kwargs示例:
def func(x,y,**kwargs):
print(x,y)
print(kwargs)
func(y=2,x=1,z=3,a=1,b=2) #根據關鍵字參數傳遞x,y,將形參中沒有定義參數都傳給**kwargs,並以字典的形式展現
func(1,2,3,z=3,a=1,b=2) #這個調用方式是錯誤的,這個調用時實參1和2根據位置參數傳遞給形參,但是實參3沒有形參對應
func(y=1,x=2,**{‘a‘:1,‘b‘:2,‘c‘:3}) #這個方法與func(y=2,x=1,z=3,a=1,b=2)結果一致
func(**{‘x‘:1,‘a‘:1,‘b‘:2,‘c‘:3}) #這個調用方法是錯誤的,該調用方法只是把值傳遞給**kwargs,而x和y形參則沒有值可以傳遞

def foo(x,y,z):
print(x,y,z)
dic={‘x‘:1,‘y‘:3,‘z‘:1}
foo(**dic)
#foo(x=1,y=3,a=1)

實例5:
def home(name,age,sex):
print(‘from home====>‘,name,age,sex)
def wrapper(*args,**kwargs): #args=(1,2,3,4,5,6,7),kwargs={‘c‘:3,‘b‘:2,‘a‘:1}
home(*args,**kwargs)
#home(*(1,2,3,4,5,6,7),**{‘c‘:3,‘b‘:2,‘a‘:1})
#home(1,2,3,4,5,7,a=1,b=2,c=3)
# wrapper(1,2,3,4,5,6,7,a=1,b=2,c=3)
wrapper(‘egon‘,sex=‘male‘,age=19)


命名關鍵字參數(了解):
# 形參中,在*後定義的參數稱之為命名關鍵字參數,
# 它的特性是;傳值時,必須按照關鍵字實參的形式傳值
# def foo(x,y=20,*args,a=1,b):
# print(x,y,a,b)

# # foo(10,b=3)
# foo(10,22,33,44,a=2,b=3)

# 位置參數,默認參數,*args,命名關鍵字參數,**kwargs

python基礎6-函數的參數