关于python*和**的问题

查看:114
本文介绍了关于python*和**的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

*和**为可变形参,但是平时在使用的时候感觉很少能有使用到的情况,有些不是很理解它们的用法和用处场景?
而且形参不是可以传递任意类型么?这样我写成:


a = (1,2,3,4)
def test(a):
    print a
    print a[1]

加不加*貌似没什么区别?字典也是一样只不过变成print['keyname']而已。
那么*和**这玩意到底有什么用呢?

解决方案

補充

我覺得會有無用之感很大的一點在於我們常陷入一種思考情境:

寫 function 的人 跟 用 function 的人是同一人, 也就是我

因為如果寫跟用為同一人, 那麼介面怎麼設計當然可以很自由, 選用 * 或是直接用 list 都沒差

但當今天我們是使用別人的 API 或是要寫 function 給別人用時, 就沒那麼大的彈性了

這個時候, * 可以幫助我們許多


這兩個東西可是相當有用的呢!

舉幾個例子示範一下

用於 function arguments 時

假設有個 function 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 = ['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 params 時

今天我們要寫一個加法 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(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
      ^^^^^^^^

這邊的概念就是這樣

其次, 這個做法是寫 decorator 的基礎:

def mydeco(func):
    def newfunc(*args, **kwargs):
        return func(*args, **kwargs)
    return newfunc

因為不使用這種做法, 你無法應對要修飾的 function 可能千奇百怪的參數

用於 tuple unpacking 時 (Python3)

這個功能很實用:

>>> t = ('start', 1 ,2 ,3 ,4 ,5, 'end')
>>> s, *nums, e = t
>>> s, nums, e
('start', [1, 2, 3, 4, 5], 'end')

結論

其實妙處不只這些, 只等待你去發現!


我回答過的問題: Python-QA

这篇关于关于python*和**的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆