728x90
반응형
튜플(Tuple)
- 튜플은 리스트와 유사하지만 근본적인 차이점이 있음
- 반드시 그 차이를 이해하고 적재적소에 사용
1. 튜플의 정의와 핵심 속성
- 튜플은 Python의 컬렉션 데이터 타입
- 주요 특징
- 순서가 있다 (Ordered): 리스트처럼 요소들이 순서를 가지며 인덱스를 통해 접근할 수 있습니다.
- 불변하다 (Immutable): 이것이 튜플의 가장 큰 특징이자 리스트와의 주요 차이점입니다. 튜플은 한 번 생성된 후에는 요소를 추가하거나, 삭제하거나, 변경할 수 없습니다.
- 용도: 튜플은 서로 연관되어 함께 속하는 객체들을 묶는 용도로 자주 사용됩니다.
- 불변성(Immutability)으로 인해, 튜플의 요소를 변경하려고 시도하면 TypeError가 발생합니다.
# 튜플은 순서가 있고 (Ordered), 불변(Immutable)한 자료형
my_tuple = ("apple", "banana", "cherry")
print("my_tuple:", my_tuple)
## 출력: my_tuple: ('apple', 'banana', 'cherry')
# 인덱스를 통해 접근 가능
print("첫 번째 요소:", my_tuple[0])
## 출력: 첫 번째 요소: apple
# 불변성 확인 → 요소 변경 시 오류 발생
try:
my_tuple[0] = "grape"
except TypeError as e:
print("오류 발생:", e)
## 출력: 오류 발생: 'tuple' object does not support item assignment
2. 튜플 생성 방법
튜플은 주로 **괄호 (())**를 사용하여 생성하며, 원하는 각 요소를 쉼표(comma)로 구분하여 넣습니다.
my_tuple = ("Max", 28, "Boston")
print("튜플 생성:", my_tuple)
## 출력: 튜플 생성: ('Max', 28, 'Boston')
# 괄호 생략 가능
another_tuple = "Tom", 30, "Seoul"
print("괄호 생략 튜플:", another_tuple)
## 출력: 괄호 생략 튜플: ('Tom', 30, 'Seoul')
괄호는 선택 사항입니다 (Optional Parentheses) 튜플을 정의할 때 괄호를 생략해도 여전히 튜플로 인식됩니다.
2.1. 단일 요소 튜플 생성의 주의점
- 만약 튜플 안에 오직 하나의 요소만 넣으려면 특별히 주의해야 합니다.
- 괄호만 사용하여 단일 요소를 정의할 경우 튜플로 인식 X
- 예를 들어, ("A")는 튜플이 아닌 **문자열 (string)**로 인식됩니다.
- 올바르게 단일 요소 튜플을 생성하려면, 요소 뒤에 **쉼표(Trailing Comma)**를 붙여야 합니다.
not_tuple = ("A") # 문자열로 인식됨
print("not_tuple 타입:", type(not_tuple))
## 출력: not_tuple 타입: <class 'str'>
single_tuple = ("A",) # 쉼표 필수!
print("single_tuple 타입:", type(single_tuple))
## 출력: single_tuple 타입: <class 'tuple'>
2.2. 반복 가능한 객체로부터 생성
- 내장 함수인 tuple()을 사용하여 리스트와 같은 다른 반복 가능한 객체(iterable)로부터 튜플을 생성 가능
my_list = [1, 2, 3]
tuple_from_list = tuple(my_list)
print("리스트 → 튜플:", tuple_from_list)
## 출력: 리스트 → 튜플: (1, 2, 3)
3. 튜플 요소 접근, 반복 및 메서드
3.1. 인덱스를 통한 접근
- 리스트와 마찬가지로, 튜플의 요소에 접근하려면 인덱스를 사용합니다. 인덱스는 0부터 시작합니다 (0이 첫 번째 항목).
- 음수 인덱스를 사용하면 튜플의 끝에서부터 요소를 참조할 수 있으며, -1은 가장 마지막 항목
- 존재하지 않는 인덱스를 사용하면 IndexError 예외가 발생
t = ("red", "green", "blue")
print("첫 번째 요소:", t[0])
## 출력: 첫 번째 요소: red
print("마지막 요소:", t[-1])
## 출력: 마지막 요소: blue
# 존재하지 않는 인덱스 접근
try:
print(t[5])
except IndexError as e:
print("오류 발생:", e)
## 출력: 오류 발생: tuple index out of range
3.2. 반복 및 포함 여부 확인
- 튜플의 모든 요소를 순회하려면 for in 루프를 사용
- 특정 항목이 튜플 내에 포함되어 있는지 확인하려면 if in 구문을 사용하면 됩니다.
colors = ("red", "green", "blue")
# for문 반복
for c in colors:
print("색상:", c)
## 출력:
# 색상: red
# 색상: green
# 색상: blue
# 포함 여부 확인
print("'red' in colors?", "red" in colors)
## 출력: 'red' in colors? True
print("'yellow' in colors?", "yellow" in colors)
## 출력: 'yellow' in colors? False
3.3. 튜플의 유용한 메서드
- 튜플이 제공하는 몇 가지 유용한 메서드
메서드/함수기능설명출처
| 메서드 | 함수 기능 | 설명 |
| len(my_tuple) | 길이 확인 | 튜플의 요소 개수를 반환합니다. |
| my_tuple.count(item) | 요소 개수 세기 | 튜플 내에서 특정 요소가 몇 번 나타나는지 셉니다. |
| my_tuple.index(item) | 첫 번째 인덱스 찾기 | 특정 요소가 처음 나타나는 인덱스를 반환합니다. 요소가 튜플에 없으면 ValueError가 발생합니다. |
numbers = (1, 2, 3, 2, 2, 4)
print("튜플 길이:", len(numbers))
## 출력: 튜플 길이: 6
print("2의 개수:", numbers.count(2))
## 출력: 2의 개수: 3
print("2의 첫 번째 인덱스:", numbers.index(2))
## 출력: 2의 첫 번째 인덱스: 1
3.4. 리스트로 변환
- 튜플은 변경할 수 없지만, 필요하다면 list() 함수를 사용하여 튜플을 리스트로 변환할 수 있으며, 그 반대로 리스트를 tuple() 함수를 사용하여 튜플로 변환할 수도 있습니다.
tuple_data = (10, 20, 30)
list_data = list(tuple_data)
print("튜플 → 리스트:", list_data)
## 출력: 튜플 → 리스트: [10, 20, 30]
# 다시 리스트를 튜플로
tuple_again = tuple(list_data)
print("리스트 → 튜플:", tuple_again)
## 출력: 리스트 → 튜플: (10, 20, 30)
4. 슬라이싱 (Slicing)
- 슬라이싱은 콜론 (:)을 사용하여 튜플의 **부분(sub parts)**에 접근하는 방법
- 슬라이싱 구문은 [start:stop:step] 형식으로 지정
- start 인덱스를 지정하지 않으면 처음부터 시작하고, stop 인덱스를 지정하지 않으면 끝까지 갑니다.
- 슬라이싱에서 가장 중요한 점은 stop 인덱스에 해당하는 항목은 결과에 포함되지 않고 제외된다는 것입니다.
- 선택적 step 인덱스를 지정하여 항목을 건너뛰면서 선택할 수 있으며, 기본값은 1입니다.
- **음수 step 인덱스(-1)**를 사용하면 튜플의 순서를 뒤집기 가능
t = (10, 20, 30, 40, 50, 60)
print("t[1:4]:", t[1:4])
## 출력: t[1:4]: (20, 30, 40)
print("t[:3]:", t[:3])
## 출력: t[:3]: (10, 20, 30)
print("t[::2]:", t[::2])
## 출력: t[::2]: (10, 30, 50)
print("t[::-1]:", t[::-1])
## 출력: t[::-1]: (60, 50, 40, 30, 20, 10)
5. 튜플 언패킹 (Tuple Unpacking)
- 튜플 언패킹은 튜플 내부의 요소들을 여러 변수에 한 번에 할당하는 방법
my_tuple = ("Max", 28, "Boston")
name, age, city = my_tuple
print("이름:", name)
print("나이:", age)
print("도시:", city)
## 출력:
# 이름: Max
# 나이: 28
# 도시: Boston
- 이때, 좌변의 변수 개수는 튜플 내 요소의 개수와 반드시 일치
- 요소의 개수가 일치하지 않으면 ValueError가 발생
5.1. 스타 연산자를 사용한 언패킹
- 튜플 내에 요소가 많을 때, **별표 연산자 (*)**를 사용하여 여러 요소를 리스트로 한 번에 언패킹할 수 있습니다.
my_tuple = (100, 1, 2, 3, 4)
i1, *i2, i3 = my_tuple
print("i1:", i1)
print("i2:", i2)
print("i3:", i3)
## 출력:
# i1: 100
# i2: [1, 2, 3]
# i3: 4
- 이때 스타 연산자가 붙은 변수에는 중간의 모든 요소가 리스트 형태로 할당됩니다.
6. 리스트와의 비교 및 효율성
- 튜플과 리스트는 유사하지만, 불변성 때문에 성능상 중요한 차이가 발생
- 효율성: 튜플은 불변하기 때문에 Python이 내부적으로 최적화를 수행 가능
- 메모리 사용: 동일한 요소를 가진 리스트와 튜플을 비교했을 때, 튜플이 더 적은 바이트를 차지하며 메모리 측면에서 더 효율적
- 성능: 튜플을 생성하거나 순회하는 작업 역시 리스트보다 더 효율적이고 빠름
- 따라서 대용량 데이터를 다루거나 데이터가 변경될 필요가 없는 경우, 튜플을 사용하면 코드의 효율성을 높일수 있음
import sys
import time
list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)
# 메모리 비교
print("리스트 크기:", sys.getsizeof(list_data), "bytes")
print("튜플 크기:", sys.getsizeof(tuple_data), "bytes")
## 출력 예시:
# 리스트 크기: 104 bytes
# 튜플 크기: 88 bytes
# 생성 속도 비교
start = time.time()
for _ in range(1_000_000):
a = [1, 2, 3, 4, 5]
print("리스트 생성 시간:", round(time.time() - start, 4), "초")
start = time.time()
for _ in range(1_000_000):
b = (1, 2, 3, 4, 5)
print("튜플 생성 시간:", round(time.time() - start, 4), "초")
## 출력 예시:
# 리스트 생성 시간: 0.17 초
# 튜플 생성 시간: 0.12 초
728x90
반응형
'프로그래밍 > Python' 카테고리의 다른 글
| [파이썬 / 기본] String " " (0) | 2025.10.19 |
|---|---|
| [파이썬 / 기본] Set {} 집합 (0) | 2025.10.17 |
| [파이썬 / 기본] Dictionary {} (0) | 2025.10.16 |
| [파이썬 / 기본] Lists (0) | 2025.10.15 |
| [SWEA] 파이썬 SW문제해결 기본 - List1 (1) | 2023.09.24 |