- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기
슬라이스를 사용하는 예제
일단 리스트 하나를 만들어봅시다. 아래 리스트는 항목이 총 18개입니다. 인덱스는 0
에서 17
이겠지요.
ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
좋습니다, 이제 이 리스트에서 인덱스 2
부터 17
까지의 요소를, 3칸 간격으로 뽑아내고 싶습니다. 고전적인 while
과 변수 하나를 이용해서 구현을 해봅시다.
ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = []
i = 2
while i < 18:
another_ls.append(ls[i])
i += 3
print(another_ls)
[23, 66, 9, 12, 19, 3]
좋습니다. 우리의 의도대로 아주 잘 동작합니다.
그런데 뭔가 스멀스멀 떠오르지 않나요? 저런 상황은 우리가 이전에 한 번 접했습니다. 곧바로 range
가 떠오릅니다. 우리가 range
를 만들 때 범위를 어떻게 지정했는지 기억하시나요?
ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = []
for i in range(2, 18, 3):
another_ls.append(ls[i])
print(another_ls)
[23, 66, 9, 12, 19, 3]
range(2, 18, 3)
은 2 이상 18 미만까지 간격을 3칸으로 하여 숫자를 뽑아내겠다는 뜻입니다. 이를 이용하여 i
라는 변수를 일일히 다루지 않고 간편하게 for
에 포함시켰습니다!
하지만, 슬라이싱이라는 문법을 이용하면 이조차 더 간단하게 하여, 아주 손쉽게 해당 리스트의 일부를 얻어올 수 있습니다.
ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = ls[2:18:3]
print(another_ls)
[23, 66, 9, 12, 19, 3]
용법
문법은 sequence[start:end:step]
입니다. 즉 start
부터 시작하여, end
미만일 때까지 (절대 end
를 포함하지 않아요!) step
의 간격만큼 반복한다는 뜻입니다! range
와는 조금 비슷하지만 다르게, 각 항목을 생략할 수도 있는데요, start
를 생략하게 되면 0
으로, end
를 생략하게 되면 완전 끝까지, step
을 생략하면 1이 됩니다. 아래는 예시입니다. 참 쉽죠? ls
는 처음에 0부터 15까지의 숫자를 차례대로 지니고 있습니다. 그래서 슬라이스 결과가 어떤 인덱스를 가리키는지 직관적으로 알 수 있습니다.
ls = list(range(16))
print(ls)
print(f'{ls[4:11:2] = }')
print(f'{ls[:11:2] = }')
print(f'{ls[4::2] = }')
print(f'{ls[4:11:] = }')
print(f'{ls[4::] = }')
print(f'{ls[:11:] = }')
print(f'{ls[::2] = }')
print(f'{ls[::] = }')
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ls[4:11:2] = [4, 6, 8, 10]
ls[:11:2] = [0, 2, 4, 6, 8, 10]
ls[4::2] = [4, 6, 8, 10, 12, 14]
ls[4:11:] = [4, 5, 6, 7, 8, 9, 10]
ls[4::] = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ls[:11:] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ls[::2] = [0, 2, 4, 6, 8, 10, 12, 14]
ls[::] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
슬라이스에는 음수도 사용할 수 있습니다. start
와 end
에 음수가 있을 때에는 마지막으로부터 얼마나 떨어져있는지를 나타냅니다. 예를 들어 -1
이라면 가장 마지막에 있는 항목이고 -4
라면 마지막에서 네 번째에 있는 항목을 나타냅니다. step
이 음수라면 인덱스가 점차적으로 작아집니다. 어느 하나가 음수이든지 상관없이 생략도 할 수 있습니다. 이를 이용해 온갖 기상천외한 조합을 만들 수 있습니다.
ls = list(range(16))
print(ls)
print(ls[-10:-3:]) # 마지막 10번째 이상, 마지막 3번째 미만, 1칸 씩 커짐.
print(ls[12:5:-1]) # 12이하 5초과, 1칸 씩 작아짐.
print(ls[12::-1]) # 12이하 처음까지, 1칸 씩 작아짐.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
[6, 7, 8, 9, 10, 11, 12]
[12, 11, 10, 9, 8, 7, 6]
[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
연습 문제
- 슬라이스는 무엇인가?
프로그래밍 문제
ls = list(range(16))
로부터 시작하도록 합니다. 아래 문제는 모두 슬라이스를 이용하도록 합니다.
- 이 리스트를 왼쪽 두 개, 오른쪽 두 개를 모두 제외하여 출력하세요.
- 이 리스트를 왼쪽 두 개, 오른쪽 두 개를 모두 제외하여, 큰 수부터 작은 수까지 3칸 간격으로 출력하세요.
- 리스트의 범위를 넘어가는 수를 넣었을 때 어떻게 되는지 실험해보세요.
프로그래밍 문제 정답
print(ls[2:-2:])
(결과:[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
)print(ls[-3:1:-2])
(결과:[13, 10, 7, 4]
)- 범위를 벗어난 항목에 대해서는 단순히 계산하지 않을 뿐이다. 에러는 발생하지 않는다.
start
를-100
과 같이 아주 큰 수를 둔다 해도0
부터 잘 시작한다.
- 프롤로그
- 개발 첫걸음
- 파이썬 기초
- 파이썬 중급
- 파이썬 고급
- 내장 함수 톺아보기
- 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
- 변수의 범위 – 이름 검색의 범위
- 파이썬 심화
- 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
- 데코레이터 – 함수의 기능을 강화하기
- 프로퍼티
- 제너레이터
- async와 await
- 객체로서의 클래스 – 클래스를 동적으로 정의하기
- 파이썬 프로젝트 실습
- 원카드 게임 만들기 (1)
- 원카드 게임 만들기 (2)
- 원카드 게임 만들기 (3) (작성중)
- 턴제 자동 전투 게임 만들기 (작성중)
- 실전 (파이썬 외적인 것들)
- 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
- 유니코드 – 컴퓨터에서 문자를 표기하는 방법
- html, css, 인터넷 – 자동화 첫 걸음 내딛기
- 네트워크 – 인터넷으로 통신하는 방법
- 문서 – 문맥을 읽어보기