리스트에 이어서 튜플 이 무엇인지 짚어보고 넘어가보자!
튜플 은 리스트처럼 요소를 일렬로 저장하지만, 안에 저장된 요소를 변경, 추가, 삭제를 할 수 없다.!!
쉽게 설명하면 값을 읽는 용도 로만 사용한다는 것이다.
튜플 은 ( )로 묶어주면 튜플 이 된다.
>>> a = (2, 4, 6, 8) # 튜플 = (값, 값, 값)
>>> a
(2, 4, 6, 8)
>>> b = 8, 12, 14, 16 # 튜플 = 값, 값, 값
>>> b
(8, 12, 14, 16)
튜플에도 range 를 사용하여 만들어 줄 수 있다.
>>> H = tuple(range(17)) # 튜플 = tuple(range(횟수))
>>> H
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)
>>> C = tuple(range(1, 6)) # 튜플 = tuple(range(시작, 끝))
>>> C
(5, 6, 7, 8, 9, 10, 11)
>>> T = tuple(range(-1, 5, 2)) # 튜플 = tuple(range(시작, 끝, 증가폭))
>>> T
(-1, 0, 2, 4)
우리는 파이썬에서 리스트, 튜플, range, 문자열처럼 값이 연속적으로 이어진 자요형을 시퀀스 자료형 이라고 배웠다.
쉽게 해석하면,
리스트: [5, 6, 7, 8, 9] 튜플: (10, 11, 12, 13, 14) range(5) 과같이 설명할 수 있다.
느낌이 올 것이다. 강요는 아니다.
이렇게 시퀀스는 객체로 공통된 동작과 기능을 사용할 수 있다.
쉽게 설명하면,
팀(시퀀스 객체) 팀원(객체) 라고 표현할 수 있다.
시퀀스 객체 안에 특정 값이 있는지 확인해볼 수 있다. 참과 거짓으로 구분해보자!
>>> a = [5, 10, 15, 25, 30, 35, 40] # 값 in 시퀀스객체
>>> 10 in a # 10이 안에 있지?
True # 진실!
>>> 50 in a # 50이 안에 있지?
False # 거짓!
>>> b = [5, 10, 15, 25, 30, 35, 40] # 값 not in 시퀀스객체
>>> 50 not in b # 50이 b 안에 없지?
True # 진실!
>>> 25 not in b # 25가 b 안에 없지?
False # 거짓!
시퀀스 객체를 +(연산자)를 사용해서 서로 연결해줄 수 있다. 결과는 새로운 객체를 만들어낸다!
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> b = [8, 9, 10, 11, 12, 13, 14]
>>> a + b # 시퀀스객체1 + 시퀀스객체2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
* range는 +(연산자)로 객체를 연결할 수 없다... 하지만 앞에 리스트, 튜플을 사용하면 연결할 수 있다. 기억하자!!
이제 시퀀스객체에 여러 요소가 들어 있을 것이다. 요소에 개수(길이)를 구할 때는 len 함수를 사용한다.
그렇다면, 어디에 어떤 숫자가 위치해 있는지 어떻게 원하는 요소를 불러올지 고민할 것이다.
이때 바로 인덱스 에 대한 개념이 나온다.
인덱스는 순서에 맞게 원하는 요소를 불러올 수 있다. 어렵지 않다. 차근차근 이해하자.
인덱스는 객체에 [ ]대괄호를 붙이고 대괄호 안에 인덱스를 지정하면 되는데,
a[0]을 출력하면 a에 들어있던 리스트에 제일 첫 번째 요소 가 출력된다.
a[0]=17, a[1]=18, a[2]=20 등등 이렇게 출력할 수 있다.
여기서 중요한 점은 0부터 첫 번째 순서로 시작한다는 점이다.
쉽게 기억하면 첫 번째 -1을 하면 인덱스 값이다!!
그.렇.다.면
인덱스를 음수로 지정한다면?!!!!
이것도 어렵지 않다.
17이라는 요소가 첫 번째인데 어떻게 음수로 지정하겠는가??
바로 정답은. 음수로 지정하면 맨 뒤에서부터 -1으로 시작한다.
a[-1]=23, a[-2]=5, a[-3]=20 등등 이렇게 지정할 수 있다.!! 어렵지 않다.
리스트로 지정된 요소에 값을 변경할 수 있다?!
정답이다. 지정된 요소에 이미 들어있는 값을 변경할 수 있다.
>>> a = [0, 0, 0, 0, 0] # 0이 5개 들어있는 리스트
>>> a[0] = 38
>>> a[1] = 21
>>> a[2] = 53
>>> a[3] = 62
>>> a[4] = 19
>>> a
[38, 21, 53, 62, 19]
>>> a[0]
38
>>> a[4]
19
그러면 삭제도 가능할까?
할 수 있다!!
>>> a = [38, 21, 53, 62, 19]
>>> del a[2] # del 시퀀스객체[인덱스]
>>> a
[38, 21, 62, 19]
이렇게 하면 요소를 삭제 할 수 있다.
하지만 튜플, range는 읽기 전용이기 때문에 변경, 삭제가 불가능 하다!! 정말 중요한 부분이다 기억하자!!
+
공부를 하다가 시퀀스 자료형에서 자주 사용하는 슬라이스(slice)를 놓쳤다.
슬라이스는 일부를 잘라내어 필요한 객체를 사용하겠다는 기능이다.
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[0:5] # 인덱스 0부터 4까지 잘라서 새 리스트를 만듦, 시퀀스객치[시작인덱스:끝인덱스]
[0, 10, 20, 30, 40]
>>> b = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> b[4:7] # 인덱스 4부터 6까지 요소 3개를 가져옴
[40, 50, 60]
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:8:3] # 인덱스 2부터 3씩 증가시키면서 인덱스 7까지 가져옴
[20, 50]
어렵지 않다. 범위만 이해를 한다면 충분히 쉽게 느껴질 것 이다.
이번에는 슬라이스를 이용해서 요소에 추가를 해보자!
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:5] = ['a', 'b', 'c'] # 인덱스 2부터 4까지 값 할당
>>> a
[0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
삭제도 가능하다!!
삭제를 할 때는 del을 이용해서 삭제를 할 수 있다.
>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> del a[2:5] # 인덱스 2부터 4까지 요소를 삭제
>>> a
[0, 10, 50, 60, 70, 80, 90]