파이썬에는 다수의 데이터를 다룰 수 있는 자료형으로 '리스트(List)', '튜플(Tuple)', '사전(Dictionary)' 자료형이 있습니다.
지난번 포스팅에서는 '리스트(List)' 자료형에 대해서 알아보았으며, 이번 포스팅에서는 2회에 나누어서 '튜플(Tuple)' 자료형에 대해서 소개하겠습니다.
튜플(Tuple) 자료형은 리스트(List) 와 유사하면서도 큰 차이가 있어서 처음 파이썬 사용하는 분이라면 혼동스러울 수 있습니다.
튜플과 리스트는 다른 형태의 다수의 자료, 객체를 하나의 순서열(sequence)로 묶어서 자료를 관리할 수 있다는 공통점이 있습니다만, 튜플(Tuple)은 자료 변경이 불가능(A tuple is a sequence of immutable Python objects) 하다는 점이, 변경이 가능한 리스트와는 다른 결정적인 차이점입니다. (참고: 문자열(String)도 튜플처럼 변경이 불가능한 자료형임)
리스트는 꺽인 대괄호([ ], square brackets)로 양 옆을 싸서 생성하는 반면에, 튜플은 둥근 괄호( ( ), parentheses, round brackets)를 사용해서 만듭니다.
[ 파이썬의 5가지 자료형 (Python's 5 Data Types) ]
변경이 불가능한 자료형(Immutable Type)이 왜 필요할까 싶을텐데요, '소프트웨어 성능 향상'과 '프로그래머가 자기 코드를 신뢰할 수 있다'는 장점이 있습니다.
[ 변경이 불가능한 자료형이 왜 필요할까? ]
"변경이 불가능한 자료형은 변경 가능한 자료형에 비해 소프트웨어의 성능을 향상하는데 도움을 줍니다. 변경 가능한 자료형과는 달리 데이터를 할당할 공간의 내용이나 크기가 달라지지 않기 때문에 생성 과정이 간단하고, 데이터가 오염되지 않을 것이라는 보장이 있기 때문에 복사본을 만드는 대신 그냥 원본을 사용해도 되기 때문입니다.
사실 이런 성능보다도, 프로그래머가 자기 코드를 신뢰할 수 있다는 것이 변경이 불가능한 자료형의 가장 큰 장점입니다. 프로그래머가 수천~수만 줄의 코드를 작성하다보면 변경되지 않아야 할 데이터를 오염시키는 버그를 만들 가능성이 높습니다. 이런 실수를 몇 군데 해놓으면 어디에서 문제가 생겼는지를 찾아내기가 상당히 어렵습니다. 그래서 코드를 설계할 때부터 변경이 가능한 데이터와 그렇지 않은 데이터를 정리해서 코드에 반영하는 것이 필요합니다."
* 출처 : '뇌를 자극하는 파이썬 3', 박상현 지음, 한빛미디어
|
자, 이제 둥근 괄호( ( ), parentheses)나 혹은 콤마( ',' , comma)를 사용해서 튜플을 만들어볼까요?
1. 괄호와 콤마를 사용해서 튜플 만들기 (Creating tuple using parentheses or comma) : (obj, ) |
(1-1). 둥근 괄호 ('( )', parentheses, round brackets)를 사용해서 튜플 만들기
# tuples are encolsed within parentheses >>> tuple_1 = ('abc', 123, 3.14, ['edf', 456], ('gh', 'st')) >>> tuple_1 ('abc', 123, 3.14, ['edf', 456], ('gh', 'st')) >>> type(tuple_1) <class 'tuple'>
|
(1-2) 괄호 없이 콤마를 사용해서 튜플 만들기 (Tuple packing)
# tuple is created by putting different comma-separated values (without parentheses) >>> tuple_1_2 = 'abc', 123, 3.14, ['edf', 456], ('gh', 'st') >>> tuple_1_2 ('abc', 123, 3.14, ['edf', 456], ('gh', 'st')) >>> type(tuple_1_2) <class 'tuple'> |
(1-3) 요소가 하나뿐인 튜플 만들기 => 콤마 포함 필요
# creating tuple with 1 element using parentheses and a comma >>> tuple_1_element_with_comma = (123, ) >>> tuple_1_element_with_comma (123,) >>> type(tuple_1_element_with_comma) <class 'tuple'> |
요소가 하나뿐이 객체를 괄호로 싸기만 하고 뒤에 콤마를 포함하지 않는 경우, 튜플이 아니라 정수형(int.) 자료형으로 저장이 되므로 주의가 필요합니다.
# if you don't include a comma for a single value, it will be a int., not a tuple >>> int_1_element_without_comma = (123) # without a comma >>> int_1_element_without_comma 123 >>> type(int_1_element_without_comma) <class 'int'> |
2. 튜플 삭제(Deleting a Tuple): del tuple |
튜플은 변경이 불가능하기 때문에 개별 요소(individual elements)를 제거하는 것은 불가능합니다 (리스트는 pop 메소드나 remove 메소드로 개별 요소 삭제 가능). 대신에 튜플을 통째로 삭제(entire tuple)하는 것은 del 선언문을 사용해서 가능합니다.
# Deleting an entire Tuple with 'del' statement >>> tuple_1 = ('abc', 123, 3.14, ['edf', 456], ('gh', 'st')) >>> tuple_1 ('abc', 123, 3.14, ['edf', 456], ('gh', 'st')) >>> del tuple_1 >>> tuple_1 # tuple_1 is removed with del statement above Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'tuple_1' is not defined
|
3. 튜플 개별 요소를 변경하려면 TypeError 발생 |
>>> tup_1 = (1, 2, 3) >>> tup_1[0] = 4 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment |
4. 튜플 인덱싱, 슬라이싱 (Tuple indexing, slicing) : tup[0], tup[0:3], tup[-1], tup[-3:-1] |
튜플도 리스트나 문자열과 같이 순서열 자료형(sequences) 이기 때문에 대괄호([ ], square brackets)를 사용해서 특정 요소를 인덱싱(indexing)하거나 구간 범위의 요소들을 슬라이싱(slicing) 하는 것이 가능합니다. 인덱싱은 '0'부터 시작합니다.
tup[0]은 정수를, tup[0:1]은 튜플을 반환함을 주의하세요.
# Tuple indexing and slicing start at zero >>> tuple_2 = (1, 2, 3, 4, 5, 6, 7) >>> tuple_2 (1, 2, 3, 4, 5, 6, 7) >>> tuple_2[0] # Indexing one element of tuple => int. 1 >>> tuple_2[0:1] # Indexing one element of tuple => tutple (1,) >>> tuple_2[0:3] # Tuple slicing (1, 2, 3) >>> tuple_2[3:] # Tuple slicing (4, 5, 6, 7) |
튜플 인덱싱이나 슬라이싱을 할 때 '-' (negative) 부호가 붙으면 오른쪽에서 부터 시작하며, 이때 제일 오른쪽이 '-1'입니다.
# In case of negative(-), it counts from the rigth >>> tuple_2 = (1, 2, 3, 4, 5, 6, 7) >>> tuple_2 (1, 2, 3, 4, 5, 6, 7) >>> tuple_2[-1] # indexing from the right 7 >>> tuple_2[-1:] (7,) >>> tuple_2[-3:-1] # slicing from the right (5, 6) >>> tuple_2[-3:] (5, 6, 7)
|
5. 여러 개 데이터를 튜플로 묶기(Tuple Packing) <--> 튜플의 각 요소를 여러 개 변수에 할당하기(Tuple Unpacking) |
# Tuple packing >>> tup_packing = 'Mr.Lee', 25, 'Seoul', 'KOREA' >>> tup_packing ('Mr.Lee', 25, 'Seoul', 'KOREA')
# Tuple unpacking >>> name, age, city, nationality = tup_packing >>> name 'Mr.Lee' >>> age 25 >>> city 'Seoul' >>> nationality 'KOREA' |
튜플의 각 요소를 여러 개의 변수에 할당(Tuple unpacking)할 때 튜플 내 요소의 개수와 할당하려는 변수의 개수가 서로 같지 않다면 ValueError 가 발생합니다.
# if the number of unpack vaule and variable is not the same, then ValueError occurs >>> tup_packing # 4 elements ('Mr.Lee', 25, 'Seoul', 'KOREA') >>> name, age, city = tup_packing # 3 variables Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 3) |
6. 튜플의 기본 연산자 (Basic Tuples Operations) |
튜플의 기본 연산자에는 (리스트와 동일하게) 길이를 세는 len() 함수, 튜플을 합치는 '+' 연산자, 튜플 내 요소값을 반복하는 '*' 연산자, 튜플 내 요소값이 존재하는지 여부를 블리언값으로 반환하는 'in' 연산자, 그리고 for loop 반복 연산자가 있습니다.
설명 (Description) |
파이썬 코드 (Python Code) |
결과 (Results) |
튜플 길이 (Length) |
len((1, 2, 3)) |
3 |
튜플 합치기 (Concatenation) |
(1, 2, 3) + ('a', 'b', 'c') |
(1, 2, 3, 'a', 'b', 'c') |
반복 (Repetition) |
(1, 'a')*3 |
(1, 'a', 1, 'a', 1, 'a') |
소속 여부 (Membership) |
3 in (1, 2, 3) 4 in (1, 2, 3) |
True False |
for loop 반복 (iteration) |
for x in (1, 2, 3): print(x) |
1 2 3 |
다음번 포스팅에서는 튜플의 내장 함수(Tuple built-in functions)와 튜플 메소드(Tuple methods)에 대해서 알아보겠습니다.
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^