2013-08-02 28 views
2

我有點困惑。我們來創建一個名爲x的函數。我知道,通過將*放在y之前,這意味着我們可以添加儘可能多的參數。混淆python星號符號的雙重用法(作爲函數參數或作爲函數定義)

def x(*y): 
    return y 

但是,

案例1:

>>> x(1, 2) 
(1, 2) 

案例2: 我們之前它傳遞一個列表[1,2]有星號:

>>> x(*[1,2]) 
(1, 2) 

看來,一個星號有兩種用途:

  1. 對於允許在函數多個參數 - 本質上把它們放入一個列表
  2. 如果做兩次,「掰開」列表爲單獨的項目

這是爲什麼?爲什麼我不能這樣做:* a * b?

回答

3

函數定義*用於收集元組中的所有位置參數,在函數調用中*解包一個iterable並將其作爲位置參數傳遞給它。

如果*a*b你試圖解開2個iterables /迭代器ab那麼正確的做法是:

>>> a = [1, 2, 4] 
>>> b = 'foo' 
>>> from itertools import chain 
def func(*x): 
    print x 
...  
>>> func(*chain(a,b)) #chain will work for both iterators and iterables 
(1, 2, 4, 'f', 'o', 'o') 

如果兩個ab是相同類型的並且是可迭代的,那麼你還可以使用:

>>> a = [1, 2, 4] 
>>> b = [0,1] 
>>> func(*(a + b)) 
(1, 2, 4, 0, 1) 
3

函數定義中的星號與函數調用中的星號完全分離。你不需要兩顆星,打破了列表爲單獨的參數:

def f(a, b, c): 
    return a*b + c 

f(*(1, 2, 3)) # returns 5 

在一個定義,一個星號的參數接收到任何位置參數不適合申報位置參數,包裹在一個元組。在一次調用中,Python遍歷一個加星號的參數,並將這些元素單獨作爲參數傳遞。這些功能有時可以一起使用,但很少會用一個帶星號的參數來定義一個函數,以便始終將它傳遞給一個帶星號的參數。