Pythonの関数から2つの値を返すにはどうすればよいですか?


194

関数から2つの値を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これは私が望むものではありません。


この予想される関数を呼び出し、その戻り値を使用する例を提供してください。これにより、タプルが不要な理由が明確になります。
bereal

2
whileループのポイントは何ですか?
Sven Marnach

else: continuereturnステートメントの前にある必要があります
憧れるマシン


回答:


398

2つの値を返すことはできませんが、a tupleまたはa listを返し、呼び出し後にアンパックすることができます。

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

my_i, my_card = select_choice()

オンラインreturn i, card i, cardとはタプルを作成することを意味します。のようreturn (i, card)に括弧を使用することもできますが、タプルはコンマで作成されるため、括弧は必須ではありません。しかし、括弧を使用してコードを読みやすくしたり、タプルを複数行に分割したりできます。同じことがラインにも当てはまりますmy_i, my_card = select_choice()

3つ以上の値を返す場合は、名前付きタプルの使用を検討してください。これにより、関数の呼び出し元が戻り値のフィールドに名前でアクセスできるようになり、読みやすくなります。インデックスによってタプルのアイテムにアクセスできます。たとえば、Schema.loadsメソッドMarshmallowフレームワークはであるa UnmarshalResultを返しますnamedtuple。だからあなたはできる:

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, ...}

ただし、データをラップするユーティリティクラスのインスタンスを返すことを検討してください。

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)

26

関数から2つの値を2つの別々の変数で返したいのですが。

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

値は「変数として」返されません。これはPythonの動作方法ではありません。関数は値(オブジェクト)を返します。変数は、特定のコンテキストにおける値の単なる名前です。関数を呼び出してどこかに戻り値を割り当てる場合、実行していることは、呼び出したコンテキストで受け取った値に名前を付けることです。関数は値を「変数に」入れませんが、代入は行います(変数は値の「記憶」ではなく、名前だけです)。

を使おうとするとreturn i, card、が返され、tupleこれは私が望むものではありません。

実際、それはまさにあなたが望むものです。あなたがしなければならないすべては、tuple再びバラバラにすることです。

そして、これらの値を個別に使用できるようにしたいと思います。

したがって、から値を取得しますtuple

これを行う最も簡単な方法は、解凍することです。

a, b = select_choice()

1
「なぜそうなのか」を説明していただきありがとうございます。ベストアンサーimo。
エドワードCoelho

17

あなたが欲しいのはタプルだと思います。を使用するとreturn (i, card)、次の2つの結果を得ることができます。

i, card = select_choice()

8
def test():
    ....
    return r1, r2, r3, ....

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

これで、タプルで好きなことがすべてできるようになります。



2

これは代替手段です。リストとして返す場合は、値を取得するのは簡単です。

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

values = select_choice()

print values[0]
print values[1]

2

あなたはこれを試すことができます

class select_choice():
    return x, y

a, b = test()

1

リストを使用して複数の値を返すこともできます。以下のコードを確認してください

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.