13

開箱/圖示操作符***在python版本(2.7,3.x < 3.5和3.x> = 3.5)上的適用性差異很大。python的splat運算符*和**在哪裏有效?

例如:

        | 2.7 | 3.1-3.4 | 3.5 
---------------------------------------------------------------------- 
function(*args)       ✓   ✓   ✓  

x, *y, z = [1, 2, 3, 4, 5]    x   ✓   ✓  

{**x, **y}        x   x   ✓  

是否有各個版本之間的多個差異,我已經錯過了嗎?我正在瀏覽PEP和Readmes,但文檔沒有詳細說明。

回答

17

大約在1992年(不知道Python版本)。這是來自Python 1.0.1的語法文件。

# 06-Apr-92: 
# Use only '*' for varargs list 

# 31-Mar-92: 
# Tighten syntax for try statements 

# 27-Feb-92: 
# Allow NEWLINE* after eval input 

# 16-Jan-92: 
# Added '*' as alternative for '+' in varargs syntax 
# (Not sure which alternative is better yet.) 

# 11-Jan-92: 
# Variable length argument list syntax added: def f(a, b, +rest): ... 

Python 1.4+

關鍵參數:用Python編寫的函數和方法,現在可以使用 形式keyword = value的關鍵字參數調用。

Python 1.6+

現在有可以使用的,而不是apply() 功能特殊的語法。 f(*args, **kwds)相當於apply(f, args, kwds)。您 也可以使用變體f(a1, a2, *args, **kwds),您可以保留一個 或另一個:f(*args)f(**kwds)

Python <= 2.7

元組參數拆包是在Python 3.0移除。

PEP 3113元組參數 拆包刪除。您不能再寫def foo(a, (b, c)): ...。 改爲使用def foo(a, b_c): b, c = b_c

Python 3.0+

PEP 3132擴展可迭代 開箱。您現在可以編寫像a, b, *rest = some_sequence這樣的東西。甚至*rest, a = stuff。其餘對象始終是 a(可能爲空)列表;右側可以是任何可迭代的。

PEP 3102關鍵字參數。參數列表中 *args之後發生的命名參數必須在調用中使用關鍵字語法指定。您還可以使用裸*在參數列表中,表示 您不接受可變長度參數列表,但你有 只有關鍵字的參數

Python 3.5+

PEP 448 ,額外的 解包概括。


據我所知,沒有單一的頁面,列出了所有的語法變化。每個版本的語法更改在What's new in Python部分列出,或者您可以檢查每個版本的語法規範以查看差異。

+0

好的研究;什麼時候引入'varargs'語法(*名稱)?這在Python 3之前的日期(或可能是backported) –

+0

@Chris_Rands你是否指的是在分配中使用的那個? –

+0

我的意思是'max(*(1,2,3))' –