Bagaimana saya bisa mengembalikan dua nilai dari fungsi dengan Python?

194

Saya ingin mengembalikan dua nilai dari suatu fungsi dalam dua variabel yang terpisah. Sebagai contoh:

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

Dan saya ingin dapat menggunakan nilai-nilai ini secara terpisah. Ketika saya mencoba menggunakan return i, card, ia mengembalikan a tupledan ini bukan yang saya inginkan.

Lycon
sumber
Berikan contoh pemanggilan fungsi yang diharapkan ini dan gunakan nilai pengembaliannya, sehingga menjelaskan mengapa Anda tidak ingin tupel.
bereal
2
Apa gunanya loop sementara?
Sven Marnach
harus memiliki else: continuesebelum pernyataan pengembalian
kerinduan mesin
Ya, saya juga baru memperhatikan bahwa ini adalah duplikat dari stackoverflow.com/questions/38508/…
lpapp

Jawaban:

398

Anda tidak dapat mengembalikan dua nilai, tetapi Anda bisa mengembalikan a tupleatau a listdan membukanya setelah panggilan:

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

my_i, my_card = select_choice()

On line return i, card i, cardberarti membuat tuple. Anda juga dapat menggunakan tanda kurung seperti return (i, card), tetapi tupel dibuat dengan koma, jadi paren tidak wajib. Tetapi Anda dapat menggunakan parens untuk membuat kode Anda lebih mudah dibaca atau untuk membagi tuple menjadi beberapa baris. Hal yang sama berlaku untuk saluranmy_i, my_card = select_choice() .

Jika Anda ingin mengembalikan lebih dari dua nilai, pertimbangkan untuk menggunakan tuple bernama . Ini akan memungkinkan pemanggil fungsi untuk mengakses bidang nilai yang dikembalikan dengan nama, yang lebih mudah dibaca. Anda masih dapat mengakses item tuple berdasarkan indeks. Sebagai contoh dalam Schema.loadsmetode kerangka kerja Marshmallow mengembalikan suatu UnmarshalResultyang namedtuple. Jadi kamu bisa melakukan:

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

atau

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

Dalam kasus lain, Anda dapat mengembalikan a dictdari fungsi Anda:

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

Tetapi Anda mungkin ingin mempertimbangkan untuk mengembalikan instance kelas utilitas, yang membungkus data Anda:

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)
warvariuc
sumber
26

Saya ingin mengembalikan dua nilai dari suatu fungsi dalam dua variabel yang terpisah.

Seperti apa yang Anda harapkan di ujung telepon? Kamu tidak bisa menulisa = select_choice(); b = select_choice() karena itu akan memanggil fungsi dua kali.

Nilai tidak dikembalikan "dalam variabel"; itu bukan cara kerja Python. Fungsi mengembalikan nilai (objek). Variabel hanyalah nama untuk nilai dalam konteks yang diberikan. Saat Anda memanggil suatu fungsi dan menetapkan nilai balik di suatu tempat, yang Anda lakukan adalah memberi nilai yang diterima nama dalam konteks panggilan. Fungsi tidak menempatkan nilai "ke dalam variabel" untuk Anda, tugasnya (tidak peduli bahwa variabel itu bukan "penyimpanan" untuk nilai, tetapi sekali lagi, hanya nama).

Ketika saya mencoba menggunakan return i, card, ia mengembalikan a tupledan ini bukan yang saya inginkan.

Sebenarnya, itulah yang Anda inginkan. Yang harus Anda lakukan adalah tuplemembongkar lagi.

Dan saya ingin dapat menggunakan nilai-nilai ini secara terpisah.

Jadi ambil saja nilai dari tuple .

Cara termudah untuk melakukan ini adalah dengan membongkar:

a, b = select_choice()
Karl Knechtel
sumber
1
Terima kasih telah menjelaskan "mengapa seperti ini". Jawaban terbaik imo.
Edward Coelho
17

Saya pikir Anda yang Anda inginkan adalah tuple. Jika Anda menggunakan return (i, card), Anda bisa mendapatkan dua hasil ini dengan:

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

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

sekarang Anda dapat melakukan semua yang Anda suka dengan tuple Anda.

Amin Jalali
sumber
5
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
pengguna8541092
sumber
2

Dan ini merupakan alternatif. Jika Anda kembali sebagai daftar maka mudah untuk mendapatkan nilai.

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

values = select_choice()

print values[0]
print values[1]
Praveen
sumber
2

Anda bisa mencoba ini

class select_choice():
    return x, y

a, b = test()
samuel161
sumber
1

Anda dapat mengembalikan lebih dari satu nilai menggunakan daftar juga. Periksa kode di bawah ini

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