파이썬 다중 반환 값 무시


274

튜플에서 여러 값을 반환하는 Python 함수가 있다고 가정 해보십시오.

def func():
    return 1, 2

임시 변수에 할당하는 대신 결과 중 하나를 무시하는 좋은 방법이 있습니까? 첫 번째 가치에만 관심이 있다면 이것보다 더 좋은 방법이 있습니까?

x, temp = func()

2
나도의 matlab에의 유사 개념에서 오는이의 호기심을 가지고 기능 출력 무시 그들이 사용하는 ~특정 반환 변수를 무시하는 구문으로
jxramos

3
답변으로 오답을 선택
AGP

답변:


241

한 가지 일반적인 규칙은 "_"를 무시하려는 튜플 요소의 변수 이름으로 사용하는 것입니다. 예를 들어 :

def f():
    return 1, 2, 3

_, _, x = f()

89
-1 :이 "컨벤션"은 다른 사람의 코드 ( '_'라는 함수를 정의하는)에 gettext 기능을 추가 할 때 짜증이
나므로

27
좋은 지적. " " 이라는 함수를 설치하는 데있어 gettext의 주장 이 좋은 아이디어 인지는 논란의 여지가 있지만 . 개인적으로, 나는 그것을 조금 못 생겼습니다. 어쨌든, " "를 폐기 변수로 사용하는 것이 널리 퍼져 있습니다.
Brian Clapper

25
-1 : _는 IPython에서 "마지막 출력"을 의미합니다. 나는 그것에 무언가를 할당하지 않을 것입니다.
endolith

20
좋아, 나는 "I"를 보지 못했습니다-참조 주셔서 감사합니다. IMHO 하나의 Python 앱이 자체적으로 마법의 사용을 정의하기 때문에 다른 사람들이 변수를 사용하지 않을 것을 기대할 수 없습니다.
Draemon

8
PyDev와 같은 일부 IDE는 사용되지 않은 변수가 있기 때문에 이에 대한 경고를 표시합니다.
teeks99

593

x = func()[0]첫 번째 값 x = func()[1]을 반환하고 두 번째 값을 반환하는 데 사용할 수 있습니다 .

한 번에 여러 값을 얻으려면 다음과 같은 것을 사용하십시오 x, y = func()[2:4].


92
이것은 정답입니다. 반환 값 func()[2:4] 일부만 원하는 경우 와 같은 것을 사용할 수도 있습니다 .
endolith

11
함수를 여러 번 호출하지 않습니다. >>> def test () : ... print "here"... return 1,2,3 ... >>> a, b = test () [: 2 ] here [편집 : 코드가 나오지 않아서 죄송합니다. 분명히 한 줄만 주석으로 표시합니다. 익숙하지 않은 사람들을 위해 >>> 그리고 ...는 파이썬 쉘에서 새로운 줄의 시작입니다]
teeks99

32
@ TylerLong : _, _, _, _, _, _, _, _, _, _, _, _, _, a, _, _, _, _, _, _, _, _, _, _, _, b, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, c, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, d, _, _, _, _, _, _, _, _, e, _ = func()함수를 여러 번 호출하는 것보다 덜 분명 하다고 생각 하지만 그건 내 의견 일뿐입니다. 함수가 많은 항목을 반환하면 numpy를 사용하는 것이 바람직하다고 생각합니다.a, b, c, d, e = func()[[13, 25, 58, 89, 98]]
endolith

24
@endolith 나는 이것이 더 낫고 numpy가 필요 없으며 func ()를 여러 번 호출 할 필요가 없다고 생각한다. result = func() a = result[13] b = result[25]...
Tyler Long

3
이 스타일은 다음과 같은 사이에 하나 또는 몇 개의 값을 무시하고 싶을 때 좋지 않습니다. 예 :x, __, y = func()
ndemou

96

Python 3을 사용하는 경우 변수 왼쪽의 별 앞에 별을 사용하여 포장 풀기 목록으로 만들 수 있습니다.

# Example 1: a is 1 and b is [2, 3]

a, *b = [1, 2, 3]

# Example 2: a is 1, b is [2, 3], and c is 4

a, *b, c = [1, 2, 3, 4]

# Example 3: b is [1, 2] and c is 3

*b, c = [1, 2, 3]       

# Example 4: a is 1 and b is []

a, *b = [1]

2
또한 a, *_ = f()이후에 반환되는 임의의 수의 반환 값을 무시 하는 데 사용할 수 있습니다 a.
THN

21

둘 이상의 항목을 반환하면 실제로 튜플을 반환한다는 것을 기억하십시오. 따라서 다음과 같은 작업을 수행 할 수 있습니다.

def func():
    return 1, 2

print func()[0] # prints 1
print func()[1] # prints 2

17

일반적인 관행은 _이전에 많은 사람들이 지적한 것처럼 더미 변수 (단일 밑줄) 를 사용하는 것 입니다.

그러나 해당 변수 이름의 다른 사용 ( 응답 참조 ) 과의 충돌을 피하기 위해 ncoghlan이__ 지적한대로 버리기 변수로 (이중 밑줄) 을 사용하는 것이 좋습니다 . 예 :

x, __ = func()

전혀 나쁜 생각이 아닙니다. 그러나 '_ _'는 네임 스페이스에서 변수를 선언합니다. 반면 '_'는 위와 같이 할당 문의 왼쪽에 특별히 사용되지 않는 한 선언하지 않습니다 (예 :) a, _, _ = 1,8,9. 이 시점까지는 마지막으로 실행 한 명령문의 결과를 저장합니다.이 명령문은 캐치하려는 경우 일반적으로 변수를 사용하여 해당 값을 저장합니다. 이것이 바로 정크 값을 잡기 위해 제안 된 변수 이름 인 '_'입니다. 다른 명령문이 실행 된 직후 '_'값이 덮어 쓰기됩니다. '_ _'의 경우 GC가 정리할 때까지 값이 유지됩니다.
Archit Kapoor

16

세 가지 간단한 선택.

분명한

x, _ = func()

x, junk = func()

끔찍한

x = func()[0]

그리고 데코레이터로 이것을 수행하는 방법이 있습니다.

def val0( aFunc ):
    def pick0( *args, **kw ):
        return aFunc(*args,**kw)[0]
    return pick0

func0= val0(func)

5
나는 정말로 _변수를 선호합니다 . 당신이 가치를 무시하고 있다는 것은 매우 분명합니다
Claudiu

21
당신의 예는 거꾸로 있습니다. x, _ = func()끔찍하고 x = func()[0]명백합니다. 변수에 할당 한 다음 사용하지 않습니까? 이 함수는 튜플을 반환합니다. 튜플처럼 색인합니다.
endolith

6
파이썬이이 패턴을 파생시킨 패턴 일치 언어에서 '명백한'방법은 명백하고, 끔찍하지 않고, 정식입니다. 그러한 언어에서 와일드 카드는 지원되는 언어 기능이지만 파이썬에서는 실제 변수이며 바인딩이되어 약간 적합하지 않습니다.

4
파이썬이 파생되는 목록 처리 언어의 경우 , (목록 복사), (두 가지 요소) 및 (목록 회전 ) ;)과 같은 목록 접근 자는 실제로 명확하고 정식입니다. a[0]a[:]a[::2]a[i:] + a[:i]
cod3monk3y

7

가장 좋은 해결책은 아마도 의미없는 튜플을 반환하는 대신 이름을 지정하는 것입니다. 반품 된 품목의 주문 뒤에 논리가없는 한.

def func():
    return {'lat': 1, 'lng': 2}

latitude = func()['lat']

반환하는 것에 대한 추가 정보를 추가하려는 경우 namedtuple을 사용할 수도 있습니다 (사전이 아니라 좌표입니다).

from collections import namedtuple 

Coordinates = namedtuple('Coordinates', ['lat', 'lng'])

def func():
    return Coordinates(lat=1, lng=2)

latitude = func().lat

사전 / 튜플 내의 객체가 서로 밀접하게 연결되어 있으면 클래스를 정의하는 것이 좋습니다. 그렇게하면이 유형의 객체 사이의 상호 작용을 정의하고 해당 객체를 사용하는 방법에 대한 API를 제공 할 수도 있습니다. 자연스럽게 나오는 질문 : 언제 파이썬에서 클래스를 사용해야합니까? .


4

이것은 나에게 최고의 선택 인 것 같습니다.

val1, val2, ignored1, ignored2 = some_function()

그것은 func () [index] 메소드와 같이 비밀 스럽거나 추악하지 않으며 목적을 명확하게 나타냅니다.


4

이것은 질문에 대한 직접적인 대답이 아닙니다. 오히려이 질문에 대한 답은 "많은 옵션 중에서 특정 기능 출력을 어떻게 선택합니까?"입니다.

함수를 작성할 수있는 경우 (즉, 수정할 수없는 라이브러리에없는 경우) 함수에서 원하는 것을 나타내는 입력 인수를 추가하십시오. "일반적인 경우"에 지정할 필요조차 없도록 기본값을 가진 명명 된 인수로 만드십시오.

    def fancy_function( arg1, arg2, return_type=1 ):
        ret_val = None
        if( 1 == return_type ):
            ret_val = arg1 + arg2
        elif( 2 == return_type ):
            ret_val = [ arg1, arg2, arg1 * arg2 ]
        else:
            ret_val = ( arg1, arg2, arg1 + arg2, arg1 * arg2 ) 
        return( ret_val )

이 방법은 원하는 출력과 관련하여 "고급 경고"기능을 제공합니다. 결과적으로 불필요한 처리를 건너 뛰고 원하는 출력을 얻는 데 필요한 작업 만 수행 할 수 있습니다. 또한 파이썬은 동적 타이핑을하기 때문에 리턴 타입이 바뀔 수 있습니다. 예제에서 스칼라, 목록 또는 튜플을 어떻게 반환하는지 주목하십시오.


2

이것이 항상 사용하지만 항상 두 번째 인수를 버리는 함수 인 경우을 사용하여 두 번째 반환 값없이 함수의 별칭을 만드는 것이 덜 지루하다고 주장합니다 lambda.

def func():
    return 1, 2

func_ = lambda: func()[0] 

func_()  # Prints 1 

2

함수의 출력이 많고 여러 번 호출하지 않으려는 경우 결과를 선택하는 가장 명확한 방법은 다음과 같습니다.

results = fct()
a,b = [results[i] for i in list_of_index]

최소 작업 예제로서 함수가 한 번만 호출됨을 보여줍니다.

def fct(a):
    b=a*2
    c=a+2
    d=a+b
    e=b*2
    f=a*a
    print("fct called")
    return[a,b,c,d,e,f]

results=fct(3)
> fct called

x,y = [results[i] for i in [1,4]]

그리고 값은 예상대로입니다 :

results
> [3,6,5,9,12,9]
x
> 6
y
> 12

편의를 위해 Python 목록 색인을 사용할 수도 있습니다.

x,y = [results[i] for i in [0,-2]]

결과 : a = 3 및 b = 12

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