튜플은 파이썬에서 데이터 집합을 저장하는 데 쓰이는 핵심 데이터 구조 중 하나입니다. 리스트와 유사하지만, 몇 가지 차이점이 있어 특정 상황에서는 더 빠른 성능을 제공합니다.
하지만 불변성이라는 제약 때문에 모든 경우에 리스트보다 선호되는 것은 아닙니다. 이 글에서는 튜플을 효과적으로 사용하는 데 필요한 모든 기본 지식을 소개합니다.
튜플이란 무엇인가?
앞서 언급했듯, 튜플은 파이썬의 내장 데이터형으로, 여러 데이터 항목을 하나의 묶음으로 관리하는 데 사용됩니다. 파이썬 리스트와 마찬가지로, 튜플은 반복 가능한 구조로 데이터를 저장합니다. 주요 차이점은 튜플이 불변(immutable)이라는 점입니다. 즉, 튜플이 생성된 후에는 그 내부 값을 변경할 수 없습니다.
새로운 요소를 추가하거나 기존 요소를 제거하는 것이 불가능합니다. 따라서 튜플은 변경될 필요가 없는 데이터, 특히 다양한 유형의 데이터 조합을 저장하는 데 적합합니다. 아래에서 파이썬에서 튜플을 만드는 여러 가지 방법을 자세히 살펴보겠습니다.
파이썬에서 튜플 생성하기
파이썬에서 튜플을 만드는 방법은 최소 세 가지가 있습니다. 이 섹션에서는 실제 코딩 환경에서 자주 사용되는 세 가지 주요 방법을 설명합니다.
아래의 코드 예제를 실행하려면 파이썬이 컴퓨터에 설치되어 있어야 합니다. 아직 설치하지 않았다면 파이썬 설치 가이드를 참조하세요. 또는, 구글 코랩과 같은 온라인 파이썬 환경에서 코드를 실행할 수도 있습니다.
#1. 튜플 리터럴(괄호) 사용
파이썬에서 튜플을 정의하는 가장 일반적인 방법은 괄호 안에 쉼표로 구분된 값들을 나열하는 것입니다. 다음 예제는 이 방법을 보여줍니다.
# 괄호 안에 값을 넣어 튜플 생성 values = (1, 2, 3) # 튜플 출력 print(values) # 변수의 데이터형 출력 print(type(values))
이 코드를 실행하면 다음과 같은 결과가 출력됩니다.
결과에서 볼 수 있듯이, 튜플은 초기화된 값을 그대로 포함하고 있으며, 그 타입은 ‘
파이썬에서 튜플을 생성할 때 괄호는 필수 요소가 아닙니다. 따라서 `values = 1, 2, 3` 과 `values = (1, 2, 3)`은 완전히 동일하게 작동합니다. 하지만 코드의 가독성을 높이기 위해 괄호를 사용하는 것이 좋습니다.
파이썬에서 단일 요소 튜플을 만들 때는 주의가 필요합니다. 괄호 안에 하나의 요소만 넣는 대신, 반드시 뒤에 쉼표를 추가해야 합니다. 다음은 그 예입니다.
# 뒤에 쉼표가 없으면 튜플이 아님 not_a_tuple = (1) # 뒤에 쉼표가 있으면 튜플 a_tuple = (1,) # not_a_tuple 출력 print(not_a_tuple) # not_a_tuple의 데이터형 출력 print(type(not_a_tuple)) # a_tuple 출력 print(a_tuple) # a_tuple의 데이터형 출력 print(type(a_tuple))
위 코드를 실행하면 `not_a_tuple`이 정수 값 1로 인식되는 것을 확인할 수 있습니다. 튜플을 만들 때 반드시 기억해야 할 중요한 사항입니다.
#2. 생성자 함수 사용
파이썬에서 튜플을 만드는 또 다른 방법은 `tuple()` 생성자 함수를 이용하는 것입니다. 이 함수는 리스트와 같은 반복 가능한 객체를 인수로 받아, 그 내용을 튜플로 변환합니다. 아래 예제를 참고하세요.
# 리스트로부터 튜플 생성 values = tuple([1, 2, 3]) # 튜플 출력 print(values) # 변수의 데이터형 출력 print(type(values))
보시다시피, 이 함수를 사용해도 리터럴을 사용한 것과 동일한 결과를 얻을 수 있습니다. 그러나 이 함수를 사용하면 런타임에 값이 결정되는 동적인 리스트를 기반으로 튜플을 생성할 수 있습니다. 첫 번째 방법인 리터럴 방식은 코드 작성 시점에 튜플을 구성하는 값이나 변수를 알아야 합니다.
#3. 빈 튜플 생성
코드 작성 시 빈 튜플을 만들어야 할 때도 있습니다. 빈 튜플은 예상대로, 어떠한 요소도 가지고 있지 않습니다. 튜플 생성자 함수나 리터럴을 사용하여 만들 수 있습니다. 다음은 두 가지 방법을 보여주는 예시입니다.
# 튜플 리터럴 사용 empty_tuple_1 = () # 생성자 함수 사용 empty_tuple_2 = tuple()
빈 튜플은 결과 집합이 비어 있을 경우에 유용합니다. 다음 함수를 예시로 들어보겠습니다.
def create_range(start, end): return tuple(range(start, end))
이 함수는 시작 값부터 마지막 값 직전까지의 숫자로 이루어진 튜플을 생성합니다. 함수의 결과를 순회하려면 다음과 같이 사용할 수 있습니다.
my_values = create_range(0, 5) for value in my_values: pass
만약 `create_range` 함수에 5와 5를 인자로 전달하면, 결과는 빈 튜플이 됩니다. 이 경우 반복을 시도해도 아무런 요소가 없기 때문에 코드가 정상적으로 진행됩니다.
반면, 빈 튜플이 아닌 `None` 값을 얻게 된다면, 이를 반복하려고 할 때 오류가 발생합니다. 프로그램의 예기치 않은 종료를 방지하기 위해서는 `create_range` 함수가 `None`이나 빈 튜플을 나타내는 다른 값을 반환할 수 있는 예외 상황에 대한 처리가 필요할 것입니다.
이러한 처리는 코드를 복잡하게 만들 수 있습니다. 따라서 가능한 한 특수한 경우를 피하고, 모든 함수의 반환값이 동일한 인터페이스를 갖도록 하는 것이 좋습니다. 즉, 이 경우 항상 튜플을 반환하되, 때로는 비어 있을 수도 있도록 해야 합니다.
요소에 접근하는 방법
파이썬에서 튜플의 요소에 접근하는 방법은 두 가지가 있습니다. 첫 번째는 인덱스를 사용하는 방법이고, 두 번째는 구조 분해를 이용하는 방법입니다. 먼저 인덱스를 사용한 접근 방법을 살펴보겠습니다.
인덱스를 이용한 요소 접근
인덱스를 사용하여 요소에 접근하는 방식은 리스트 요소에 접근하는 방식과 유사합니다. 대괄호 표기법을 사용합니다. 튜플은 0부터 시작하는 인덱싱 시스템을 사용하며, 첫 번째 요소의 인덱스는 0, 두 번째 요소의 인덱스는 1과 같이 마지막 요소까지 증가합니다.
아래 예시는 인덱스를 이용해 요소에 접근하는 방법을 보여줍니다.
# 튜플 생성 values = (1, 2, 3, 4) # 첫 번째 요소에 접근 first_element = values[0] # 네 번째 요소에 접근 (인덱스 3) fourth_element = values[3]
음수 인덱싱도 사용할 수 있습니다. 인덱스가 -1인 요소는 마지막 요소이며, 인덱스가 -2인 요소는 마지막에서 두 번째 요소입니다.
# 튜플 생성 values = (1, 2, 3, 4) # 마지막 요소에 접근 last_element = values[-1] # 마지막에서 두 번째 요소에 접근 second_from_last_element = values[-2]
튜플을 슬라이스하여 요소의 하위 집합에 접근하는 것도 가능합니다. 이는 리스트를 슬라이스하는 방법과 유사합니다. 표기법은 `[<시작>: <끝>: <간격>]` 입니다. 다음 예제는 슬라이싱을 보여줍니다.
# 튜플 생성 values = (1, 2, 3, 4, 5, 6, 7) # 처음 세 개의 요소 가져오기 values[0: 3] # 두 칸씩 건너뛰어 요소 가져오기 values[::2]
요소 반복
튜플은 파이썬에서 반복 가능한 객체입니다. 따라서 다음 예제와 같이 for 루프를 사용하여 튜플의 요소들을 순회할 수 있습니다.
values = (1, 2, 3, 4) for value in values: print(value)
이 방법은 튜플의 모든 요소에 순차적으로 접근하려는 경우에 유용합니다.
구조 분해를 통한 요소 접근
구조 분해를 설명하기 위해, 튜플에서 여러 요소를 가져와야 하는 다음 시나리오를 생각해 보겠습니다.
# 사용자 정보를 기록하는 튜플 생성 person_record = (1, '홍길동', '[email protected]') # 튜플 내의 여러 요소에 접근하여 사용 id = person_record[0] name = person_record[1] email = person_record[2]
파이썬에서는 다음과 같이 더 간편한 방법으로 값에 접근할 수 있습니다.
# 사용자 정보를 기록하는 튜플 생성 person_record = (1, '홍길동', '[email protected]') id, name, email = person_record
이것을 구조 분해라고 합니다. 즉, 이 예에서는 첫 번째 변수 `id`에 튜플의 첫 번째 값이 할당되고, 두 번째 변수는 두 번째 요소에 할당되는 식입니다. 튜플의 마지막 요소까지 이러한 할당이 계속됩니다. 위 예시는 다음과 같습니다.
id, name, email = (1, '홍길동', '[email protected]')
튜플을 변수에 저장하는 대신 바로 분해할 수 있습니다. 튜플 생성 시 괄호가 필수적인 것이 아니라는 점을 이용하면 다음과 같은 코드를 작성할 수 있습니다.
id, name, email = 1, '홍길동', '[email protected]'
결과적으로, 값 1, ‘홍길동’, 및 ‘[email protected]‘이 각각 `id`, `name`, `email` 변수에 할당됩니다. 이것은 실제 개발 환경에서 자주 볼 수 있는 파이썬 변수 생성의 간결하고 효율적인 방법입니다. 이러한 우아한 구문의 중심에 튜플이라는 개념이 있다는 것을 이해하는 것이 중요합니다.
튜플과 리스트의 차이점
튜플과 리스트는 비슷하지만, 몇 가지 주요 차이점 때문에 특정 사용 사례에 더 적합합니다. 이러한 차이점을 이해하면 어떤 상황에서 어떤 데이터 타입을 사용해야 할지 판단하고 더 나은 코드를 작성하는 데 도움이 됩니다.
특성 | 튜플 | 리스트 |
메모리 저장 | 연속된 메모리에 저장 | 메모리의 여러 부분에 분산 저장 |
가변성 | 불변(변경 불가능) | 가변(변경 가능) |
접근 속도 | 더 빠름 | 더 느림 |
데이터 유형 | 일반적으로 서로 다른 유형의 데이터 저장 | 일반적으로 동일한 유형의 데이터 저장 |
사용 사례 | 일반적으로 묶음으로 처리되는 데이터 저장 | 일반적으로 순서가 중요한 데이터 저장 |
튜플의 장점
#1. 더 빠르다
튜플의 값은 메모리 내에서 연속적으로 저장되기 때문에 리스트에 비해 요소에 접근하는 속도가 더 빠릅니다. 그러나 튜플은 한 번 생성되면 변경할 수 없기 때문에, 모든 경우에 데이터를 저장하기에 가장 좋은 데이터 구조는 아닙니다.
튜플의 이상적인 사용 사례는 변경되지 않지만 프로그램 실행 중에 여러 번 접근해야 하는 데이터를 메모리에 저장하는 것입니다. 이런 상황에서는 튜플의 빠른 접근 속도가 프로그램 성능을 크게 향상시킬 수 있습니다.
#2. 여러 값 반환
튜플을 사용하면 함수에서 여러 값을 반환하고, 반환된 값을 구조 분해하여 사용할 수 있습니다. 다음 예제를 참고하세요.
from random import randint def create_two_numbers(): first_num = randint(0, 9) second_num = randint(0, 9) return first_num, second_num first_num, second_num = create_two_numbers()
이 예제에는 두 개의 난수를 생성하고 튜플로 반환하는 함수가 있습니다. `return first_num, second_num` 문은 `return (first_num, second_num)`과 동일한 결과를 가집니다. 튜플을 만들 때 괄호는 선택 사항이기 때문입니다. 반환된 값에 접근하기 위해 구조 분해를 사용하고 있습니다.
#3. 값 보호
튜플은 한 번 생성되면 수정할 수 없습니다. 따라서 프로그램 실행 중 변경되지 않아야 하는 데이터를 저장하는 데 유용합니다. 이는 실수로 코드의 다른 부분에서 데이터를 덮어쓰는 것을 방지합니다.
#4. 다양한 데이터 유형 저장
튜플은 서로 다른 데이터 유형의 값을 함께 저장할 수 있습니다. 이를 통해 사용자 정보와 같은 데이터 레코드를 튜플로 표현할 수 있습니다. 튜플은 함수, 딕셔너리, 다른 튜플, 심지어 리스트와 같은 더 복잡한 데이터 유형도 저장할 수 있습니다.
일반적인 튜플 메서드
#1. count()
튜플 객체는 특정 요소가 튜플 내에서 나타나는 횟수를 세는 데 사용할 수 있는 `count()` 메서드를 제공합니다. 다음 예를 참고하세요.
# 여러 숫자를 포함하는 튜플 생성 values = (1, 2, 3, 4, 5, 4, 4, 6) # 숫자 4의 개수 세기 n_fours = values.count(4) # 숫자 4의 개수 출력 print(n_fours)
이 예에서 숫자 4가 튜플에 정확히 세 번 나타난다는 것을 알 수 있습니다.
#2. index()
`index()` 메서드는 튜플에서 특정 값이 처음 나타나는 인덱스를 찾는 데 사용할 수 있습니다. 만약 값이 튜플 내에 존재하지 않으면 `ValueError` 예외가 발생합니다. 다음은 `index()` 메서드의 작동 방식을 보여주는 예시입니다.
# 여러 숫자를 포함하는 튜플 생성 values = (1, 2, 3, 4, 5, 4, 4, 6) # 숫자 4의 인덱스 찾기 index_of_four = values.index(4) print("숫자 4의 인덱스:", index_of_four) # 숫자 9의 인덱스 찾기 index_of_nine = values.index(9) print("숫자 9의 인덱스:", index_of_nine)
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
이 경우, 숫자 4의 인덱스는 3이고 코드는 문제없이 실행되었습니다. 하지만 숫자 9의 인덱스를 찾으려고 할 때 프로그램에서 예외가 발생했습니다. `index()` 메서드를 사용하는 파이썬 프로그램을 작성할 때는 이러한 예외를 처리하는 것이 중요합니다.
#3. len()
파이썬의 모든 반복 가능한 객체와 마찬가지로, 튜플은 `len()` 함수에 인수로 전달하여 그 길이를 얻을 수 있는 속성을 가지고 있습니다.
# 튜플 생성 values = (1, 2, 3, 4) # 튜플 길이 가져오기 length = len(values) # 출력 print(length)
위 코드를 실행한 결과입니다.
#4. min() 및 max()
`min()` 및 `max()` 메서드는 반복 가능한 객체의 각 요소를 순회하며 이전 요소와 비교하여 작동합니다. `max()`는 반복 가능한 객체에서 가장 큰 요소를 반환하고, `min()`은 가장 작은 요소를 반환합니다.
숫자를 사용할 때는 결과가 명확합니다. 문자열을 사용하는 경우, 파이썬은 알파벳 순서를 사용합니다. `min()`이 반환하는 가장 작은 단어는 알파벳 순서로 정렬했을 때 가장 먼저 나오는 단어입니다. 가장 큰 단어는 가장 마지막에 나오는 단어입니다. 반복 가능한 객체에 서로 다른 데이터 유형이 섞여 있으면, 파이썬이 서로 다른 데이터 유형을 비교하는 방법을 모르기 때문에 모든 작업이 실패합니다.
다음은 코드 예시입니다.
# 값을 갖는 튜플 생성 values = (1, 2, 3, 4, 5) # 가장 큰 값 가져오기 largest = max(values) # 가장 작은 값 가져오기 smallest = min(values) # 결과 출력 print(largest) print(smallest)
#5. sorted()
파이썬의 `sorted()` 함수는 반복 가능한 객체를 받아 정렬된 요소의 리스트를 반환합니다. `sorted()` 함수를 호출하고 튜플을 인수로 전달하면 튜플의 요소가 리스트로 반환됩니다. 이 정렬된 리스트를 다시 튜플로 변환하려면 튜플 생성자 함수를 사용하면 됩니다. 다음은 그 예시입니다.
# 무작위 순서로 값을 갖는 튜플 생성 values = (1, 5, 3, 3, 2, 4) # sorted()를 사용하여 값을 리스트로 정렬 sorted_list = sorted(values) # 리스트를 튜플로 변환 sorted_tuple = tuple(sorted_list) # 출력 print(sorted_tuple)
#6. 튜플 더하기 및 곱하기
두 튜플에 대한 덧셈 연산은 단순히 두 튜플을 이어붙이는 것입니다. 곱셈 연산은 튜플의 요소를 지정된 횟수만큼 반복합니다. 다음은 두 가지 예시를 보여주는 예제입니다.
# 일부 값을 갖는 튜플 생성 values = (1, 2, 3, 4, 5) # 덧셈 연산을 사용하여 새 튜플 생성 added = values + values # 곱셈 연산을 사용하여 새 튜플 생성 multiplied = values * 2 print("values + values =", added) print("values * 2 =", multiplied)
마지막 말
이 글에서 배운 내용은 다음과 같습니다.
- 튜플은 여러 값을 저장하는 데 사용되는 리스트와 유사한 객체입니다.
- 리스트와 달리 튜플은 변경할 수 없습니다.
- 튜플은 리스트보다 빠르고 효율적입니다.
- 튜플은 괄호로 감싸고 값을 쉼표로 구분하여 만들 수 있습니다.
- 튜플은 튜플 생성자 함수를 사용하여 만들 수도 있습니다.
- 튜플의 개별 값은 0부터 시작하는 인덱스 시스템을 사용하여 접근할 수 있습니다.
- 튜플에서 값을 구조 분해할 수도 있습니다.
- for 루프를 사용하여 튜플의 값을 순회할 수도 있습니다.
- 튜플과 함께 사용할 수 있는 다양한 메서드가 있습니다.
다음으로는 파이썬 리스트 메서드 및 파이썬 딕셔너리 메서드와 같은 더 많은 파이썬 콘텐츠를 살펴보는 것을 추천합니다.