1. ホーム
  2. パイソン

[解決済み】Pythonで関数から2つの値を返すにはどうすればいいですか?

2022-04-11 21:17:22

質問

ある関数から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 これは私が欲しいものではありません。

どのように解決するのですか?

2つの値を返すことはできませんが tuple または 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() .

2つ以上の値を返したい場合は という名前のタプル . これにより、関数の呼び出し元は返される値のフィールドに名前でアクセスできるようになり、より読みやすくなります。タプルの項目にはインデックスでアクセスすることもできます。例えば Schema.loads メソッドMarshmallowフレームワークが返す 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, ...}

しかし、データをラップしたユーティリティクラス(またはPydantic/dataclassモデルのインスタンス)のインスタンスを返すことを考慮したいかもしれません。

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)