5

免責事項: Python 2.6 のソリューションがあれば探しています。

単一の値が渡されたときに単一の値を返す関数、または複数の値が渡されたときにシーケンスを返す関数を探しています。

>>> a = foo(1)
2
>>> b, c = foo(2, 5)
>>> b
3
>>> c
6

明確にするために、これはいくつかの関数呼び出しを単に見栄えを良くするためのものです:

a, = foo(1)

また

a = foo(1)[0]

現在、洗練されていない解決策は、次のようなものです。

def foo(*args):
    results = [a + 1 for a in args]
    return results if len(results) > 1 else results[0]

これをよりクリーンに感じさせるシンタックス シュガー (または関数) はありますか? 次のようなものですか?

def foo(*args):
    return *[a + 1 for a in args]
4

5 に答える 5

7

その if ステートメントを省略できるデコレータをいつでも作成できます。

import functools
def unpacked(method):
    @functools.wraps(method)
    def _decorator(*args):
        result = method(*args)
        return results if len(results) != 1 else results[0]
    return _decorator

使用法:

@unpacked
def foo(*args):
    return [arg + 1 for arg in args]
于 2010-10-27T00:06:08.443 に答える
6

リストに要素が 1 つしかない場合、リストから要素を返す関数を簡単に作成できますscalify。つまり、リストをスカラーにしようとします (名前の由来)。

def scalify(l):
    return l if len(l) > 1 else l[0]

次に、次のように関数で使用できます。

def foo(*args):
    return scalify([a + 1 for a in args])

これでうまくいきますが、私はあなたがそうしないように提案する人たちと一緒です. 理由の 1 つは、少なくとも 2 つの項目を渡したことがわかっていない限り、結果の繰り返しを除外することです。また、リストがある場合は、関数を呼び出すときにリストをアンパックする必要があり、その「リスト性」が失われ、リストが返されない可能性があることがわかります。これらの欠点は、この手法に見られる利点を覆い隠しているように私には思えます.

于 2010-10-27T00:39:44.710 に答える
0

同じ数の引数を持つタプルが欲しいということですか? これは解決策ではありませんか?

return tuple([a + 1 for a in args])

于 2010-10-27T00:06:35.413 に答える
0
def foo(*args):
    return (None, args[0]+1 if args else None, map(lambda a: a + 1, args))[len(args) if len(args) < 3 else 2]

:-) それは地獄です

于 2010-10-27T00:07:45.960 に答える
0

これは0個以上の引数を処理します。それがあなたが探しているものだと思います.

def foo(*args):
    return map(lambda x: x + 1, args) or [None]

編集:0個の引数をアンパックした場合に備えてNoneリストを追加するように修正しました

于 2010-10-27T00:08:43.900 に答える