[Python] *args and **kwargs
這次來紀錄一個我以前剛學python的時候很容易一頭霧水的 - *args and **kwargs
其實python的tutorial網頁都有教學, 只是我都是用到才會去查
不過這次這東西還滿重要的(默.....)
Ref: http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
來看網頁的範例
這是個很一般的function, 很單純的parameter, 有prompt, retries, complaint, 也有設定預設值, 看起來很美滿
那有趣的東西就要來了
這時候看到兩個很有趣的東西 - *arguments還有**keywords, 先不解釋, 來看要怎麼呼叫
其實從呼叫的方法, 應該可以開始猜出這兩個東西的使用跟差異
首先kind, 就只是一般的argument, 他就只會接收一個argument: "Limburger"
再來是*argument, 這有專有名稱: Arbitrary Argument Lists, 也就是會接受任意個argument, 前提是他是一個一般的argument, 意思就是後面那些長的比較奇怪還有變數參雜在其中的, 並不會接收, 以及這邊收下來之後, 他其實是用tuple去儲存這些資料, 所以這邊會收到兩個*argument: "It's very runny, sir." 跟 "It's really very, VERY runny, sir."
最後一個是**keywords專有名稱: keyword arguments (這樣就知道為甚麼很多人用kwargs稱呼他), 最後這些帶有變數的argument, 就統統會被**keywords給接收, 這邊有一個重點, 他是用python的dictionary去接收的, 也就是說這是一個dict, 參數名稱也就不能重複不然會error, 而在function內部存取當然就可以直接使用keyword["shopkeeper"], keyword["client"], keyword["sketch"]
其實python的tutorial網頁都有教學, 只是我都是用到才會去查
不過這次這東西還滿重要的(默.....)
Ref: http://docs.python.org/dev/tutorial/controlflow.html#more-on-defining-functions
來看網頁的範例
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise IOError('refusenik user')
print(complaint)
這是個很一般的function, 很單純的parameter, 有prompt, retries, complaint, 也有設定預設值, 看起來很美滿
那有趣的東西就要來了
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
keys = sorted(keywords.keys())
for kw in keys:
print(kw, ":", keywords[kw])
這時候看到兩個很有趣的東西 - *arguments還有**keywords, 先不解釋, 來看要怎麼呼叫
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
其實從呼叫的方法, 應該可以開始猜出這兩個東西的使用跟差異
首先kind, 就只是一般的argument, 他就只會接收一個argument: "Limburger"
再來是*argument, 這有專有名稱: Arbitrary Argument Lists, 也就是會接受任意個argument, 前提是他是一個一般的argument, 意思就是後面那些長的比較奇怪還有變數參雜在其中的, 並不會接收, 以及這邊收下來之後, 他其實是用tuple去儲存這些資料, 所以這邊會收到兩個*argument: "It's very runny, sir." 跟 "It's really very, VERY runny, sir."
最後一個是**keywords專有名稱: keyword arguments (這樣就知道為甚麼很多人用kwargs稱呼他), 最後這些帶有變數的argument, 就統統會被**keywords給接收, 這邊有一個重點, 他是用python的dictionary去接收的, 也就是說這是一個dict, 參數名稱也就不能重複不然會error, 而在function內部存取當然就可以直接使用keyword["shopkeeper"], keyword["client"], keyword["sketch"]
留言
張貼留言