web-dev-qa-db-ja.com

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

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

184
Lycon

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)のように括弧を使うこともできますが、タプルはコンマで作成されるので、親は必須ではありません。しかし、あなたはあなたのコードをもっと読みやすくしたり、Tupleを複数の行に分割するために親を使うことができます。同じことが行my_i, my_card = select_choice()にも当てはまります。

3つ以上の値を返したい場合は、 という名前のTuple を使用することを検討してください。それは関数の呼び出し側が名前によって戻り値のフィールドにアクセスすることを可能にします。あなたはまだインデックスによってタプルのアイテムにアクセスすることができます。例えば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, ...}

しかし、あなたはあなたのデータをラップするユーティリティクラスのインスタンスを返すことを考慮したいかもしれません:

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)
374
warvariuc

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

あなたはそれが呼び出し側でどのように見えると期待しますか? a = select_choice(); b = select_choice()を書くことはできません。なぜならそれは関数を二度呼び出すからです。

値は「変数内に」返されません。それはPythonが機能する方法ではありません。関数は値(オブジェクト)を返します。変数は、与えられたコンテキストにおける値の単なる名前です。関数を呼び出して戻り値をどこかに代入するとき、あなたがしているのは呼び出し側コンテキストで受け取った値に名前を付けることです。この関数はあなたに代わって値を「変数に」入れるのではなく、代入がします(変数が値を「格納する」のではなく、単に名前になることを気にする必要はありません)。

私がreturn i, cardを使おうとしたとき、それはTupleを返します、そして、これは私が欲しいものではありません。

実際には、それはまさにあなたが望むものです。あなたがしなければならないのはTupleを再び分解することです。

そして私はこれらの値を別々に使えるようにしたいのです。

Tupleから値を取得するだけです。

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

a, b = select_choice()
25
Karl Knechtel

私はあなたが望むものがタプルだと思います。 return (i, card)を使うと、次の2つの結果が得られます。

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

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

今、あなたはあなたのタプルであなたが好きなことすべてをすることができます。

8
Amin
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
2
user8541092

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

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

values = select_choice()

print values[0]
print values[1]
1
praveen

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

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
kaushik karan