ここ で述べたように、スターを使用して未知数の変数(関数など)をアンパックできますが、python= 3の場合のみです。
>>> a, *b = (1, 2, 3)
>>> b
[2, 3]
>>> a, *b = (1,)
>>> b
[]
python 2.7で、私が思いつくことができる最高のものは(ひどくはないが、迷惑です)です:
c = (1, 2, 3)
a, b = c[0], c[1:] if len(c) > 1 else []
__future__から除算のようにこれをインポートする方法はありますか、またはpython 2.7で長さの不明なアンパックを行うには独自の関数が必要ですか?
python 2.Xでは、次のことができます:
c = (1, 2, 3)
a, b = c[0], c[1:]
c
に1つのものしかない場合は、c[1:]
は[]
なので、c
に少なくとも1つのメンバーがある限り、機能します。
ただし、c
に少なくとも1つのものが存在することを確認する必要があります。そうしないと、c[0]
によって例外が発生します。
あなたは次のようなことをすることができます:
try:
c = Tuple(c)
a, b = c[0], c[1:]
except TypeError, IndexError:
# c is not iterable, or c is iterable, but it doesn't have any stuff in it.
# do something else
pass
(a,b) = (None, []) if not len(c) else (c[0], c[1:])
また、cが空のシーケンスである場合を処理するためのオプションですが、a、bへの割り当てとして[None]と[]を区別しません。したがって、慎重に使用してください。try/ exceptがおそらく最良です。
空のコンテナを処理するとき、Python 3と2.7の間に実際の違いは見られませんが、Python 3の良い点は、反復可能オブジェクトで動作することです。
これは、cがジェネレーターであることがわかっている場合、2.7で機能します。
a,b = c.next(), c
しかし、解凍の完全な美しさはPython 3。
from sys import argv
script=argv
def Fun(arg1, *argv):
print "First argument :", script
for arg in argv:
print"Your variable is:", arg
Fun('scrpit', 'first', 'second', 'third')