한양과학기술고등학교

에듀테크 프로젝트 대시보드

튜플 (tuple)

tuple immutable unpacking namedtuple

변경 불가능한 시퀀스. 함수의 다중 반환값, 딕셔너리 키, 고정 레코드에 쓰입니다.

1. 생성 — 쉼표가 핵심

t = (1, 2, 3)
t = 1, 2, 3           # 괄호는 선택 (쉼표가 튜플을 만든다)
single = (42,)        # 원소 1개는 반드시 뒤에 쉼표
empty = ()
t = tuple([1, 2, 3])

x = (42)              # 이건 그냥 int 42! (튜플 아님)

2. 불변성

t = (1, 2, 3)
# t[0] = 9            # TypeError

# 단, 내부에 가변 객체가 있으면 그 객체는 변경 가능
t = ([1, 2], 3)
t[0].append(9)        # OK => ([1, 2, 9], 3)

# 메서드는 2개뿐
t = (1, 2, 2, 3)
t.count(2)            # => 2
t.index(3)            # => 3

3. 언패킹

point = (3, 4)
x, y = point                 # x=3, y=4

a, b = b, a                  # 스왑

first, *middle, last = [1, 2, 3, 4, 5]
# first=1, middle=[2, 3, 4], last=5

for name, age in [("김", 20), ("이", 22)]:
    print(name, age)

_, value = ("ignored", 99)   # _ 는 "안 쓰는 값" 관례

4. 함수 반환값

def minmax(nums):
    return min(nums), max(nums)   # 튜플로 묶여 반환

lo, hi = minmax([3, 1, 4, 1, 5])   # 언패킹

divmod(17, 5)     # => (3, 2)
"a-b".partition("-")   # => ('a', '-', 'b')

5. 튜플 vs 리스트

튜플을 선택하는 이유
  • 해시 가능 → dict 키, set 원소로 사용 가능 (원소가 전부 불변일 때)
  • 의도를 드러냄: "이 묶음은 바뀌지 않는다"
  • 약간 더 가볍고 빠름
  • 리스트는 "같은 종류의 항목 여럿", 튜플은 "의미가 다른 필드의 묶음"이 관례

6. namedtuple — 이름 붙은 튜플

from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 4)
p.x, p.y          # => 3 4
p[0]              # => 3  (여전히 튜플)
p._replace(x=10)  # => Point(x=10, y=4)  (새 객체)

# 타입 힌트 버전
from typing import NamedTuple
class Point(NamedTuple):
    x: int
    y: int = 0
"특별한 경우라도 규칙을 어길 만큼 특별하지는 않다"