Làm cách nào tôi có thể trả về hai giá trị từ một hàm trong Python?


194

Tôi muốn trả về hai giá trị từ một hàm trong hai biến riêng biệt. Ví dụ:

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

Và tôi muốn có thể sử dụng các giá trị này một cách riêng biệt. Khi tôi cố gắng sử dụng return i, card, nó trả về a tuplevà đây không phải là điều tôi muốn.


Vui lòng cung cấp một ví dụ về cách gọi hàm dự kiến ​​này và sử dụng (các) giá trị trả về của nó, để nó làm rõ lý do tại sao bạn không muốn bộ dữ liệu.
mất

2
Điểm của vòng lặp while là gì?
Sven Marnach 17/03/2016

nên có một else: continuebáo cáo trước khi trả lại
máy khao khát


Có, tôi cũng nhận thấy rằng đây là bản sao của stackoverflow.com/questions/38508/ trên
lpapp

Câu trả lời:


398

Bạn không thể trả về hai giá trị, nhưng bạn có thể trả về a tuplehoặc a listvà giải nén nó sau cuộc gọi:

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

my_i, my_card = select_choice()

Trên dòng return i, card i, cardcó nghĩa là tạo ra một tuple. Bạn cũng có thể sử dụng dấu ngoặc đơn như thế return (i, card), nhưng các bộ dữ liệu được tạo bằng dấu phẩy, vì vậy parens không bắt buộc. Nhưng bạn có thể sử dụng parens để làm cho mã của bạn dễ đọc hơn hoặc phân chia bộ dữ liệu trên nhiều dòng. Áp dụng tương tự cho dòng my_i, my_card = select_choice().

Nếu bạn muốn trả về nhiều hơn hai giá trị, hãy xem xét sử dụng bộ dữ liệu có tên . Nó sẽ cho phép người gọi của hàm truy cập các trường của giá trị được trả về theo tên, dễ đọc hơn. Bạn vẫn có thể truy cập các mục của bộ dữ liệu theo chỉ mục. Ví dụ trong Schema.loadsphương thức khung Marshmallow trả về a UnmarshalResultlà a namedtuple. Vì vậy, bạn có thể làm:

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

hoặc là

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

Trong các trường hợp khác, bạn có thể trả về a dicttừ hàm của mình:

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

Nhưng bạn có thể muốn xem xét trả về một thể hiện của lớp tiện ích, bao bọc dữ liệu của bạn:

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

Tôi muốn trả về hai giá trị từ một hàm trong hai biến riêng biệt.

Bạn mong đợi nó trông như thế nào khi kết thúc cuộc gọi? Bạn không thể viết a = select_choice(); b = select_choice()bởi vì điều đó sẽ gọi hàm hai lần.

Các giá trị không được trả về "trong các biến"; đó không phải là cách Python hoạt động. Hàm trả về giá trị (đối tượng). Một biến chỉ là một tên cho một giá trị trong một bối cảnh nhất định. Khi bạn gọi một hàm và gán giá trị trả về ở đâu đó, điều bạn đang làm là đặt tên giá trị nhận được trong ngữ cảnh gọi. Hàm không đặt giá trị "vào một biến" cho bạn, phép gán thực hiện (đừng bận tâm rằng biến đó không phải là "lưu trữ" cho giá trị, nhưng một lần nữa, chỉ là một tên).

Khi tôi cố gắng sử dụng return i, card, nó trả về a tuplevà đây không phải là điều tôi muốn.

Trên thực tế, đó chính xác là những gì bạn muốn. Tất cả bạn phải làm là tupletách rời một lần nữa.

Và tôi muốn có thể sử dụng các giá trị này một cách riêng biệt.

Vì vậy, chỉ cần lấy các giá trị ra khỏi tuple.

Cách dễ nhất để làm điều này là bằng cách giải nén:

a, b = select_choice()

1
Cảm ơn đã giải thích "tại sao nó lại như vậy". Câu trả lời hay nhất imo.
Edward Coelho

17

Tôi nghĩ bạn những gì bạn muốn là một tuple. Nếu bạn sử dụng return (i, card), bạn có thể nhận được hai kết quả này bằng cách:

i, card = select_choice()

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

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

bây giờ bạn có thể làm mọi thứ bạn thích với bộ dữ liệu của bạn.



2

Và đây là một sự thay thế. Nếu bạn trở lại dưới dạng danh sách thì thật đơn giản để có được các giá trị.

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

values = select_choice()

print values[0]
print values[1]

2

bạn có thể thử cái này

class select_choice():
    return x, y

a, b = test()

1

Bạn cũng có thể trả về nhiều hơn một giá trị bằng cách sử dụng danh sách. Kiểm tra mã dưới đây

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.