실기 Python: 슬라이싱·컬렉션·클래스 추적
쉽게 말하면
실기 Python 문제는 짧지만 함정이 촘촘해요. 문자열을 잘라 쓰는 슬라이싱 s[시작:끝:간격]에서 끝 번호는 포함하지 않아요. 리스트에 append로 리스트를 넣으면 통째로 한 칸에 들어가고, extend는 하나씩 풀어서 넣어요. 나눗셈 / 는 소수까지, // 는 몫만 남겨요. 그리고 print로 리스트를 찍으면 [1, 2, 3]처럼 대괄호와 쉼표 뒤 공백까지 그대로 나와요.
시험용 정의
인덱싱 s[i]는 0부터 세고, 음수는 뒤에서부터(-1이 마지막) 센다. 슬라이싱 s[시작:끝:간격]은 시작부터 끝 바로 앞까지 간격만큼 건너뛰며 가져온다. 생략하면 처음·끝·1이고, 간격이 음수면 거꾸로 간다(s[::-1]은 뒤집기). 리스트 메서드: append(x)는 x를 한 칸으로 끝에 추가, extend(목록)는 하나씩 풀어 추가, insert(i, x)는 i 위치에 끼워 넣기, remove(x)는 처음 나오는 x 하나 삭제, pop()은 마지막을 꺼내 돌려준다. 딕셔너리는 키: 값 쌍이고 get(키, 기본값)은 키가 없을 때 기본값을 준다. 집합은 중복이 없고 | 합집합, & 교집합, − 차집합, ^ 대칭 차집합을 쓴다. range(시작, 끝, 간격)도 끝을 포함하지 않는다. /는 실수 나눗셈, //는 몫(내림), %는 나머지, **는 거듭제곱이다. 함수의 기본값 인자, 남는 인자를 튜플로 받는 *args, 한 줄 함수 lambda가 자주 나온다. 클래스 안에 바로 적은 변수는 클래스 변수(모든 객체 공유), self.x는 인스턴스 변수(객체마다 따로)다.
비유로 이해하기
슬라이싱은 줄자로 길이를 재는 것과 같다. 눈금 1부터 4까지 자르면 1과 2 사이, 2와 3 사이, 3과 4 사이 세 칸이 잘린다. 4번 눈금 뒤 칸은 들어가지 않는다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 인덱스 | 글자나 항목의 번호. 0부터, 음수는 뒤에서부터 |
| 슬라이싱 | s[시작:끝:간격]으로 일부를 잘라 오기. 끝은 포함 안 함 |
| 리스트 / 튜플 | [ ] 로 만드는 바꿀 수 있는 목록 / ( ) 로 만드는 바꿀 수 없는 목록 |
| 딕셔너리 | {키: 값} 쌍의 모음 |
| 집합 (set) | 중복 없는 값의 모음. 순서가 없다 |
| 컴프리헨션 | [식 for 변수 in 범위 if 조건] 으로 리스트를 한 줄에 만드는 문법 |
| lambda | 이름 없는 한 줄 함수. lambda x: x * 2 |
예제 1: 슬라이싱
s = "ABCDEFG" # 인덱스 0~6 print(s[1:4]) # BCD print(s[-2:]) # FG print(s[::2]) # ACEG print(s[::-1]) # GFEDCBA print(s[5:1:-2]) # FD (5번, 3번)
예제 2: 리스트
a = [5, 3] a.append([1, 2]) print(a, len(a)) # [5, 3, [1, 2]] 3 b = [5, 3] b.extend([1, 2]) print(b, len(b)) # [5, 3, 1, 2] 4 b.sort(reverse=True) print(b) # [5, 3, 2, 1] c = b # 같은 리스트를 가리킴 (복사 아님) c.append(0) print(b) # [5, 3, 2, 1, 0]
예제 3: 딕셔너리·집합·range
d = {"a": 1}
d["b"] = 2
d["a"] += 10
print(d) # {'a': 11, 'b': 2}
x, y = {1, 2, 3}, {3, 4}
print(x | y, x & y, x - y) # {1, 2, 3, 4} {3} {1, 2}
print(list(range(10, 0, -3))) # [10, 7, 4, 1]
print([n * 2 for n in range(4)]) # [0, 2, 4, 6]
print(7 / 2, 7 // 2, -7 // 2, 2 ** 3) # 3.5 3 -4 8-7 // 2는 −3.5를 내림해 −4예요. 딕셔너리를 print하면 문자열 키에 작은따옴표가 붙어요.
예제 4: 함수와 클래스
print(list(map(lambda v: v * v, [1, 2, 3]))) # [1, 4, 9]
print(list(filter(lambda v: v % 2, range(6)))) # [1, 3, 5]
print(1, 2, sep="-", end="!\n") # 1-2!
class C:
n = 0 # 클래스 변수 (공유)
def __init__(self):
C.n += 1
self.m = C.n # 인스턴스 변수 (객체마다)
a, b = C(), C()
print(a.m, b.m, C.n) # 1 2 2시험에 이렇게 나와요
- 슬라이싱 끝 번호 미포함, 음수 인덱스와 음수 간격
- append와 extend 차이, remove는 첫 번째 하나만, pop은 마지막
- 집합 연산 | & - ^, 딕셔너리 get
- / 와 // 와 %, range 끝 미포함
- 기본값 인자·*args·lambda, 클래스 변수와 인스턴스 변수
출제기준 기반
확인 문제
Q1. s = "PYTHON"일 때 s[1:4]의 값은?
- PYT
- YTH
- YTHO
- PYTH
정답 보기
2번 YTH
인덱스는 0부터예요. 1번(Y)부터 4번 앞(3번 H)까지라 YTH. 끝 번호는 포함하지 않아요.
Q2. a = [1, 2]; a.append([3, 4]); print(len(a))의 출력은?
- 4
- 2
- 3
- 오류
정답 보기
3번 3
append는 [3, 4]를 통째로 한 칸에 넣어 [1, 2, [3, 4]]. 길이 3.
Q3. print("abcdef"[::-2])의 출력은?
- fdb
- ace
- fedcba
- eca
정답 보기
1번 fdb
끝(f)에서 시작해 2칸씩 거꾸로 f, d, b.
Q4. print(17 // 4, 17 % 4)의 출력은?
- 4.25 1
- 5 1
- 4 4
- 4 1
정답 보기
4번 4 1
// 는 몫 4, % 는 나머지 1.
Q5. print({1, 2, 3} ^ {2, 3, 4})의 출력은?
- {2, 3}
- {1, 2, 3, 4}
- {1}
- {1, 4}
정답 보기
4번 {1, 4}
^ 는 대칭 차집합: 한쪽에만 있는 원소 {1, 4}.
헷갈리기 쉬운 O·X
s[2:5]는 인덱스 2, 3, 4, 5의 글자를 가져온다.
정답 보기
X 끝 번호 5는 포함하지 않아 2, 3, 4만이에요.
b = a로 리스트를 대입하면 b를 바꿔도 a는 그대로다.
정답 보기
X 같은 리스트를 가리켜 a도 바뀌어요. 복사하려면 a[:]나 a.copy().
Python에서 7 / 2의 결과는 3.5다.
정답 보기
O