튜플(tuple)은 불변 리스트(immutable list)로 간주될 수 있지만, 그보다 더 많은 역할을 합니다. 튜플은 불변성을 갖는다는 점에서 리스트와 다르며, 이는 튜플이 한 번 생성되면 그 내용을 변경할 수 없음을 의미합니다. 튜플은 다양한 타입의 객체들을 그룹화하는 데 사용할 수 있으며, 이 특성 때문에 파이썬에서 다목적으로 널리 사용됩니다.
예제코드
# 튜플 생성
my_tuple = (1, "Hello", 3.14)
print(my_tuple) # 출력: (1, 'Hello', 3.14)
# 불변성 확인
try:
my_tuple[0] = 100
except TypeError:
print("Cannot modify a tuple!") # 출력: Cannot modify a tuple!
튜플은 서로 다른 데이터 타입의 요소들을 담을 수 있기 때문에, 종종 복잡한 데이터 구조의 레코드로 사용됩니다. 각 튜플의 위치는 의미를 갖게 되며, 각 위치에 있는 요소는 레코드의 다른 필드를 나타냅니다. 이러한 특성은 튜플을 다양한 데이터 항목을 하나의 단위로 취급할 때 유용하게 만듭니다.
예제코드
# 레코드로서의 튜플 사용
employee = ("John Doe", "Engineer", 30)
name, position, age = employee
print(f"Name: {name}, Position: {position}, Age: {age}")
# 출력: Name: John Doe, Position: Engineer, Age: 30
튜플 언패킹은 튜플의 각 요소를 여러 변수에 할당하는 과정입니다. 파이썬은 병렬 할당을 지원하여, 튜플의 각 요소를 한 번에 여러 변수에 할당할 수 있습니다. 또한, * 연산자를 사용하여 튜플의 일부 요소만 선택적으로 언패킹할 수 있습니다.
예제코드
# 튜플 언패킹
a, b, c = (1, 2, 3)
print(a, b, c) # 출력: 1 2 3
# * 사용 예제
first, *rest = (1, 2, 3, 4, 5)
print(first) # 출력: 1
print(rest) # 출력: [2, 3, 4, 5]
내포된 튜플 언패킹은 중첩된 튜플 구조에서도 언패킹을 수행할 수 있습니다. 이 기능은 복잡한 데이터 구조에서 원하는 요소를 쉽게 추출할 수 있게 해줍니다.
예제코드
# 내포된 튜플 언패킹
outer = (1, (2, 3), 4)
a, (b, c), d = outer
print(a, b, c, d) # 출력: 1 2 3 4
# 도시 정보를 담은 내포된 튜플
city_info = ("New York", (40.7128, -74.0060), "USA", ("Central Park", "Times Square"))
# 내포된 튜플 언패킹
city_name, (latitude, longitude), country, (landmark1, landmark2) = city_info
print(f"City: {city_name}, Country: {country}")
print(f"Coordinates: {latitude}, {longitude}")
print(f"Popular Landmarks: {landmark1}, {landmark2}")
collections.namedtuple() 함수는 튜플의 각 요소에 이름을 붙여줍니다. 이를 통해 튜플 요소에 인덱스가 아닌 이름으로 접근할 수 있으며, 코드의 가독성과 유지 보수성을 크게 향상시킵니다. 명명된 튜플은 _fields, _make, _asdict 같은 유용한 메서드와 속성을 제공합니다.
예제코드
from collections import namedtuple
# 명명된 튜플 정의: 도서 정보
Book = namedtuple('Book', 'title author year')
# 책 인스턴스 생성
book1 = Book(title="1984", author="George Orwell", year=1949)
book2 = Book._make(["Animal Farm", "George Orwell", 1945])
# 접근 및 사용
print(book1) # 출력: Book(title='1984', author='George Orwell', year=1949)
print(book2._asdict()) # 출력: OrderedDict([('title', 'Animal Farm'), ('author', 'George Orwell'), ('year', 1945)])
# 튜플 수정
book1_updated = book1._replace(year=1984)
print(book1_updated) # 출력: Book(title='1984', author='George Orwell', year=1984)
튜플은 불변 리스트라고 생각할 수 있으며, 이는 튜플의 내용을 변경할 수 없음을 의미합니다. 그러나 튜플은 몇 가지 유용한 메서드를 가지고 있습니다. count() 메서드는 특정 요소가 튜플에 몇 번 등장하는지를 반환하고, index() 메서드는 특정 요소의 인덱스를 반환합니다. 이는 리스트에도 동일하게 적용되는 메서드들입니다.
메서드 | 리스트(List) | 튜플(Tuple) | 설명 |
---|---|---|---|
append | O | X | 요소를 리스트 끝에 추가합니다. |
extend | O | X | 리스트를 연장합니다. |
insert | O | X | 지정한 위치에 요소를 삽입합니다. |
remove | O | X | 첫 번째로 나타나는 특정 요소를 제거합니다. |
pop | O | X | 지정된 위치의 요소를 제거하고, 그 요소를 반환합니다. |
clear | O | X | 리스트의 모든 요소를 제거합니다. |
index | O | O | 지정된 요소의 위치를 반환합니다. |
count | O | O | 특정 요소가 몇 번 나타나는지 계산합니다. |
sort | O | X | 리스트의 요소를 정렬합니다. |
reverse | O | X | 리스트의 요소 순서를 뒤집습니다. |
copy | O | X | 리스트의 얕은 복사본을 만듭니다. |
예제코드
# 튜플 메서드 예제
t = (1, 2, 3, 2, 4, 2)
print(t.count(2)) # 2의 개수를 출력: 3
print(t.index(3)) # 3의 인덱스를 출력: 2