공든탑앱 열기

실기 Python: 슬라이싱·컬렉션·클래스 추적

정보처리기사 · 실기 준비와 코드 읽기 · 약 18분

쉽게 말하면

실기 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

시험에 이렇게 나와요

출제기준 기반

확인 문제

Q1. s = "PYTHON"일 때 s[1:4]의 값은?

  1. PYT
  2. YTH
  3. YTHO
  4. PYTH
정답 보기

2번 YTH

인덱스는 0부터예요. 1번(Y)부터 4번 앞(3번 H)까지라 YTH. 끝 번호는 포함하지 않아요.

Q2. a = [1, 2]; a.append([3, 4]); print(len(a))의 출력은?

  1. 4
  2. 2
  3. 3
  4. 오류
정답 보기

3번 3

append는 [3, 4]를 통째로 한 칸에 넣어 [1, 2, [3, 4]]. 길이 3.

Q3. print("abcdef"[::-2])의 출력은?

  1. fdb
  2. ace
  3. fedcba
  4. eca
정답 보기

1번 fdb

끝(f)에서 시작해 2칸씩 거꾸로 f, d, b.

Q4. print(17 // 4, 17 % 4)의 출력은?

  1. 4.25 1
  2. 5 1
  3. 4 4
  4. 4 1
정답 보기

4번 4 1

// 는 몫 4, % 는 나머지 1.

Q5. print({1, 2, 3} ^ {2, 3, 4})의 출력은?

  1. {2, 3}
  2. {1, 2, 3, 4}
  3. {1}
  4. {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

함께 보면 좋은 개념