13

アンパック/スプラット演算子***は、Pythonバージョン(2.7,3.xx< 3.5と3.x> = 3.5)での適用性が大きく異なります。例えばここで、pythonのスプラット演算子*と**は有効ですか?

        | 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)のバリエーションを使用できます。 または他の1つは、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。残りのオブジェクトは常に (おそらく空の)リストです。右側は任意の反復可能であってもよい。

PEP 3102キーワードのみの引数。パラメータリスト内の *argsの後に名前付きパラメータが発生する場合は、コールのキーワード構文を使用して指定する必要があります。また、あなたは可変長引数リストを受け入れない を示すために、パラメータリストで裸*を使用できますが、 キーワードのみの引数

Python 3.5+

PEP 448を持っています、追加の 展開の一般化。


は、私の知る限りでは、すべての構文の変更を示しています単一のページはありません。バージョンごとに構文の変更がWhat's new in Pythonセクションに記載されているか、または各リリースの文法仕様を確認して相違点を確認できます。

+0

ニースの研究; 'varargs'構文(* name)が導入されたのはいつですか?これはPython 3より前です(またはバックポートされた可能性があります) –

+0

@Chris_Randsあなたは割り当てに使用されたものを意味しましたか? –

+0

私は 'max(*(1,2,3))'のようになりました –

関連する問題