2

私は、lenがレシーバーの量に依存する動的リストを返すことができる「奇妙な」(しかし私の場合は便利な)関数を実行しようとしていました。

例えば:

f()はNoneの動的リストを返すので、次のことができます。

a = f()  => a = None
a, b = f()  => a=b= None
(a, b) = f() => a=b= None
(a, b, c, d, e, f) = f()  => a=b=c=d=e=f= None

これはジェネレーターの理解またはイテレーターを介して行われる可能性があると思いますが、受信機の量を取得する方法がブロックされました。多分私は間違った方向にいました。ヒントを教えていただけますか?

どんな助けでもありがたいです。

どうもありがとう、

Tiezhen

4

6 に答える 6

3

これはPythonでは不可能です。右側のサイトの関数は、呼び出されたコンテキストを認識していません。右側のサイトは、名前のバインドが行われる前に評価されます。

于 2011-11-29T15:56:07.320 に答える
1

Python 3を使用してもかまわない場合は、次のように、不要なものを無視できます。

a, b, c, d, *_ = (x for x in range(100))
于 2011-11-29T16:12:18.887 に答える
1

残念ながら、Pythonは、Pythonicの「許可よりも許しを求める方が簡単」なアプローチを使用して、返されたタプルを解凍します。つまり、ステートメントがある場合:

a,b,c = f()

舞台裏では、次のようなことを行っています。

try:
    a = returned[0]
    b = returned[1]
    c = returned[2]
except IndexError:
    raise ValueError('need more than k values to unpack')

try:
    _ = returned[4]
except IndexError:
    pass
else:
    raise ValueError('too many values to unpack')

したがって、返される値の数を動的に検出しています。残念ながら、それは私たちが賢く、変数の戻り値を処理するための新しいタイプを作成することを妨げます:

class VariableReturn(object):
    def __getitem__(self, index):
        return ...

Python 3では、要求していることを実行できますが、呼び出される関数ではなく、呼び出し元に負担がかかります。この関数は常に同じ数の結果を返す必要がありますが、このStackOverflowの質問に示すように、拡張タプルアンパックを使用して残りの結果をトラップします。

このアプローチを使用すると、必要な数の結果を返すことができますが、最大の場合は常に少なくとも必要な数だけ返す必要があります。残りは後続のタプルにパックされます。

a,*others = f()
a,b,*others = f()
a,b,c,*others = f()
于 2011-11-29T17:17:18.553 に答える
0

これを試して:

def f(n):
    return (None, ) * n

例えば:

a, b, c = f(3)

... Pythonでは、代入の左側にある変数の数を知る方法がないため、これは可能な限りのことです。

于 2011-11-29T16:00:36.787 に答える
0

できません。

Pythonの関数は、1つの値のみを返します。それ以上のように見えることもありますが、それでも1つの値、つまりタプルにすぎません。複数の割り当ては、タプルの解凍プロセスです。

次に、質問を言い換えることができます。解凍する必要のある値の数に応じて、さまざまな長さのタプルのように機能するオブジェクトを作成できますか?そして、それは単にオプションとして利用可能にされていません。

おそらく私が考えることができる最も近いのは、ジェネレーターを使用して、次のコマンドで必要な数のアイテムを取得することitertools.isliceです。

a = itertools.count()
x, y, z = itertools.islice(a, 3) # 0, 1, 2
u, v = itertools.islice(a, 2)    # 3, 4

しかし、それは期待されていたものとはかなりかけ離れています。

于 2011-11-29T16:15:49.353 に答える
0

かなり良くありませんが、おそらくこれはあなたを助けます:

def f(x):
    for i in x:
        globals()[i] = None

f(['a','b','c'])
于 2011-11-29T16:23:00.583 に答える