84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4) def test(a): print a print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。那么*和**这玩意到底有什么用呢?
认证0级讲师
我覺得會有無用之感很大的一點在於我們常陷入一種思考情境:
寫 function 的人 跟 用 function 的人是同一人, 也就是我
因為如果寫跟用為同一人, 那麼介面怎麼設計當然可以很自由, 選用 * 或是直接用 list 都沒差
*
但當今天我們是使用別人的 API 或是要寫 function 給別人用時, 就沒那麼大的彈性了
這個時候, * 可以幫助我們許多
這兩個東西可是相當有用的呢!
舉幾個例子示範一下
假設有個 function intro:
intro
def intro(name, age, city, language): print('I am {}. I am {} years old. I live in {}. I love {}'.format( name, age, city, language ))
今天我給你一組 list 的 data lst 和 dict 的 data dic:
lst
dic
lst = ['dokelung', 27, 'Taipei', 'Python'] dic = {'name': 'dokelung', 'age': 27, 'city': 'Taipei', 'language': 'Python'}
不用 * 或 ** 你可能要:
**
test(lst[0], lst[1], lst[2], lst[3]) test(dic['name'], dic['age'], dic['city'], dic['language'])
使用 * 和 **:
test(*lst) test(**dic)
今天我們要寫一個加法 function:
def add2(a, b): return a + b
如果要擴充到三個數相乘:
def add3(a, b, c): return a + b + c
這邊有兩個問題:
一個是參數列可能很長
一個是 Python 不允許多載, 所以不能使用同一個 function name
但是 * 可以解決這個問題:
def add(*n): return sum(n)
當然你可能覺得這邊我也可以設計成參數是 list 或 tuple, 但有些時候這樣的做法比較方便, 你可以參考一下 print 的概念(Python3的):
print
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) ^^^^^^^^
這邊的概念就是這樣
其次, 這個做法是寫 decorator 的基礎:
def mydeco(func): def newfunc(*args, **kwargs): return func(*args, **kwargs) return newfunc
因為不使用這種做法, 你無法應對要修飾的 function 可能千奇百怪的參數
這個功能很實用:
>>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end') >>> s, *nums, e = t >>> s, nums, e ('start', [1, 2, 3, 4, 5], 'end')
其實妙處不只這些, 只等待你去發現!
我回答過的問題: Python-QA
補充
我覺得會有無用之感很大的一點在於我們常陷入一種思考情境:
因為如果寫跟用為同一人, 那麼介面怎麼設計當然可以很自由, 選用
*
或是直接用 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