처음부터 차근차근 파이썬 자세히보기

Python-기본/Python-데이터 타입 및 자료 구조

Python-3. 시퀀스 데이터 타입(2. 튜플)

윤빵빵영 2020. 12. 30. 11:51

앞의 글까지 파이썬의 기본적인 자료형들을 다뤘습니다. 정수, 부동소수점으로 시작하는 숫자부터 문자열, 그리고 그 안에서 조금씩은 다뤘던 불형(boolean) 데이터까지 경험해보았습니다. 이 자료형들은 파이썬에서 형태나 구조가 가장 단순한 자료형이라고 할 수 있습니다. 즉, 이 자료형으로부터 좀 더 복잡한 구조의 자료형이 만들어질 수 있습니다. 마치 원자가 결합하여 분자를 만드는 것과 동일합니다. 

대부분의 컴퓨터 언어는 위와같은 원자의 나열(sequence)로 만들어지면서 각 원자들의 위치가 정수로서 인덱싱(indexing)되는 형태의 자료 구조를 갖고 있습니다. 앞서 다뤘던 문자열도 문자의 나열로 만들어지면서 각 문자의 위치가 정수로 할당되었었죠? 파이썬은 어떠한 특별한 설정 없이도 여러 가지 자료형으로 구성된 배열 구조(sequence structure)를 갖는 자료형의 조작을 지원합니다. 바로 튜플(tuple)과 리스트(list)입니다.

튜플과 리스트의 원소로는 파이썬의 어떠한 객체든 올 수 있습니다. 이를 통해 자료 구조를 더욱 깊고 복잡하게 사용자가 원하는 만큼 만들 수 있게 됩니다.

파이썬이 배열 구조로 두 가지를 지원하는 이유는 바로 가변성 때문입니다. 튜플은 불변(immutable) 자료형이고 리스트는 가변(mutable) 자료형입니다. 튜플에 어떤 객체를 할당하게 되면, 이 객체의 위치와 값은 절대 바꿀 수 없습니다. 반면 리스트는 배열 내에서 객체의 추가, 삭제, 위치 변동 등이 자유롭습니다. 

이번 장에서는 파이썬의 시퀀스 자료형 중 하나인 튜플을 다뤄보고자 합니다. 불변이니 가변이니 하는 얘기는 여지껏 불변형 자료만 다뤄왔기 때문에 비교군이 없어 설명이 좀 힘들 것 같아 뺐습니다. 대신 리스트에서 불변형 자료와 가변형 자료를 비교하면서 설명한다면 독자분들이 이해하기 수월할 것 같습니다. 이번 글에서는 튜플 그 자체의 구조와 작동에 대해서 배우겠습니다.


목차

튜플(Tuple)

1. 시퀀스 데이터 타입 속성-튜플
  (1). 멤버십 연산 in
  (2). 크기 함수 len(seq)
  (3). 슬라이싱 속성 seq[:]
  (4). 반복성(iterable)
2. 튜플 연산
  (1). 튜플 더하기
  (2). 튜플 곱하기 
3. 튜플 메서드
  (1) count( )
  (2) index( )


 

튜플(Tuple)

튜플 쉼표(,) 구분된 객체들 이루어지는 불변(immutable) 자료형이자 시퀀스 자료형입니다.

튜플의 선언은 일반적으로 괄호 ( )를 이용하여 이뤄지며 이 괄호가 생략되어도 무방합니다. 튜플은 자료형의 모음을 만들 수 있는 자료형이며 튜플 안에 저장할 수 있는 자료형은 숫자, 문자열, 튜플 자신, 그리고 리스트 등 어떤 객체든 가능합니다. 우선 숫자를 저장하고 있는 튜플을 생성해봅시다.

x = (1, 2, 3, 4)
print(x, type(x))
y = 2, 4, 6, 8
print(y, type(y))

결과)

(1, 2, 3, 4) <class 'tuple'>
(2, 4, 6, 8) <class 'tuple'>


파이썬은 print( )를 이용하여 출력할 때 괄호 없이 선언된 튜플에 대해서도 괄호와 함께 출력합니다. 괄호의 유무는 중요하지 않으며 오직 쉼표만이 튜플을 정의합니다. 

문자열을 포함한 튜플이나 튜플 그 자체를 포함한 튜플을 만들 수도 있습니다.

a = 1234, '안녕'
print(a)
b = a, (1, 2, 3, 4) 
print(b)

결과)

(1234, '안녕')
((1234, '안녕'), (1, 2, 3, 4))


튜플은 괄호 쌍으로 생성할 있습니다.

empty_tuple = ()
print(empty_tuple)
a = '안녕',
print(a)
b = ('안녕')
print(b)

결과)

()
('안녕',)
안녕


튜플은 또한 여러 변수를 한 번에 할당할 때 사용되기도 합니다.

marx_tuple = ('Groucho', 'Chico', 'Harpo')
a, b, c = marx_tuple
print(a)
print(b)
print(c)
x, y, z = 3, 5, 7
print(x)
print(y)
print(z)

결과)

Groucho
Chico
Harpo
3
5
7


뒤의 코드 x, y, z = 3, 5, 부분은 어찌 보면 x에 3을, y에 5를, z에 7을 할당하라는 선언 같지만 튜플 (3, 5, 7)을 이용한 다변수 동시 할당과 같다는 것을 알 수 있을 겁니다. 이러한 것을 튜플 언패킹(tuple unpacking)이라 합니다. 

파이썬에 내장된 함수 tuple( )은 다른 자료형을 튜플로 변환할 수 있는 함수입니다. 이때 인자(argument)로는 iterator(값을 차례대로 꺼낼 수 있는 객체)가 와야 합니다. 대표적으로 리스트가 있습니다.

number_list = [1, 5, 7, 4]
number_tuple = tuple(number_list)
print(number_list)
print(number_tuple)

결과)

[1, 5, 7, 4]
(1, 5, 7, 4)


다시 한 번 강조합니다. 튜플은 불변 자료형이기 때문에 한 번 선언된 튜플은
값의 삽입, 삭제, 수정이 불가능합니다

 

1. 시퀀스 데이터 타입 속성-튜플

  (1). 멤버십 연산 in

x = '전영근', '윤영', '김현수', '명경규'
print('윤영' in x)
print('전현우' in x)

결과)

True
False

 

  (2). 크기 함수 len(seq)

x = '전영근', '윤영', '김현수', '명경규', '전현우'
print(len(x))

결과)

5

 

  (3). 슬라이싱 속성 seq[:]

x = '전영근', '윤영', '김현수', '명경규', '전현우'
print(x[0])
print(x[3])

결과)

전영근
명경규

 

x = '전영근', '윤영', '김현수', '명경규', '전현우'
print(x[0:2])
print(x[3:-1])
print(x[2:-1])

결과)

('전영근', '윤영')
('명경규',)
('김현수', '명경규')

 

x = '전영근', '윤영', '김현수', '명경규', '전현우'
print(x[0:-1:2])

결과)

('전영근', '김현수')

 

  (4). 반복성(iterable)

x = '전영근', '윤영', '김현수', '명경규', '전현우'
for i in x:
    print(i)

결과)

전영근
윤영
김현수
명경규
전현우

이와 같이 튜플은 시퀀스 타입의 데이터이므로 이 타입의 데이터가 갖는 네 가지 속성을 사용할 수 있습니다. 

 

2. 튜플 연산

  (1). 튜플 더하기

t1 = 1, 2, 'a', 'b' 
t2 = (3, 4) 
print(t1 + t2)

결과)

(1, 2, 'a', 'b', 3, 4)

 

  (2). 튜플 곱하기 

t1 = 1, 2, 'a', 'b' 
print(t1 * 3)

결과)

(1, 2, 'a', 'b', 1, 2, 'a', 'b', 1, 2, 'a', 'b')

 

3. 튜플 메서드

count( ), index( )

  (1) count( )

A.count(x): 튜플 A 담긴 항목 x 개수를 반환합니다.

t = 1, 5, 7, 8, 9, 4, 1, 4
print(t.count(4))

결과)

2

 

  (2) index( )

A.index(x): 항목 x 인덱스 위치를 반환합니다.

t = 1, 5, 7
print(t.index(5))

결과)

1