摘要:即,雙星號參數接收的參數作為字典。在有些情況下,單星號函數參數和雙星號函數參數是一起使用的,定義如下總結默認值函數參數。雙星號函數參數。
函數調用時的參數傳遞方式:(調用函數) 傳遞方式有以下四種: 位置傳參 序列傳參 關鍵字傳參 字典關鍵字傳參
---------------------------------------------------yu---
(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):
python函數參數支持帶星號*的非固定個數參數,如:
def getInfos(msg,*users): for u in users: print(u)
在調用時,可以往users傳入一個元組或列表,如果傳入的列表或元組前帶星號,剛傳入后會自動拆包。具體的不同用法有不同的效果,如下:
1、不定形參傳入元組。
getInfos("msg",("aa","bb") )
輸出:
("aa", "bb")
2、不定形參傳入帶星元組。
getInfos("msg",*("aa","bb") )
輸出:
aa bb
3、不定形參傳入列表。
getInfos("msg",["aa","bb"] )
輸出:
["aa", "bb"]
光看結果可能像是列表!!!!!!!!!!!!!但其實返回的就是一個元組
可通過以下代碼進行驗證:
#!/usr/bin/python3 def getInfos(msg,*users): users[0]="hh" for u in users: print(u) a = ["aa","bb"] getInfos("msg",a )
結果:
Traceback (most recent call last): File "/tmp/653879115/main.py", line 7, in getInfos("msg",a ) File "/tmp/653879115/main.py", line 3, in getInfos users[0]="hh" TypeError: "tuple" object does not support item assignment exit status 1
這表明是一個元組。
4、不定形參傳入帶星列表。
getInfos("msg",*["aa","bb"] )
輸出 :
aa bb
5、直接傳入多個值。
getInfos("msg", "aa","bb")
輸出:
aa額外部分二:
看如下例子:
def singalStar(common, *rest): print("Common args: ", common) print("Rest args: ", rest)
第一種方式,星號(*)參數不傳參:
singalStar("hello") #Common args: hello #Rest args: ()
第二種方式,傳多個值(個數大于或等于函數定義時的參數個數):
singalStar("hello", "world", 000) #Common args: hello #Rest args: ("world", 0)
不難看出,上述方式中,星號參數把接收的參數合并為一個元組。
第三種方式,竟然星號參數把接收的參數作為元組,那么我們直接傳元組類型的值:
singalStar("hello", ("world", 000)) #Common args: hello #Rest args: (("world", 0),)
沒錯,你沒看錯,傳遞的元組值作為了星號參數的元組中的一個元素。
第四種方式,但是有時候我們想把元組值就作為星號參數的參數值,那么該怎么辦呢?好辦,在元組值前加上“”即可,不過此時,就不能在加了“”的元組后,追加任何值了。
singalStar("hello", *("world", 000))
singalStar("hello", *("world", 000), "123") #error Common args: hello Rest args: ("world", 0)3.帶兩個星號(*)的函數參數
帶兩個星號(*)的函數定義如下:
def doubleStar(common, **double): print("Common args: ", common) print("Double args: ", double)
第一種方式,星號(*)參數不傳值:
doubleStar("hello")
Common args: hello Double args: {}第二種方式,傳多個參數(個數大于或等于函數定義時的參數個數)。但是,這和單星號參數傳值方式肯定不一樣,否則,不就亂套了嗎。
doubleStar("hello", "Test", 24) #error
doubleStar("hello", x = "Test", y = 24)
不難發現,此時必須采用第一節的默認值傳參的“args = value”的方式。同時,“=”前的字段成了字典的鍵,“=”后的字段成了字典的值。即,雙星號參數接收的參數作為字典。
第三種方式,有時候我們想把字典值就作為星號參數的參數值,那么該怎么辦呢?同單星號參數,在字典值前加上“**”,同時其后不能添加任何值。
#doubleStar("hello", **{"name": "Test", "age": 24}, {"name": "Test2", "age": 24}) #error #doubleStar("hello", {"name": "Test", "age": 24}) #error doubleStar("hello", **{"name": "Test", "age": 24}) #Common args: hello #Double args: {"name": "Test", "age": 24}
在有些情況下,單星號函數參數和雙星號函數參數是一起使用的,定義如下:
def singalAndDoubleStar(common, *single, **double): print("Common args: ", common) print("Single args: ", single) print("Double args: ", double)
4.總結
默認值函數參數。這種函數定義時,第一個有默認值的參數后的每一個參數都必須提供默認值。傳參時,可以直接傳參,也可以以“默認值參數名=value”的形式傳參。 單星號函數參數。單星號函數參數接收的參數組成一個元組。 雙星號函數參數。雙星號函數參數接收的參數組成一個字典。
完整的代碼如下:
def singalStar(common, *rest): print("Common args: ", common) print("Rest args: ", rest) def doubleStar(common, **double): print("Common args: ", common) print("Double args: ", double) def singalAndDoubleStar(common, *single, **double): print("Common args: ", common) print("Single args: ", single) print("Double args: ", double) def defaultValueArgs(common, defaultStr = "default", defaultNum = 0): print("Common args", common) print("Default String", defaultStr) print("Default Number", defaultNum) if __name__ == "__main__": defaultValueArgs("Test") defaultValueArgs("Test", "default", defaultNum = 1) singalStar("hello") singalStar("hello", "world", 000) singalStar("hello", ("world", 000)) singalStar("hello", ("world", 000), {123: 123}) singalStar("hello", *("world", 000)) # singalStar("hello", *("world", 000), "123") #error doubleStar("hello") doubleStar("hello", x = "Test", y = 24) doubleStar("hello", **{"name": "Test", "age": 24}) # doubleStar("hello", {"name": "Test", "age": 24}) #error singalAndDoubleStar("hello") singalAndDoubleStar("hello", "world", 000) singalAndDoubleStar("hello", "world", 000, {"name": "Test", "age": 24}) singalAndDoubleStar("hello", "world", 000, **{"name": "Test", "age": 24}) singalAndDoubleStar("hello", ("world", 000), {"name": "Test", "age": 24}) # singalAndDoubleStar("hello", *("world", 000), {"name": "Test", "age": 24}) #error singalAndDoubleStar("hello", *("world", 000), **{"name": "Test", "age": 24})
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45069.html
摘要:上一篇文章標準庫內置函數下一篇文章標準庫內置函數內置函數返回對象的長度元素個數。對表示單個字符的字符串,返回代表它碼點的整數。上一篇文章標準庫內置函數下一篇文章標準庫內置函數 上一篇文章:Python標準庫---3、內置函數(G-H-I-J-K)下一篇文章:Python標準庫---5、內置函數(P-K-R) 內置函數: showImg(https://segmentfault.com...
摘要:繼續講述更多的的內置函數。傳遞以切換緩沖關閉僅允許在二進制模式下,選擇行緩沖僅在文本模式下可用,并且的整數以指示固定大小的塊緩沖區的大小以字節為單位。啟動內置的幫助系統此函數主要在交互式中使用。 繼續講述更多的Python的內置函數。 showImg(https://segmentfault.com/img/remote/1460000019193976); IO操作 input([p...
摘要:這里就可以看到我們需要找的參數了,但是這里已經生成了,我們可以直接查看右邊的調用棧經過多次查看,可以很容易就發現這個地方有點東西,立即下斷點這時我們可以先去掉斷點,然后刷看查看,獲取不斷點下一個斷點直到運行結束再滑動到下一頁即可。 今天繼續帶來破解拼多多的 anti_content 參數破解,代碼已經放在github上:https://github.com/SergioJune...(...
摘要:這里就可以看到我們需要找的參數了,但是這里已經生成了,我們可以直接查看右邊的調用棧經過多次查看,可以很容易就發現這個地方有點東西,立即下斷點這時我們可以先去掉斷點,然后刷看查看,獲取不斷點下一個斷點直到運行結束再滑動到下一頁即可。 今天繼續帶來破解拼多多的 anti_content 參數破解,代碼已經放在github上:https://github.com/SergioJune...(...
摘要:函數式編程與面向對象編程表達式函數柯里化高階函數之劍什么是表達式例子定義表達式是一個匿名函數,表達式基于數學中的演算得名,直接對應于其中的抽象,是一個匿名函數,即沒有函數名的函數。 函數式編程與面向對象編程[1]: Lambda表達式 函數柯里化 高階函數.md 之劍 2016.5.2 11:19:09 什么是lambda表達式 例子 For example, in Lisp the...
閱讀 1556·2021-11-25 09:43
閱讀 2337·2019-08-30 15:55
閱讀 1468·2019-08-30 13:08
閱讀 2670·2019-08-29 10:59
閱讀 818·2019-08-29 10:54
閱讀 1586·2019-08-26 18:26
閱讀 2548·2019-08-26 13:44
閱讀 2656·2019-08-23 18:36