*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?而且形参不是可以传递任意类型么?这样我写成:
a = (1,2,3,4) def test(a): print a print a[1]
加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。那么*和**这玩意到底有什么用呢?
认证0级讲师
我觉得会有无用之感很大的一点在于我们常陷入一种思考情境:
写 function 的人 跟 用 function 的人是同一人, 也就是我
因为如果写跟用为同一人, 那么介面怎么设计当然可以很自由, 选用 * 或是直接用 list 都没差* 或是直接用 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
print
这两个东西可是相当有用的呢!
用于 function arguments 时
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) ^^^^^^^^
今天我给你一组 list 的 data lst 和 dict 的 data dic:
def mydeco(func): def newfunc(*args, **kwargs): return func(*args, **kwargs) return newfunc
>>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end') >>> s, *nums, e = t >>> s, nums, e ('start', [1, 2, 3, 4, 5], 'end')
补充
我觉得会有无用之感很大的一点在于我们常陷入一种思考情境:
因为如果写跟用为同一人, 那么介面怎么设计当然可以很自由, 选用
*
或是直接用 list 都没差*
或是直接用 list 都沒差但當今天我們是使用別人的 API 或是要寫 function 給別人用時, 就沒那麼大的彈性了
這個時候,
*
可以幫助我們許多這兩個東西可是相當有用的呢!
舉幾個例子示範一下
用於 function arguments 時
假設有個 function
intro
:今天我給你一組 list 的 data
lst
和 dict 的 datadic
:不用
*
或**
你可能要:使用
*
和**
:用於 function params 時
今天我們要寫一個加法 function:
如果要擴充到三個數相乘:
這邊有兩個問題:
一個是參數列可能很長
一個是 Python 不允許多載, 所以不能使用同一個 function name
但是
*
可以解決這個問題:當然你可能覺得這邊我也可以設計成參數是 list 或 tuple, 但有些時候這樣的做法比較方便, 你可以參考一下
但当今天我们是使用别人的 API 或是要写 function 给别人用时, 就没那么大的弹性了print
*
可以帮助我们许多这两个东西可是相当有用的呢!
举几个例子示范一下
用于 function arguments 时
假设有个 function
intro
:今天我给你一组 list 的 data
lst
和 dict 的 datadic
:不用
*
或**
你可能要:*
和**
: rrreee 用于 function params 时🎜 🎜今天我们要写一个加法 function:🎜 rrreee 🎜如果要扩充到三个数相乘:🎜 rrreee 🎜这边有两个问题:🎜*
可以解决这个问题:🎜 rrreee 🎜当然你可能觉得这边我也可以设计成参数是 list 或 tuple, 但有些时候这样的做法比较方便, 你可以参考一下print
的概念(Python3的):🎜 rrreee 🎜这边的概念就是这样🎜 🎜其次, 这个做法是写 decorator 的基础:🎜 rrreee 🎜因为不使用这种做法, 你无法应对要修饰的 function 可能千奇百怪的参数🎜 🎜用于 tuple unpacking 时 (Python3)🎜 🎜这个功能很实用:🎜 rrreee 🎜结论🎜 🎜其实妙处不只这些, 只等待你去发现!🎜 🎜 🎜🎜我回答过的问题🎜: Python-QA🎜