프로그래밍 언어/Python

파이썬에서 "named tuples" 이란?

Rateye 2021. 9. 15. 10:49
728x90
반응형
질문 : 파이썬에서 "명명 된 튜플"이란 무엇입니까?

Python 3.1의 변경 사항을 읽으면서 예기치 않은 것을 발견했습니다.

sys.version_info 튜플은 이제 명명 된 튜플입니다 .

명명 된 튜플에 대해 들어 본 적이 없었고 요소가 숫자 (튜플 및 목록과 같은) 또는 키 (사전과 같은)로 인덱싱 될 수 있다고 생각했습니다. 나는 그들이 두 가지 방법으로 색인화 될 수 있다고 결코 예상하지 못했습니다.

따라서 내 질문은 다음과 같습니다.

  • 명명 된 튜플이란 무엇입니까?
  • 어떻게 사용하나요?
  • 왜 / 언제 일반 튜플 대신 명명 된 튜플을 사용해야합니까?
  • 왜 / 언제 명명 된 튜플 대신 일반 튜플을 사용해야합니까?
  • 어떤 종류의 "명명 된 목록"(명명 된 튜플의 변경 가능한 버전)이 있습니까?
답변

명명 된 튜플은 기본적으로 생성하기 쉽고 가벼운 개체 유형입니다. 명명 된 튜플 인스턴스는 객체와 유사한 변수 역 참조 또는 표준 튜플 구문을 사용하여 참조 할 수 있습니다. 변경 불가능하다는 점을 제외하고 struct 또는 기타 일반 레코드 유형과 유사하게 사용할 수 있습니다. Python 2.4에서 구현하기위한 레시피 가 있지만 Python 2.6 및 Python 3.0에 추가되었습니다.

예를 들어, 점을 튜플 (x, y) 로 나타내는 것이 일반적입니다. 이로 인해 다음과 같은 코드가 생성됩니다.

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

명명 된 튜플을 사용하면 더 읽기 쉬워집니다.

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

그러나 명명 된 튜플은 여전히 일반 튜플과 역 호환되므로 다음은 여전히 작동합니다.

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

따라서 객체 표기법이 코드를 더 비단뱀적이고 더 쉽게 읽을 수있게 만들 것이라고 생각하는 곳에서는 튜플 대신 명명 된 튜플을 사용해야합니다 . 저는 개인적으로 매우 간단한 값 유형을 나타내는 데 사용하기 시작했습니다. 특히 매개 변수로 함수에 전달할 때 그렇습니다. 튜플 패킹의 컨텍스트를 보지 않고도 함수를 더 읽기 쉽게 만듭니다.

또한 함수가없고 필드 만 있는 일반 불변 클래스를 대체 할 수도 있습니다. 명명 된 튜플 유형을 기본 클래스로 사용할 수도 있습니다.

class Point(namedtuple('Point', 'x y')):
    [...]

그러나 튜플과 마찬가지로 명명 된 튜플의 속성은 변경할 수 없습니다.

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

값을 변경할 수 있으려면 다른 유형이 필요합니다. 속성에 새 값을 설정할 수있는 변경 가능한 레코드 유형에 대한 편리한 방법이 있습니다.

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

그러나 새 필드를 추가 할 수있는 "명명 된 목록"의 어떤 형태도 알지 못합니다. 이 상황에서 사전을 사용하는 것이 좋습니다. {'x': 1.0, 'y': 5.0} 을 반환 pt1._asdict() 를 사용하여 사전으로 변환 할 수 있으며 모든 일반적인 사전 함수와 함께 작동 할 수 있습니다.

이미 언급했듯이 이러한 예제가 생성 된 자세한 내용 은 설명서를 확인해야합니다.

출처 : https://stackoverflow.com/questions/2970608/what-are-named-tuples-in-python

 

728x90
반응형