web-dev-qa-db-ja.com

Pythonバージョン2.7のスター展開

ここ で述べたように、スターを使用して未知数の変数(関数など)をアンパックできますが、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で長さの不明なアンパックを行うには独自の関数が必要ですか?

34
beardc

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
31
Andbdrew
(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。

2
Pete Cacioppi

ex13.pyへの回答

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')
0
Haminger 2012