2012-03-17 10 views
135

2つの別々の変数の関数から2つの値を返したいと思います。たとえば :Pythonの関数から2つの値を返すにはどうすればよいですか?

def select_choice(): 
    loop = 1 
    row = 0 
    while loop == 1: 
     print('''Choose from the following options?: 
       1. Row 1 
       2. Row 2 
       3. Row 3''') 

     row = int(input("Which row would you like to move the card from?: ")) 
     if row == 1: 
      i = 2 
      card = list_a[-1] 
     elif row == 2: 
      i = 1 
      card = list_b[-1] 
     elif row == 3: 
      i = 0 
      card = list_c[-1] 
     return i 
     return card 

そして、私は別に、これらの値を使用できるようにしたいです。 return i, cardを使用しようとすると、tupleが返されます。これは私が望むものではありません。

+0

あなたはタプルをしたくない理由は、それが明確になるように、この期待される機能を呼び出し、その戻り値(複数可)を使用しての例を提供してください。 – bereal

+2

whileループのポイントは何ですか? –

+0

はreturn文の前に 'else:continue'を持たなければなりません –

答えて

290

:オン

def select_choice(): 
    ... 
    return i, card # or [i, card] 

my_i, my_card = select_choice() 

をごreturn (i, card)を使用する場合は、することによって、これらの2つの結果を得ることができます行return i, cardi, cardは、タプルを作成することを意味します。 return (i, card)のようなかっこも使用できますが、タプルはコンマで作成されるため、括弧は必須ではありません。しかし、括弧を使ってコードを読みやすくしたり、複数の行に分割することができます。同じことが行my_i, my_card = select_choice()に適用されます。

2つ以上の値を返す場合は、named tupleを使用することを検討してください。関数の呼び出し元は、返された値のフィールドに名前でアクセスすることができます。これは読みやすくなります。まだタプルの項目にインデックスでアクセスすることはできます。例えば、Schema.loadsの方法では、マシュマロフレームワークは、namedtupleであるUnmarshalResultを返します。だから、あなたが行うことができます。それ以外の場合には

data, errors = MySchema.loads(request.json()) 
if errors: 
    ... 

または

result = MySchema.loads(request.json()) 
if result.errors: 
    ... 
else: 
    # use `result.data` 

を、あなたの関数からdictを返すことがあります。

def select_choice(): 
    ... 
    return {'i': i, 'card': card, 'other_field': other_field, ...} 

をしかし、あなたはAのインスタンスを返すように検討したい場合がありますデータをラップするユーティリティクラス:

class ChoiceData(): 
    def __init__(self, i, card, other_field, ...): 
     # you can put here some validation logic 
     self.i = i 
     self.card = card 
     self.other_field = other_field 
     ... 

def select_choice(): 
    ... 
    return ChoiceData(i, card, other_field, ...) 

choice_data = select_choice() 
print(choice_data.i, choice_data.card) 
15

私はあなたが望むのはタプルだと思います。あなたは2つの値を返すことはできませんが、あなたはtuplelistを返し、呼び出しの後にそれを解凍することができます

i, card = select_choice() 
7
def test(): 
    .... 
    return r1, r2, r3, .... 

>> ret_val = test() 
>> print ret_val 
(r1, r2, r3, ....) 

あなたのタプルで好きなことをすべて実行できます。

23

2つの別々の変数の関数から2つの値を返したいと思います。

呼び出し側でどのように見えると思いますか? a = select_choice(); b = select_choice()を書くことはできません。これは、関数が2回呼び出されるためです。

値は「変数」には戻されません。それはPythonの仕組みではありません。関数は値(オブジェクト)を返します。変数は、指定されたコンテキスト内の値の単なる名前です。関数を呼び出して戻り値をどこかに代入するときは、受け取った値に呼び出しコンテキストの名前を渡します。この関数は値を "変数に"入れません。代入は行います(変数は値の "記憶域"ではなく、名前だけです)。

私はreturn i, cardを使用するようにしようとしたとき、それはtupleを返し、これは私が欲しいものではありません。

実際、あなたが望むものです。あなたがしなければならないことは、tupleをもう一度離れることです。

これらの値を別々に使用できるようにしたいと考えています。

tupleの値を取得してください。

これを行う最も簡単な方法は開梱である:

a, b = select_choice() 
+1

"なぜそれがそうであるのか"を説明してくれてありがとう。 ベストアンサー –

0

ます。また、リストを使用して複数の値を返すことができます。

def newFn(): #your function 
    result = [] #defining blank list which is to be return 
    r1 = 'return1' #first value 
    r2 = 'return2' #second value 
    result.append(r1) #adding first value in list 
    result.append(r2) #adding second value in list 
    return result #returning your list 

ret_val1 = newFn()[1] #you can get any desired result from it 
print ret_val1 #print/manipulate your your result 
1

以下のコードをチェックして、これはあなたが、値を取得するのは簡単ですリストとして戻ってきているalternative.Ifです。

def select_choice(): 
    ... 
    return [i, card] 

values = select_choice() 

print values[0] 
print values[1] 
0
def test(): 
    r1 = 1 
    r2 = 2 
    r3 = 3 
    return r1, r2, r3 

x,y,z = test() 
print x 
print y 
print z 


> test.py 
1 
2 
3 
関連する問題