python中关键字参数的特点_Python中的*可变参数与**关键字参数
1、定義了一個需要兩個參數的函數
def print_str(first, second):
print first
print second
if __name__ == "__main__":
print_str("hello", "world")
如果傳一個參數調用,print_str("hello"),那么一定會拋出異常的:
明確告訴你需要準確的兩個參數,現在只確定給了一個參數
TypeError: print_str() takes exactly 2 arguments (1 given)
2、傳一個參數行,兩個參數行,多個參數也行的函數
上面的問題,我們有個需求,就是我想傳一個參數也行(還有種辦法是用到默認參數),傳兩個參數或多個參數也行的函數有沒有?像java一樣,必須的有,讓我們改造一下最后參數為可變參數(也就是說可變參數,你可以不傳)
def print_str(first, *second):
print first
print second
此時調用:print_str("hello")
輸出結果:
hello
()
可以看到字符串"hello"打印出來了,而沒有傳參的*second,打印出的是一個元組tuple,0個元素的元組,因為我就傳了一個參數
如果我們多傳幾個參數呢
print_str("hello","one","two","three")
輸出結果:
hello
('one', 'two', 'three')
果然從可變參數開始起,即第二個參數"one"開始,會作為元組的第一個元素,后面的參數也會相繼成為元組的元素
3、總結一下 *參數
在調用時,從*參數 起,對傳入的參數,自動組成tuple
4、函數調用時,傳入*參數,會對傳入的元組參數進行一個解包功能,每一個元素自動作為函數的位置參數
print_str(*numbers_strings),傳入*元組,看看是怎么解包的,元組的第一個元素,仍然是代表位置參數first
等同于print_str("1","2","3","4","5")
numbers_strings = ("1","2","3","4","5")
def print_str(first, *second):
print first
print second
if __name__ == "__main__":
print_str(*numbers_strings)
輸出結果:
1
('2', '3', '4', '5')
5、一個沒有可變參數的函數,可用解包功能一次性傳入多個參數
看下例子
numbers_strings = ("1","2")
def print_str(first, second):
print first
print second
if __name__ == "__main__":
print_str(*numbers_strings)
輸出結果:
1
2
6、**參數,參數名稱前兩個**,代表的是關鍵字參數,也叫做字典參數,看下例子
def printStr(**anything):
print anything
printStr(first = 5, second = 100)
{'second': 100, 'first': 5}
關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
6.1、函數調用時,也可以傳入一個字典(需要前面加兩個*),這樣函數那塊就會解包,它會把dictionary中所有鍵值對轉換為一個一個的關鍵字參數傳進去
def printStr(first, **dict):
print str(first) + "\n"
print dict
printDic = {"name": "tyson", "age":"99"}
printStr(100, **printDic)
printStr(100, name = "tyson", age = "99") #等同于上面**printDic
7、總結
在python中,當*和**符號同時出現在函數定義的參數中時,都表示參數列表可接受任意數量的參數,它們均稱為可變參數:
*second表示任意多個(包含0個)無名參數,又稱為元組參數,最終的類型為tuple(注意:就算傳遞一個元素,也會最終變為tuple)
**anything表示任意多個關鍵字參數,又稱為字典參數,最終的類型為dictionary
注意:
二者同時存在時,一定需要將*second放在**anything之前 (重要的事情說三遍)
二者同時存在時,一定需要將*second放在**anything之前
二者同時存在時,一定需要將*second放在**anything之前
8、注意事項,再提一次
a、首先只要是可變參數(無名參數或者關鍵字參數),可以傳0個參數,也可以傳1個,同樣也可以傳多個
b、只要是可變參數(元組參數或者字典參數),一定要在普通參數(也稱位置參數)的后面
c、*參數一定必須在**參數的前面(元組參數與字典參數同時存在時,元組參數一定在前)
def printStr(參數,*參數,**參數):
pass
d、*參數,雖然叫元組參數,你可別傳個完整的元組對象進來哈(只算一個參數而已,它還是會作為tuple的一個元素),如果是個元組,記得做解封,不然就要背鍋了,就是要這樣*turple傳進去
e、**參數,雖然叫字典參數,你可別傳個完整的字典對象進來哈(只算一個參數而已,應該會報錯,因為不符合關鍵字參數的規范),如果是個字典,記得也是做解包,對,就是要這樣 **dict傳進去
f、*參數,叫元組參數,如果傳一個參數進去,它也會最終組成turple,這點要注意了
def jsonify(*args, **kwargs):
indent = None
separators = (',', ':')
if current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] or current_app.debug:
indent = 2
separators = (', ', ': ')
if args and kwargs:
raise TypeError('jsonify() behavior undefined when passed both args and kwargs')
elif len(args) == 1: # single args are passed directly to dumps()
data = args[0] #注意看這里
else:
data = args or kwargs
return current_app.response_class(
dumps(data, indent=indent, separators=separators) + '\n',
mimetype=current_app.config['JSONIFY_MIMETYPE']
)
g、**參數,我相信字典參數也一樣,傳一個進去的時候,同樣最終也會轉換為dict
h、還有一個big bang,還是和上面f條的那個例子有關,就是為元組參數,那我就傳一個dict參數,這時候特別容易混淆,跟e條的關系很大,注意了
總結
以上是生活随笔為你收集整理的python中关键字参数的特点_Python中的*可变参数与**关键字参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用户解锁不存在_解锁手机有6种方法,这些
- 下一篇: 网页中加载obj模型比较慢_Web前端优