Python3函式傳參和函式形參定義方式
傳遞方式有以下四種:
位置傳參
序列傳參
關鍵字傳參
字典關鍵字傳參
(1)位置傳參:
實際引數(實參)的對應關係與形式引數(形參)對應關係是按位置依次對應的
實參的個數和形參的個數要嚴格一直
例項:def myfun1(a, b, c): # 形參
print(a)
print(b)
print(c)
# 呼叫 myfun1(1, 2, 3) # 實參
(2)序列傳參
序列傳參是指在函式呼叫過程中,用*將序列拆解後按位置進行傳遞的方式
序列傳參時,序列拆解的位置將與形參一一對應
序列的位置資訊對應相應的引數
例項:# 假設已經有序列可用
L1 = [11,22,33]
T1 = (4.4,5.5,6.6)
S1 = "ABC"
myfun1(*L1)
myfun1(*T1)
myfun1(*S1)
(3)關鍵字傳參:
關鍵字傳參是指傳參時,按形參的名稱給形參賦值
實參和形參按形參名進行匹配(可以不按位置順序進行匹配)
例項:# 關鍵字傳參
myfun1(c = 33, b = 22, a = 11)
(4)字典關鍵字傳參:
是指實參為字典,將字典用**拆解後進行關鍵字傳參
例項:d1 = {"c":33, "b":22, "a":11}
myfun1(**d1)
說明:字典的鍵名和形參名必須一致
字典的鍵名必須為字串,並符合關鍵字的命名
字典的鍵名要在形參中存在
(5)函式的綜合
傳參方式,在能確定每個形參否能唯一匹配一個實參的情況也可以任意傳參
傳參時,位置傳參和序列傳參要先於關鍵字傳參和字典關鍵子傳參
例項: myfun1(100, *[200, 300])
myfun1(*[10,20],30)
myfun1(*[10], 20, *[30])
myfun1(100, **{"c":300, "b":200})
myfun1(**{"c":300, "b":200}, a = 100) myfun1(b = 200, c = 300, 100) # 錯的
注意傳參時:
1、不可變型別的資料作為函式引數傳入時,函式內部不會改變變數的原資料的值
2、可變型別的資料作為函式引數傳遞時,函式內部可以改變原資料,多用與返回更多函式執行結果
例項:寫一個函式,在函式內輸入一些整數,
(1)把所有奇數放入全域性列表odds中
(2)把所有的偶數放入全域性的列表evens中
odds = []
evens = []
def input_number(o, e):
while True:
n = int(input("請輸入整數:"))
if n < 0:
break
# 如果n為奇數則新增列表odds中
if n % 2 == 1:
o.append(n)
else: # 如果n為偶數則新增到列表evens中
e.append(n) input_number(odds, evens)
print(odds) # 此列表將被修改
print(evens) # 此列表也將被修改
2、函式引數的定義規則(建立函式)
函式的預設引數:
語法:def 函式名(形參名1 = 預設實參1, 形參名2 = 預設實參2, ....):
語句塊
例項:以下示意函式的預設引數
def info(name, age=1, address="未填寫"):
print(name, "住在:", address, "今年:", age, "歲")
info("莊AC", 23, "北京")
info("莊AC", 23)
說明:(1)預設引數必須自右至左依次存在,如果一個引數有預設引數,則其右側的所有引數都必須有預設引數
如:def test_fn(a, b = 10, c): # 是錯的
(2)預設引數可以有0個或多個,甚至全部都有預設引數
3、函式的引數定義方式:
位置形參
星號元組形參
命名關鍵字形參
雙星號字典形參
(1)位置形參語法:
def 函式名(形參名1, 形參名2, 形參名3,......):
語句塊
(2)星號元組形參語法:
def 函式名(*元組形參名): 語句塊
作用:收集多餘的位置傳參 例項:
def funs(*args):
# args繫結一個元組,此元組內的元素是為了剩餘的位置傳參
print("施參個數是:", len(args))
print("args繫結", args)
funs() # 以無參呼叫
funs(1, 2, 3, 4)
funs("ABC", 1, 2.3, 4+5J)
(3)命名關鍵字形參語法:
def 函式名(*, 命名關鍵字形參):
語句塊
或
def 函式名(*args, 命名關鍵字形參): 語句塊
作用:所有的命名關鍵字形參,必須用關鍵字傳參或字典關鍵字傳參進行引數傳遞
例項:
def fn(*, a, b):
print("a的值為:", a)
print("b的值為:", b)
# fn(1, 2) # 錯的,a和b 必須是用關鍵字傳參
fn(a = 1, b = 2) #必須這麼傳
fn(b = 0, a = 20)
fn(**{"b":200, "a":100})
--------------------------
def f2(*args, a, b):
print("args=", args)
print("a=", a)
print("b=", b)
f2(1, 2, 3, 4, a=100, b=200)
f2(a=100, b=200)
(4)雙星號字典形參語法:
def 函式名(**字典形參名):
語句塊
作用:收集多餘的關鍵字傳參(例如:dict()),通常只有一個
例項:
def func(**kwagrs): # kwagrs繫結一個字典
print("引數個數:", len(kwagrs))
print("kwagrs的值為:", kwagrs)
func(name="zhuang", age=35, address="dgas")
func()
(5)函式引數自左至右的順序為:
位置形參, 星號元組形參, 命名關鍵字形參, 雙星號字典形參
例項:
def fn(a, b, *args, c, **kwargs):
pass
fn(100,200,300,400,c=5.5,d=6.6,e=7.7)
fn(10,*"AB",20,*{"a":100, "b":200, "c":300})
# ----------以下函式可以接受任意的位置傳參和關鍵字傳參------------
def fn(*args, **kwargs):