分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【Python 進階語法 #8】args? kwargs? 也許可以不用完整的講清楚傳了什麼東西給 func?

前言

進階篇的語法,python 新手來說可以完全先不用碰,
(碰了可能有比較厲害,但更有可能觀念大亂),
大部分的功能只需要靠基礎篇的內容就能實現了!
建議會先把基礎的都學會再來看哦!

args, kwargs 是慣用名,使用時,我們不太會只講這個部分,會連前面的符號一起講
因此以下都請看作「*args」、「**kwargs」

小提示

因為開始講到比較細的東西,用詞上我會更小心一些,
注意以下 parameters 與 arguments 位置的差別,
雖然翻譯幾乎相同也很常混用就是…. 我自己之前也常講錯

def foo(parameters):
    pass

foo(arguments)

args 與 kwargs

python 裡面我們傳參數 (arguments) 給 function 時,
我們更仔細的看,其實在 arguments 我們就可以預先指定給傳給特定的 key,

這個順序有個嚴格的排列,必須先 args 再 kwargs

  • args: 位置參數 (不指定 key 的都必須先放在前面,且順序很重要)
  • kwargs: key word (故意分開表示 kw) arguments 關鍵字參數,只要擺比 args 後面即可。

當我們指定 keywords, 我們就可以無視順序的傳入參數給 function,
但如果我們沒有指定,就是一律按照順序

args

思考問題

請問以下會印出什麼呢?(建議先想過再往下看,如果答對了基本上就已經理解囉!)

def my_function(*args):
    for arg in args:
        print(arg)

my_function(1, 2, 3, 4) 

答案

我們所傳入所有的 args,其實如果是以 *args 的方式去接這些變數,就會依照順序。
(args 只是習慣,實際上可以替換成別的名稱)

kwargs

思考問題

請問以下會印出什麼呢?(建議先想過再往下看,如果答對了基本上就已經理解囉!)

def my_function(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

my_function(a=1, b=2, c=3) 

答案

**kwargs: 可以讓我們以 dict 的方式把所有帶有 key 的變數儲存,
一樣 kwargs 只是慣用名,不一定要用這個名字。

同時出現的 args 與 kwargs

我們從上面先分別了解兩者的功能後,當一個 function 出現類似

def func(*args, **kwargs):
    pass

表示「無論傳入任何的變數,這個 func 都能吃的進去」 (當然也先必須符合 args 在前, kwargs 在後的前提)

用途

從上面的敘述中,我們可以發現這種方式給予我們在撰寫 func 的時候有最大的彈性,
所以我們會使用與一些可能還不確定傳入內容,或本身就需要彈性的設計 (對外給客戶的 API …)

思考問題

請問以下會印出什麼呢?(建議先想過再往下看,如果答對了基本上就已經理解囉!)

def foo(*args, **kwargs):
    print(type(args))
    print(type(kwargs))

    for ele in args: 
        print(ele)
    for k, v in kwargs.items():
        print(f"{k}: {v}")

foo(1, 2, 3, a=4, b=5, c=6)

答案

進階討論:關於「*」這個符號

「*」 在 python 裡面有 unpack (展開) tuple (list 也可以) 的意思
而兩個的「**」,是可以 unpack dict

最後我的理解是

我們可以直接把「*args」,傳入 func 後,扣掉符號所剩下的 「args」當成是 tuple (list),
而直接把「**kwargs」,傳入 func 後,扣掉符號所剩下的 「kwargs」當成是 dict

這是我目前認為最容易理解的方式了。

題外話的嘗試

所以也有以下的用法:

mylist = [1, 2, 3]
print(*mylist)

會印出 1 2 3 (針對每個元素各別印出),
這段程式碼可翻譯為 print(1, 2, 3)

而我們沒辦法同樣的印出 print(**mydict)
因為這段程式碼會被翻譯為 print(a=4, b=5, c=6),
而這種帶有 keyword 的 print 本來就不能印出東西來

Reference

⭐Python 基礎用法 相關文章整理⭐:
1.【Python】python list 清除, 移除內容元素 remove, pop, del, clear相關用法整理 sample code (內含範例程式碼)
2.【Python】寫模組 module、package 總整理 Importing files from different folder
3.【Python】python assert (斷言) 用法 sample code (內含範例程式碼)
4.【Python】python 一行 if else 語法 (one line if else) sample code (內含範例程式碼)
5.【Python】lambda 與 def function 使用方法與比較整理(內含範例程式碼)
6.【Python】python map 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
7.【Python】python zip 使用方法 與 其他寫法比較整理 (內含範例程式碼) sample code
⭐Python 字串處理 相關文章整理⭐:
1.【Python】python print 變數的值 & 變數名稱 方法總整理
2.【Python】python string format str.format 總整理
⭐Python 檔案處理 相關文章整理⭐:
1.【Python】python 開關檔範例 與 程式模板 with open / file open sample code
2.【Python】取出檔案名稱 (含副檔名、不含副檔名) os path basename split 取出 檔名 路徑 不要副檔名 sample code
3.【Python】在 python 中利用 os.chmod 更改檔案的權限 chmod 777
4.【Python】利用 shutil 來複製檔案 shutil copy file
5.【Python】python 建立資料夾範例 mkdir os.makedirs() sample code
6.【Python】python 移除資料夾範例 rmdir shutil.rmtree() sample code
7.【Python】確認檔案是否存在 os.path.isfile / 確認資料夾是否存在 os.path.isdir sample code is folder / file exist
⭐Python 系統偵測 相關文章整理⭐:
1.【Python】python pyinotify sample code 偵測指定路徑底下的文件變化 (內有範例程式碼)
2.【Python】python 利用 argparse 使程式執行時可帶參數 (內附範例程式碼) sample code
⭐Python 平行運算 相關文章整理⭐:
1.【Python】threading – 建立多執行緒來執行程式 (內含範例程式碼) sample code
2.【Python】multiprocessing – 01 | 用多核心來執行程式 (內含範例程式碼) sample code
3.【Python】multiprocessing – 02 | pool, map, apply_async – 用多核心來執行程式並取得結果 (內含範例程式碼) sample code
4.【Python】python thread multiprocess 比較總整理
5.【Python】python pooling multiprocess – 用多核心來執行程式 sample code (內含範例程式碼)
⭐Python 測試程式 相關文章整理⭐:
1.【Python】python 測試程式 – 利用 doctest 測試 python testcase 的優雅寫法,適用於 leetcode (doctest in function,搭配 function 的用法)
2.【Leetcode】python – 利用 doctest 測試 leetcode python testcase 的優雅寫法 (doctest in class,搭配 class 的用法)
⭐Python Chatbot 相關文章整理⭐:
1.【Chatbot】(全圖文說明) LINE Developers bot 機器人註冊與設定
2.【Chatbot】(全圖文說明) ngrok 本地伺服器設定方法 – LINE bot local server
3.【Chatbot】Dialogflow API 串接 python 的方法 (內含範例程式碼)
4.【Chatbot】[講義分享] 手把手實作line機器人 (linebot API 運用)
⭐Python Google Colab (Colaboratory) 相關文章整理⭐:
1.【Colab】Python colab 上傳檔案的方法 (內含範例程式碼) upload files
2.【Colab】Python colab 連接 google 雲端硬碟取用資料 (內含範例程式碼) mount google drive
⭐Python 其他筆記 相關文章整理⭐:
1.【Python】anaconda 更新 (upgrade) python 3.8 版本筆記
2.【Sublime】Sublime 將縮排 “tab” 改成 4格空白 的方法 (圖文說明) sublime indent 4 spaces
3.【Sublime】Python 縮排小技巧 (很爛但實用) 快速將 tab 改成「4格空白」的方法
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 889

★留個言吧!內容有誤或想要補充也歡迎與我討論!