ฉันจะคืนค่าสองค่าจากฟังก์ชันใน Python ได้อย่างไร


195

ฉันต้องการคืนค่าสองค่าจากฟังก์ชันในตัวแปรสองตัวที่แยกกัน ตัวอย่างเช่น:

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มันจะคืนค่า a tupleและนี่ไม่ใช่สิ่งที่ฉันต้องการ


โปรดให้ตัวอย่างของการเรียกใช้ฟังก์ชันที่คาดหวังนี้และใช้ค่าส่งคืนเพื่อให้ชัดเจนว่าทำไมคุณไม่ต้องการสิ่งอันดับ
ธ.ค.

2
ประเด็นของลูปในขณะที่คืออะไร?
Sven Marnach

ควรมีelse: continueคำชี้แจงก่อนการส่งคืน
เครื่องโหยหา


ใช่ฉันเพิ่งสังเกตเห็นว่านี่เป็นสิ่งที่ซ้ำกันของstackoverflow.com/questions/38508/ …
lpapp

คำตอบ:


399

คุณไม่สามารถคืนค่าสองค่าได้ แต่คุณสามารถคืนค่า 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)ได้ แต่เครื่องหมายของtuples ถูกสร้างขึ้นโดยเครื่องหมายจุลภาค แต่คุณสามารถใช้ parens เพื่อทำให้โค้ดอ่านง่ายขึ้นหรือแบ่ง tuple เป็นหลายบรรทัด my_i, my_card = select_choice()เช่นเดียวกับสาย

หากคุณต้องการที่จะกลับมามากกว่าสองค่าพิจารณาใช้ชื่อ tuple มันจะช่วยให้ผู้เรียกฟังก์ชั่นในการเข้าถึงเขตข้อมูลของค่าที่ส่งกลับตามชื่อซึ่งอ่านได้ง่าย คุณยังสามารถเข้าถึงรายการของ tuple ตามดัชนี ยกตัวอย่างเช่นในSchema.loadsวิธีขนมหวานผลตอบแทนกรอบซึ่งเป็นUnmarshalResult namedtupleดังนั้นคุณสามารถทำได้:

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

หรือ

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

ในกรณีอื่น ๆ คุณอาจส่งคืน a 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)

27

ฉันต้องการคืนค่าสองค่าจากฟังก์ชันในตัวแปรสองตัวที่แยกกัน

คุณคาดหวังให้มันเป็นอย่างไรเมื่อวางสาย? คุณไม่สามารถเขียนได้a = select_choice(); b = select_choice()เพราะจะเรียกใช้ฟังก์ชันสองครั้ง

ค่าจะไม่ถูกส่งกลับ "ในตัวแปร"; นั่นไม่ใช่วิธีที่ Python ทำงาน ฟังก์ชั่นคืนค่า (วัตถุ) ตัวแปรเป็นเพียงชื่อของค่าในบริบทที่กำหนด เมื่อคุณเรียกใช้ฟังก์ชันและกำหนดค่าส่งคืนที่ใดที่หนึ่งสิ่งที่คุณกำลังทำคือให้ชื่อที่ได้รับในบริบทการโทร ฟังก์ชั่นไม่ได้ใส่ค่า "ลงในตัวแปร" สำหรับคุณการมอบหมายทำ (ไม่ต้องสนใจว่าตัวแปรไม่ใช่ "พื้นที่เก็บข้อมูล" สำหรับค่า แต่อีกครั้งเป็นเพียงชื่อ)

เมื่อฉันพยายามใช้return i, cardมันจะคืนค่า a tupleและนี่ไม่ใช่สิ่งที่ฉันต้องการ

จริงๆแล้วมันเป็นสิ่งที่คุณต้องการ สิ่งที่คุณต้องทำคือtupleแยกอีกครั้ง

และฉันต้องการใช้ค่าเหล่านี้แยกกัน

ดังนั้นเพียงแค่หยิบค่าออกมาจาก tupleดังนั้นเพียงแค่คว้าค่าออกจาก

วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเปิดออก:

a, b = select_choice()

1
ขอบคุณที่อธิบายว่า "ทำไมจึงเป็นเช่นนั้น" คำตอบที่ดีที่สุด
Edward Coelho

17

ฉันคิดว่าสิ่งที่คุณต้องการคือ tuple หากคุณใช้return (i, card)คุณสามารถรับผลลัพธ์ทั้งสองนี้ได้โดย:

i, card = select_choice()

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

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

ตอนนี้คุณสามารถทำทุกสิ่งที่คุณต้องการด้วย tuple ของคุณ



2

และนี่คือทางเลือกหากคุณกลับมาเป็นรายการคุณสามารถรับค่าได้ง่าย

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

values = select_choice()

print values[0]
print values[1]


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.