리스트와 비교하여 생각하자.
튜플 자료형은 ( 순서 O, 중복 O, 수정X, 삭제X ) 즉, 한번 선언하면 끝까지 쓴다. 변하면 안 되는 데이터를 정의해놓으면 좋다.
a = ()
b = (1)
print(type(a), type(b)) # <class 'tuple'> <class 'int'>
c = (1,) # 원소가 하나일 때 튜플이 되려면 , 를 찍어줘야 한다.
d = (1, 100, 1000, 'Ace', 'Base', 'Captine')
e = (1, 100, 1000, ('Ace', 'Base', 'Captine')) # 튜플안에 튜플 선언 가능.
f = 1,2,3
마지막 f처럼 가로가 없어도 튜플 선언이 된다.
print(d[0] + d[1]) # 101
print(e[-1]) # ('Ace', 'Base', 'Captine')
print(e[-1][1]) # 'Base'
리스트 자료형과 같은 방법으로 인덱싱이 가능하다.
print(list(e[-1][1])) # ['B', 'a', 's', 'e']
튜플에서 리스트로 형 변환을 하게 되면, 불변성이 사라지고 리스트 자료형의 특성을 갖는다.
d = (1, 100, 1000, 'Ace', 'Base', 'Captine')
d[0] = 'edit' # TypeError: 'tuple' object does not support item assignment
e = (1, 100, 1000, ('Ace', 'Base', 'Captine'))
print(e[:3]) # (1, 100, 1000)
print(e[3][1:]) # ('Base', 'Captine')
마찬가지로 튜플의 슬라이싱은 리스트 자료형의 슬라이싱과 같은 특성을 갖는다.
d = (1, 100, 'Ace', 'Base', 'Captine')
e = (100, ('Ace', 'Base', 'Captine'))
print(d+e) # (1, 100, 'Ace', 'Base', 'Captine', 100, ('Ace', 'Base', 'Captine'))
print(d*2) # (100, ('Ace', 'Base', 'Captine'), 100, ('Ace', 'Base', 'Captine'))
튜플은 수정과 삭제가 불가능 하지만 연산은 허용한다.
a = (5, 2, 3, 1, 4, 2)
print(a.index(3)) # 2
print(a.index(10)) # ValueError: tuple.index(x): x not in tuple
print(a.count(2)) # 2
tuple.index(value)
: tuple에서 value가 들어있는 index 반환tuple.count(value)
: tuple에서 값이 value인 원소의 개수 반환t = ('foo', 'bar', 'baz', 'quz') # 4개의 원소를 하나로 묶음(팩킹)
print(t[0]) # 'foo'
팩킹은 여러가지를 하나로 묶는 것 이다. 묶었기 때문에 인덱싱도 가능하다.
t = ('foo', 'bar', 'baz', 'quz')
(x1, x2, x3, x4) = t
print(type(x1), type(x2), type(x3), type(x4)) # 모두 <class 'str'>
print(x1, x2, x3, x4) # 'foo' 'bar' 'baz' 'quz'
언팽킹은 묶여 있던 것을 풀어서 각각의 순서에 맞는 원소에 대입 된 것이다. ( 자바스크립트의 비구조화 할당과 비슷하네 ? )
# 가로가 있어도 없어도 언팩킹이 된다.
(x1, x2, x3, x4) = t
x1, x2, x3, x4 = t
t2 = 1,2,3 # 팩킹, 가로가 없어도 튜플
t3 = 4 # 팩킹
x1, x2, x3 = t2 # 언팩킹
x4, x5, x6 = 4,5,6 # 언팩킹, 튜플을 풀어서 x4, x5, x6에 할당