*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4)
def test(a):
print a
print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?
*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4)
def test(a):
print a
print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
補充
我覺得會有無用之感很大的一點在於我們常陷入一種思考情境:
因為如果寫跟用為同一人, 那麼介面怎麼設計當然可以很自由, 選用
*
或是直接用 list 都沒差但當今天我們是使用別人的 API 或是要寫 function 給別人用時, 就沒那麼大的彈性了
這個時候,
*
可以幫助我們許多這兩個東西可是相當有用的呢!
舉幾個例子示範一下
用於 function arguments 時
假設有個 function
intro
:今天我給你一組 list 的 data
lst
和 dict 的 datadic
:不用
*
或**
你可能要:使用
*
和**
:用於 function params 時
今天我們要寫一個加法 function:
如果要擴充到三個數相乘:
這邊有兩個問題:
一個是參數列可能很長
一個是 Python 不允許多載, 所以不能使用同一個 function name
但是
*
可以解決這個問題:當然你可能覺得這邊我也可以設計成參數是 list 或 tuple, 但有些時候這樣的做法比較方便, 你可以參考一下
print
的概念(Python3的):這邊的概念就是這樣
其次, 這個做法是寫 decorator 的基礎:
因為不使用這種做法, 你無法應對要修飾的 function 可能千奇百怪的參數
用於 tuple unpacking 時 (Python3)
這個功能很實用:
結論
其實妙處不只這些, 只等待你去發現!
我回答過的問題: Python-QA