[英]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)
單個星號似乎有兩種用途:
為什么是這樣? 我為什么不能做這樣的事情:* a * b?
函數定義中的星號與函數調用中的星號完全分開。 您不需要兩顆星就可以將列表分成單獨的參數:
def f(a, b, c):
return a*b + c
f(*(1, 2, 3)) # returns 5
在定義中,加星號的參數將接收不適合聲明的位置參數的任何位置參數,並包裝在元組中。 在一次調用中,Python遍歷加星號的參數,並將元素作為參數分別傳遞。 這些功能有時會一起使用,但是很少要僅使用帶星號的參數來定義帶有星號參數的函數。
在函數定義中, *
用於收集元組中的所有位置參數,在函數調用中, *
拆解可迭代對象並將其項作為位置參數傳遞。
如果通過*a*b
嘗試解包兩個迭代器a
和b
則正確的方法是:
>>> 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')
如果a
和b
屬於同一類型並且可迭代,則還可以使用:
>>> a = [1, 2, 4]
>>> b = [0,1]
>>> func(*(a + b))
(1, 2, 4, 0, 1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.