[英]excess positional arguments, unpacking argument lists or tuples, and extended iterable unpacking
這個問題會很長,所以我先發制人道歉。
在Python中,我們可以在以下三種情況下使用*:
I.在定義一個我們想要用任意數量的參數調用的函數時,例如在這個例子中 :
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
在這種情況下,多余的位置參數被收集到元組中 。
II。 相反的情況是,當參數已經在列表或元組中時 ,我們希望為需要單獨位置參數的函數調用解包它們,例如在本例中 :
>>> range(3, 6) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args) # call with arguments unpacked from a list
[3, 4, 5]
III。 從Python 3開始,*也用於擴展列表或元組解包的上下文中,例如在這個示例中用於元組:
>>> a, *b, c = range(5)
>>> b
[1, 2, 3]
或列表:
>>> [a, *b, c] = range(5)
>>> b
[1, 2, 3]
在這兩種情況下,來自可解包的所有未分配給任何強制表達式的項目都將分配給列表 。
所以這就是問題:如果我將額外的args收集到元組中 ,而在案例III中 ,額外的項目被分配到列表中 。 這有什么不一樣? 我能找到的唯一解釋是在PEP 3132中說:
討論的可能變化是:
[...]
使加星標的目標成為元組而不是列表。 這與函數的* args一致,但更難以進一步處理結果。
然而,從教學角度來看,缺乏一致性是有問題的,特別是考慮到如果你想處理結果,你總是可以說列表(b)(假設上面例子中的b是一個元組)。 我錯過了什么嗎?
你錯過了一個。
IV。 此外,在Python 3中,參數列表中的裸*
標記位置參數的結束,允許僅關鍵字參數 。
def foo(a, b, *, key = None):
pass
這可以稱為foo(1, 2, key = 3)
但不是foo(1, 2, 3)
。
在Python中,我們可以在以下三種情況下使用
*
:
你的意思是前綴 *
,當然 - 中綴 *
用於乘法。
然而,從教學角度來看,缺乏一致性是有問題的,特別是考慮到如果你想處理結果,你總是可以說列表(b)(假設上面例子中的b是一個元組)。 我錯過了什么嗎?
我會說設計問題(舊的和非常長的牙齒!)是這樣的事實:當你接收任意參數時,你將它們作為一個元組,當一個列表在許多情況下更有用時沒有真正的缺點(在函數調用開銷的上下文中,制作列表而不是元組可能需要的額外處理和內存的微小數量可以忽略不計 - 或者序列解包,就此而言;需要額外的處理和內存列表和元組真的更煩人)。
你可以用元組而不是列表來做很少的事情 - 基本上,只是對它進行哈希處理(用作設置項或字典鍵) - 而列表提供了更多的額外功能,而不僅僅是為了改變目的它... count
和index
等方法也很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.