개념 정리
제어문과 반복 루프
단원 개요
프로그램의 실행 흐름을 분기하는 조건문(if-elif-else), 단락 평가(Short-circuit Evaluation), 반복 루프(for/while) 제어(break/continue) 및 리스트 컴프리헨션을 학습합니다.필수 키워드:거짓(Falsy)참(Truthy)
A and BA or Bfor 루프 (횟수/시퀀스 기반 반복)순회 가능한 객체(Iterable)while 루프 (조건 기반 반복)무한 루프(Infinite Loop)흐름 제어 키워드break1
조건 분기문(if-elif-else)과 논리 연산의 단락 평가(Short-Circuit)
•
조건문 (Conditional Statement): 주어진 조건식의 평가 결과(참
True 또는 거짓 False)에 따라 실행할 코드 블록을 결정합니다.•
파이썬에서는 숫자
0, 빈 문자열 "", 빈 리스트 [], None은 조건식에서 자동으로 거짓(Falsy)으로 평가되고, 그 외의 값이 있는 객체는 참(Truthy)으로 평가됩니다.•
단락 평가 (Short-Circuit Evaluation):
•
논리 연산자
and(&&)와 or(||)는 왼쪽 식만으로 전체 결과가 확정되면 오른쪽 식은 아예 실행(평가)조차 하지 않고 건너뛰는 최적화 규칙입니다.•
A and B: A가 거짓(False)이면 전체가 무조건 거짓이므로 B를 실행하지 않음. (예: if idx < len(arr) and arr[idx] == 5:에서 인덱스 범위 검사를 앞에 두어야 IndexError를 예방할 수 있습니다!)•
A or B: A가 참(True)이면 전체가 무조건 참이므로 B를 실행하지 않음.핵심 원리
단락 평가(Short-Circuit)를 활용한 실무 방어 코딩: 배열 조회나 나눗셈을 할 때 항상 if x != 0 and (100 / x) > 5: 또는 if user is not None and user.is_active:처럼 안전한 가드(Guard) 조건을 왼쪽에 배치해야 런타임 에러(ZeroDivisionError, NullPointerException)를 막을 수 있습니다.2
반복문(for vs while)과 루프 제어(break, continue)
1
for 루프 (횟수/시퀀스 기반 반복):•
리스트, 문자열,
range(start, stop, step) 등 순회 가능한 객체(Iterable)에서 원소를 처음부터 끝까지 하나씩 꺼내며 정해진 횟수만큼 안전하게 반복합니다.•
주의:
range(1, 5)는 시작값 1은 포함하고 끝값 5는 포함하지 않는 반열린 구간 이므로 1, 2, 3, 4 총 4번 실행됩니다.2
while 루프 (조건 기반 반복):•
조건식이
True인 동안 코드 블록을 계속 반복합니다. 반복 횟수를 미리 알 수 없을 때(예: 이진 탐색에서 while low <= high:, 사용자 종료 입력 대기) 유용하지만, 루프 내부에서 조건 변수를 갱신하지 않으면 무한 루프(Infinite Loop)에 빠집니다.3
흐름 제어 키워드:
•
break: 현재 감싸고 있는 가장 가까운 반복 루프를 즉시 완전히 탈출합니다.•
continue: 현재 반복 회차의 아래쪽 남은 코드만 건너뛰고, 루프의 다음 반복 회차(조건 검사 또는 다음 원소)로 즉시 이동합니다.풀이
1) range(1, 10)은 n = 1부터 9까지 순회합니다.
2) 첫 번째 조건 if n % 2 == 0: continue에 의해 짝수(2, 4, 6, 8)는 모두 건너뛰고 홀수만 아래로 내려갑니다.
3) 홀수 진행 추적:
•
n = 1: total = 0 + 1 = 1
•
n = 3: total = 1 + 3 = 4
•
n = 5: total = 4 + 5 = 9
•
n = 7: 두 번째 조건
if n > 6: break가 참이 되어 7을 더하기 전에 반복문이 즉시 완전 종료됩니다!4) 따라서 더해지는 숫자는 1, 3, 5이며 최종 total 값은 9입니다.
3
파이썬다운 코딩(Pythonic): 리스트 컴프리헨션과 enumerate/zip
•
리스트 컴프리헨션 (List Comprehension):
•
새로운 리스트를 만들 때 여러 줄의
for문과 append() 호출 대신, 대괄호 안에 선언적 수식으로 한 줄에 작성하는 문법입니다:•
예: 1부터 10까지 중 홀수의 제곱 리스트 ➔
[x**2 for x in range(1, 11) if x % 2 == 1] ➔ [1, 9, 25, 49, 81].•
내부적으로 C언어 레벨에서 최적화되어 실행되므로 일반
for 루프에서 .append()를 반복 호출하는 것보다 가독성이 높고 실행 속도도 약 1.5~2배 빠릅니다.•
필수 내장 이터레이터 함수:
•
enumerate(iterable): 인덱스와 원소 값을 튜플 (idx, val)로 동시에 꺼내어 range(len(arr)) 패턴을 대체합니다.•
zip(listA, listB): 두 개 이상의 시퀀스를 나란히 묶어 같은 위치의 원소 쌍을 동시에 순회합니다.주의할 점
2차원 배열 초기화 함정: matrix = [[0] * M] * N처럼 바깥쪽 리스트에 곱셈 연산자(* N)를 쓰면 똑같은 행 리스트의 참조 주소가 N번 복사되어, matrix[0][0] = 1만 바꿔도 모든 행의 첫 번째 열이 전부 1로 바뀌는 대형 버그가 발생합니다! 반드시 리스트 컴프리헨션 [[0] * M for _ in range(N)]으로 생성하세요.핵심 요약
- ✓논리 연산의 단락 평가(Short-Circuit)에 의해
A and B에서 A가 거짓이면 B는 아예 실행되지 않는다. - ✓break는 반복 루프 자체를 즉시 탈출하고, continue는 현재 회차의 남은 코드를 건너뛰고 다음 반복으로 넘어간다.
- ✓리스트 컴프리헨션
[expr for x in iter if cond]는 일반 루프 append보다 간결하고 빠르게 새 리스트를 생성한다. - ✓2차원 리스트 생성 시 얕은 참조 복사를 막기 위해 반드시
[[0] * M for _ in range(N)]형태를 사용해야 한다.