문제

Python에서는 함수가 여러 값을 반환하도록 할 수 있습니다.다음은 고안된 예입니다.

def divide(x, y):
    quotient = x/y
    remainder = x % y
    return quotient, remainder  

(q, r) = divide(22, 7)

이것은 매우 유용해 보이지만 남용될 수도 있는 것처럼 보입니다("글쎄..함수 X는 이미 중간 값으로 필요한 것을 계산합니다.X가 해당 값도 반환하도록 합시다.").

언제 선을 그리고 다른 방법을 정의해야 합니까?

도움이 되었습니까?

해결책

물론입니다(제공한 예의 경우).

튜플은 Python의 일급 시민입니다.

내장된 기능이 있습니다 divmod() 그게 바로 그 일이다.

q, r = divmod(x, y) # ((x - x%y)/y, x%y) Invariant: div*y + mod == x

다른 예도 있습니다: zip, enumerate, dict.items.

for i, e in enumerate([1, 3, 3]):
    print "index=%d, element=%s" % (i, e)

# reverse keys and values in a dictionary
d = dict((v, k) for k, v in adict.items()) # or 
d = dict(zip(adict.values(), adict.keys()))

그런데 대부분의 경우 괄호는 필요하지 않습니다.인용 출처 Python 라이브러리 참조:

튜플은 다양한 방법으로 구성될 수 있습니다:

  • 빈 튜플을 표시하기 위해 한 쌍의 괄호를 사용합니다:()
  • 싱글톤 튜플에 후행 쉼표 사용:에, 또는 (에,)
  • 항목을 쉼표로 구분:a, b, c 또는 (a, b, c)
  • tuple() 내장 사용:튜플() 또는 튜플(반복 가능)

함수는 단일 목적으로만 사용되어야 합니다.

따라서 단일 객체를 반환해야 합니다.귀하의 경우 이 객체는 튜플입니다.임시 복합 데이터 구조로 튜플을 고려하십시오.거의 모든 단일 함수가 여러 값을 반환하는 언어가 있습니다(Lisp의 목록).

가끔은 돌아가는 것만으로도 충분하다 (x, y) 대신에 Point(x, y).

명명된 튜플

Python 2.6에 명명된 튜플이 도입되면서 많은 경우 일반 튜플 대신 명명된 튜플을 반환하는 것이 더 좋습니다.

>>> import collections
>>> Point = collections.namedtuple('Point', 'x y')
>>> x, y = Point(0, 1)
>>> p = Point(x, y)
>>> x, y, p
(0, 1, Point(x=0, y=1))
>>> p.x, p.y, p[0], p[1]
(0, 1, 0, 1)
>>> for i in p:
...   print(i)
...
0
1

다른 팁

첫째, Python에서는 다음을 허용합니다(괄호가 필요 없음).

q, r = divide(22, 7)

귀하의 질문과 관련하여 어느 쪽이든 엄격하고 빠른 규칙은 없습니다.간단한 (그리고 일반적으로 고안된) 예의 경우, 주어진 함수가 단일 목적을 갖고 단일 값을 생성하는 것이 항상 가능해 보일 수 있습니다.그러나 실제 애플리케이션에 Python을 사용하면 여러 값을 반환해야 하는 경우가 많아지고 결과적으로 더 깔끔한 코드가 생성됩니다.

그래서 저는 의미가 있는 것은 무엇이든 하라고 말하고 싶습니다. 그리고 인위적인 관습을 따르려고 하지 마십시오.Python은 여러 반환 값을 지원하므로 적절할 때 사용하세요.

당신이 제공하는 예는 실제로 Python 내장 함수입니다. divmod.그래서 누군가는 어느 시점에서 그것이 핵심 기능에 포함될 만큼 충분히 파이썬적이라고 생각했습니다.

나에게 있어서 그것이 코드를 더 깔끔하게 만든다면 그것은 파이썬적이다.다음 두 코드 블록을 비교해 보세요.

seconds = 1234
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)

seconds = 1234
minutes = seconds / 60
seconds = seconds % 60
hours = minutes / 60
minutes = minutes % 60

예, 여러 값(즉, 튜플)을 반환하는 것은 확실히 파이썬적입니다.다른 사람들이 지적했듯이 Python 표준 라이브러리와 존경받는 Python 프로젝트에는 많은 예제가 있습니다.두 가지 추가 의견:

  1. 여러 값을 반환하는 것은 때로는 매우 유용합니다.예를 들어 선택적으로 이벤트를 처리하고(그렇게 하면 일부 값을 반환함) 성공 또는 실패도 반환하는 메서드를 생각해 보세요.이는 일련의 책임 패턴에서 발생할 수 있습니다.다른 경우에는 제공된 예에서와 같이 밀접하게 연결된 여러 개의 데이터 조각을 반환하려고 합니다.이 설정에서 여러 값을 반환하는 것은 여러 멤버 변수가 있는 익명 클래스의 단일 인스턴스를 반환하는 것과 유사합니다.
  2. Python에서 메서드 인수를 처리하려면 여러 값을 직접 반환하는 기능이 필요합니다.예를 들어 C++에서는 메서드 인수를 참조로 전달할 수 있으므로 공식적인 반환 값 외에도 출력 값을 할당할 수 있습니다.Python에서는 인수가 "참조로" 전달됩니다(단, C++가 아닌 Java의 의미에서).메서드 인수에 새 값을 할당하여 메서드 범위 외부에 반영되도록 할 수 없습니다.예를 들어:

    // C++
    void test(int& arg)
    {
        arg = 1;
    }
    
    int foo = 0;
    test(foo); // foo is now 1!
    

    비교:

    # Python
    def test(arg):
        arg = 1
    
    foo = 0
    test(foo) # foo is still 0
    

확실히 파이썬스럽습니다.함수에서 여러 값을 반환할 수 있다는 사실은 C와 같은 언어에서 반환하는 모든 유형 조합에 대해 구조체를 정의해야 하는 상용구입니다.

그러나 단일 함수에서 10개의 값과 같은 이상한 것을 반환하는 지점에 도달하면 다루기 어려워지기 때문에 이를 클래스에 묶는 것을 진지하게 고려해야 합니다.

튜플을 반환하는 것은 멋지다.또한 Python 2.6에 추가 된 새로운 지명 된 튜플에 주목하십시오.http://docs.python.org/dev/library/collections.html#collections.namedtuple

구약:RSRE의 Algol68에는 흥미로운 "/:=" 연산자가 있습니다.예.

INT quotient:=355, remainder;
remainder := (quotient /:= 113);

몫은 3이고 나머지는 16입니다.

메모:일반적으로 "(x/:=y)" 값은 몫 "x"가 참조에 의해 할당되므로 삭제되지만 RSRE의 경우 반환된 값은 나머지입니다.

참조 정수 산술 - Algol68

다음과 같은 간단한 함수에 대해 튜플을 사용하여 여러 값을 반환하는 것은 괜찮습니다. divmod.코드를 읽기 쉽게 만든다면 Pythonic입니다.

반환 값이 혼란스러워지기 시작하면 함수가 너무 많은 작업을 수행하는지 확인하고 그렇다면 분할하세요.큰 튜플이 객체처럼 사용되는 경우 이를 객체로 만듭니다.또한 다음을 사용하는 것을 고려해보세요. 명명된 튜플, Python 2.6의 표준 라이브러리의 일부가 될 것입니다.

나는 Python을 처음 접했지만 튜플 기술은 나에게 매우 Python처럼 보입니다.그러나 가독성을 높일 수 있는 또 다른 아이디어가 있습니다.사전을 사용하면 위치가 아닌 이름으로 다양한 값에 액세스할 수 있습니다.예를 들어:

def divide(x, y):
    return {'quotient': x/y, 'remainder':x%y }

answer = divide(22, 7)
print answer['quotient']
print answer['remainder']
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top