簡體   English   中英

令人困惑的python星號符號的雙重用法(作為函數參數或函數定義)

[英]Confusing double usage of python asterisk notation (as a function argument, or as a function definition)

我有點困惑。 讓我們創建一個名為x的函數。 我知道通過將*放在y之前,這意味着我們可以添加任意數量的參數。

def x(*y):
    return y

然而。

情況1:

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

情況2:讓我們傳遞一個帶有星號的列表[1,2]:

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

單個星號似乎有兩種用途:

  1. 為了在函數中允許多個參數-本質上將它們放入列表中
  2. 如果執行兩次,則將列表“分解”為單獨的項目

為什么是這樣? 我為什么不能做這樣的事情:* a * b?

函數定義中的星號與函數調用中的星號完全分開。 您不需要兩顆星就可以將列表分成單獨的參數:

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

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

在定義中,加星號的參數將接收不適合聲明的位置參數的任何位置參數,並包裝在元組中。 在一次調用中,Python遍歷加星號的參數,並將元素作為參數分別傳遞。 這些功能有時會一起使用,但是很少要僅使用帶星號的參數來定義帶有星號參數的函數。

在函數定義中, *用於收集元組中的所有位置參數,在函數調用中, *拆解可迭代對象並將其項作為位置參數傳遞。

如果通過*a*b嘗試解包兩個迭代器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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM