파이썬에서 함수에서 두 값을 어떻게 반환 할 수 있습니까?


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, carda가 반환 tuple되고 이것이 내가 원하는 것이 아닙니다.


튜플을 원하지 않는 이유를 명확하게 알 수 있도록이 예상 함수를 호출하고 반환 값을 사용하는 예를 제공하십시오.
bereal

2
while 루프의 요점은 무엇입니까?
Sven Marnach 2014 년

해야한다 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)있지만 튜플은 쉼표로 작성되므로 괄호는 필수가 아닙니다. 그러나 parens를 사용하여 코드를 더 읽기 쉽게 만들거나 튜플을 여러 줄로 나눌 수 있습니다. line에도 동일하게 적용됩니다 my_i, my_card = select_choice().

세 개 이상의 값을 반환하려면 명명 된 tuple 사용을 고려하십시오 . 함수 호출자가 이름으로 리턴 된 값의 필드에 액세스 할 수있게되므로 더 읽기 쉽습니다. 여전히 색인으로 튜플의 항목에 액세스 할 수 있습니다. 예를 들어, Schema.loadsMarshmallow 프레임 워크에서는 a UnmarshalResult를 a 로 반환 합니다 namedtuple. 그래서 당신은 할 수 있습니다 :

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

또는

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

다른 경우에는 dict함수에서 a 를 반환 할 수 있습니다.

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()함수를 두 번 호출하기 때문에 작성할 수 없습니다 .

값은 "변수에서"반환되지 않습니다. 그것은 파이썬이 작동하는 방식이 아닙니다. 함수는 값 (객체)을 반환합니다. 변수는 주어진 컨텍스트에서 값의 이름 일뿐입니다. 함수를 호출하고 어딘가에 반환 값을 할당하면 수행중인 작업은 호출 된 컨텍스트에서 수신 된 값에 이름을 지정하는 것입니다. 이 함수는 값을 "변수에"넣지 않고 할당을 수행합니다 (변수가 값에 대해 "저장"되지 않고 다시 이름 일 뿐이라는 것을 염두에 두지 마십시오).

내가 사용하려고하면 a를 return i, card반환 tuple하고 이것이 내가 원하는 것이 아닙니다.

실제로, 그것은 정확히 당신이 원하는 것입니다. 당신이해야 할 일은 tuple다시 떨어져 나가는 것입니다.

그리고이 값을 별도로 사용할 수 있기를 원합니다.

따라서에서 값을 가져옵니다 tuple.

가장 쉬운 방법은 포장을 푸는 것입니다.

a, b = select_choice()

1
"왜 그런지"를 설명해 주셔서 감사합니다. 최고의 답변 imo.
Edward Coelho 2016 년

17

나는 당신이 원하는 것이 튜플이라고 생각합니다. 를 사용 return (i, card)하면 다음 두 가지 결과를 얻을 수 있습니다.

i, card = select_choice()

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

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

이제 튜플로 원하는 모든 것을 할 수 있습니다.


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

2

그리고 이것은 대안입니다. 목록으로 돌아 오는 경우 값을 얻는 것이 간단합니다.

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

values = select_choice()

print values[0]
print values[1]

2

당신은 이것을 시도 할 수 있습니다

class select_choice():
    return x, y

a, b = test()

1

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.