0
import random

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return False
    return example, other_example

この例では、1 つまたは 2 つの変数が返される可能性があります。通常、1 つの変数に対して、2 つの変数 var = some_function()に対して while を使用しvar, var2 = some_function()ます。関数によって返される変数の数を確認するにはどうすればよいですか?

4

5 に答える 5

2

このようなことを試してください:

>>> lis=(1,)[:2] #just one value, 
>>> lis
(1,)


>>> lis=(1,2)[:2]   #two values
>>> lis
(1, 2)


>>> lis=(1,2,3,4,5)[:2]  #any number of values
>>> lis
(1, 2)

# used [:2] here, because you only expect a maximum of 2 values
# use [:] to collect any number of values                  

しかし、このアプローチの唯一の問題は、ステートメントtupleごとに at を返す必要があることです。returnreturn Falsereturn False,

を使用するiter()と、これも常にタプルまたはイテラブルを返すことが期待されます。

>>> ret=((1,))
>>> ret=iter((1,))
>>> a,b=ret.next(),list(ret)[:1]  #used [:1] coz we need to store only 2 elements
>>> a,b
(1, [])


>>> ret=iter((1,2))
>>> a,b=ret.next(),list(ret)[:1]
>>> a,b
(1, [2])

>>> ret=iter((1,2,3,4))
>>> a,b=ret.next(),list(ret)[:1]
>>> a,b
(1, [2])
于 2012-09-30T21:28:01.310 に答える
2

tuple単一の値を返す関数と複数の非タプル値を返す関数の違いを確実に見分ける方法はありません。ただし、関数が を返さないことがわかっている場合はtuple、次のコードを使用して複数の戻り値を確認できます。

return_val = some_function()
if isinstance(return_val, tuple):
    # number of returned values is len(return_val)
    if len(return_val) == 2:
        var, var2 = return_val
else:
    # returned a single non-tuple item
    var = return_val

ただし、これを処理する最善の方法は、さまざまなケースでさまざまな数の値を返さない関数を作成することです。代わりに、次のようなことができます...

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return False, None
    return example, other_example

...関数が常に 2 つの値を返すようにします。または、常に単一のタプルを返し、そのタプルの要素数を確認することもできます (たとえば、空のタプル()または単一の false 値を持つタプルを返します(False,)

于 2012-09-30T21:28:38.013 に答える
1

大幅に異なる型を返す関数を持つことは悪い習慣です。通常、関数がタプルを返す場合、常にタプルを返し、 を返す場合を除いて、常に同じ数のアイテムを持ちますNone。その理由はまさに、あなたがこの質問をするようになったからです。与えられた戻り値を解釈するのは難しいのです。そして、関数を呼び出すすべての場所で、戻り値をデコードするオーバーヘッドが発生します。また、ドキュメントでは、それぞれの場合に期待される出力を説明する必要があります。

かなりの数の合理的な代替手段があります。何らかのコンテキスト、辞書、またはcollections.namedtupleでデータをラップするオブジェクトを返すことができます。または、ほとんどの実際のコードでは、理解しやすいようにさまざまな行に沿って関数に分割することができます。

于 2012-09-30T23:03:08.497 に答える
1
var_returned = some_function()
num_vars = len(vars_returned) if (not vars_returned == False) else 0

三項なら!これはさらに短くすることができます。

vars_returned = 7, 2
num_vars = len(vars_returned) if vars_returned else 0
print(num_vars)
# 2

vars_returned = False
num_vars = len(vars_returned) if vars_returned else 0
print(num_vars)
# 0 
于 2012-09-30T21:29:44.443 に答える
1

これを試してみませんか:

import random

def some_function():
    example = random.randint(0, 1)
    if example == 1:
        other_example = 2
    else:
        return ()
    return example, other_example

この方法では、戻り値として常にタプルを使用できますが、タプルは必要に応じて False としてテストされます。次のように使用します。

answer = some_function()
if answer:
     var1, var2 = answer
于 2012-09-30T21:35:26.473 に答える