1. 程式人生 > >day11 函式的位置形參,位置實參,可變長位置形參,關鍵字形參

day11 函式的位置形參,位置實參,可變長位置形參,關鍵字形參

今天內容

函式的引數詳解
形參與實參
形參及形式引數,就是在定義函式是括號中指定的引數(本質就是一個名字)
實參及實際引數,指的是在呼叫函式是傳入的引數)(本質就是一個值)
在呼叫函式是就會把形參和實參繫結在一起(變數名)
在函式呼叫結束之後繫結關係就解除了
def func1(a,b)#a,b就是形參a=1,b=2
print(a)
print(b)
func1(1,2)#1,2就是實參
位置引數(用的最多)
根據呼叫階段 引數分為兩類 形參和實參
所以對應的 位置引數也有兩種
位置形參

位置實參
位置,表示的是順序,指從左往右來定義的引數就是位置引數
需要注意的是:
只要是定義了的位置形參都必須被傳值
位置形參的數量與位置實參的數量必須一致,不能多傳也不能少傳
實參會按照傳入的位置一次賦值給形參
def func(a,b,c)a,b,c都是位置形參


func(1,2,3)1,2,3都是位置實參

def register(name,password,sex):
print('my name is %s pwd:%s sex :%s)
register('123','rose','woman')
關鍵字引數(預設函式)
關鍵字實參


在呼叫函式時指明到姓的為形參賦值就稱為關鍵字引數
優點:
可以打破傳入引數的順序,可以不與形參順序相同
注意:
1、不管以什麼樣的方式傳值,每一個形參都必須被傳值、
2、關鍵字引數必須放在位置引數的後面
3、不能為同一個引數傳多次值
到底是位置引數還是關鍵字引數是由實參決定
使用關鍵字傳參時,實參的名字必須與形參一致
def func(a,b,c):
print(a)
print(b)
print(c)
func(1,2,c=3)與位引數沒區別
func(c=3,1,2)語法錯誤,關鍵字引數出現在了位置引數的前面
func(c=3,a=1,b=2) 打破位置引數的順序限制

def register(name,pwd):
print('name is'name)
print('password is',pwd)
register(name='egon',pwd='123')
register(jack,pwd='123')
預設形參


在定義時,就已經為形參指定了一個值,那麼這個形參就稱為預設形參
特點:
在呼叫時可以不為預設形參傳值,使用時就是預設值
場景:
當然也可以傳值,這樣的話內部使用的就是你傳的值
當函式中的某一形參經常出現重複的值時,就將其指定為預設形參,可以簡化呼叫程式碼
需要注意的是:
不應將預設形參的值設定成一個可變型別
會導致每次函式呼叫都共用同一個預設引數,我們應該將函式設計為獨立的型別,每次呼叫互不干擾
只能是不可變型別
需要注意,
預設形參必須放在非預設形參後面
def reg(name age,sex='fenamle'):
print(name,age,sex)
reg=('rose',18,)
reg=('rose',18,)
reg=('egon',18,'male')

 

def reg(name ,sex,hobby,li=[]):
li.append(hobby)
print(name,sex)
print(li)
reg('bgon','man'['play','music','move'])
reg('cgon','man'['play','music','move'])

 


def reg(name ,sex,hobby):
li.append(hobby)
print(name,sex)
print(hobby)
reg('bgon','man'['play','music','move'])
reg('cgon','man'['play','music','move'])
#可以不用完全按照順序來傳值
open(‘xxx’,'r',encoding='utf-8')
可變引數(重難點)
可變長度引數指的是,可以傳任意個數的實參
傳入實參是為了給形參來使用,那就意味這,形參可以接收任意個數實參的能力
也就是* 和**
帶*的形參表示可以接收任意個數的實參,接收到的引數會被打包成元組型別


形參的名字可以任意,但建議使用args,是引數的縮寫
# iterable可迭代的,只要可以被for in 迴圈的
帶*的實參會自動將*後對應的值打散'abc'打散a,b ,c

 


def func(a,b,c)
print(a,b,c,)
func(1,2*'abc')#打散a,b ,c
位置形參與可變長形參混合使用

當可變長形參出現在了位置形參的前面時,那麼後面的位置形參必須以關鍵字形參來傳入
當*可變長形參出現在位置形參後面,會按照順序給前面位置形參,剩餘的值就賦值給*args
當可變長形參存在關鍵字形參時不能接受,會報錯。
**不能接收位置實參
把傳入的關鍵字實參打包成字典
**使用
形參中如果帶有**,會把關鍵字實參打包成字典型別傳入
先為前面的形參賦值,後續的多餘的關鍵字引數形參賦值給**
只能接收多出來的關鍵字實參

def func(a=1,b=2,**kwargs)


print(a,b,kwargs)
func=(a=-1,b=-2,s=10)


實參中帶**,會把**後的字典(也必須是字典型別)打散成關鍵字實參(**{a:4})相當於(a=4)

 


def func(name):
print(name)
func(**{'name':'rose'})(name=rose)

 

寫一個帶有可變長位置形參的函式

def func(name,pwd,**args)

if name=='bgon'and pwd=='123';
if 'phone' in kwargs:
if kwargs['phone']=='110'
print('login successful')
else:
print('請傳入手機號驗證‘)
else:
print(error name or pwd)
func('bgon','123')
func(’bgon','123',phone='110')

*和** 可以為函式預留拓展性空間,後期可以根據需求而舊的函式呼叫方式也不會出現問題
簡單的說就是提高函式的拓展性

該方式可以接收任意個數的位置實參和關鍵字實參
但要注意順序,位置實參必須在關鍵字之前
在裝飾器中
def inner(name,sex,age)
print(name,sex,age)
def func(*args,**kwargs)
print(args)
print(kwargs)
inner(*args,**kwargs)#inner(1,2,3,a=10,b=20)
outer(1,2,3,a=10,b=20)
#上述寫法,可以將outer接收到的所有引數,原模原樣的傳遞給inner函式。


def func(*args,a,b,)
print(a,b,args)
func(1,2,3,a=4,b=5)

 

def func(*args)
pass

func(1)
func(1,2)
func(1,2,3)