C
Python/입문/Lesson 05

제어 흐름 — if · for · while · 컴프리헨션 기초

30분·theory
이 챕터
4/7

제어 흐름 — if · for · while · 컴프리헨션 기초

🎯 이 lesson 을 읽고 나면

이 lesson 을 다 읽고 나면 아래 3가지를 자신 있게 할 수 있습니다.

  • ✅ 들여쓰기 규칙 (PEP 8 — 4 spaces)
  • ✅ enumerate · zip · range 의 정확한 사용
  • ✅ 리스트 컴프리헨션 + dict comprehension

학습 목표를 체크리스트로 두고 다 답할 수 있게 되면 lesson 을 닫으세요.

if · elif · else — *조건 분기 + 들여쓰기 규칙*

if / elif / else — 조건 분기의 기본

python
score = 85

if score >= 90:
    grade = 'A'
elif score >= 80:    # else if 아니라 elif (한 단어)
    grade = 'B'
elif score >= 70:
    grade = 'C'
else:
    grade = 'F'

print(grade)   # 'B'   ← 85 는 80 이상이라 두 번째 분기

핵심 규칙:

  • 조건 줄 끝에 콜론 : 필수
  • 다음 줄은 4칸 들여쓰기 (블록)
  • else if 가 아니라 elif — Python 만의 줄임말

비교 연산자: == (같음) / != (다름) / >= (이상) / <= (이하) / < / >


조건 표현식 (삼항) — 한 줄 if

python
age = 28
label = '성인' if age >= 19 else '미성년'
print(label)   # '성인'

{값1} if {조건} else {값2} — JS 의 cond ? a : b 와 같지만 순서가 다름 (값이 앞).


truthy / falsy — if 의 숨은 규칙

python
if x:            # x 가 truthy 인가 (값이 "있다고 인정되나")
if not x:        # x 가 falsy 인가

Python falsy 7가지: 0, 0.0, '', None, False, [], {}, (). 빈 컬렉션도 falsy.

python
items = []
if items:                     # False — 빈 리스트는 falsy
    print('있음')
elif items is None:           # 명시적 None 검사 (PEP 8: == None 보다 is None 권장)
    print('미초기화')
else:
    print('비어있음')         # ← 이게 출력됨

들여쓰기 규칙 — SyntaxError 1위 원인

Python 은 { } 대신 들여쓰기 깊이 로 블록을 구분. 깊이가 같으면 같은 블록.

python
if x > 0:
    print("양수")          # 4칸 들여쓰기 → if 블록 안
    print("두 번째 줄")    # 같은 깊이 → 같은 블록
else:
    print("음수 또는 0")

흔한 에러 3가지

1. IndentationError: expected an indented block

python
if x > 0:
print("양수")    # ❌ 들여쓰기 안 함

→ if 다음 줄엔 반드시 들여쓰기. 빈 블록은 pass:

python
if x > 0:
    pass        # ✅

2. IndentationError: unexpected indent

python
print("hello")
    print("world")   # ❌ 갑작스런 들여쓰기 (블록 시작 키워드 없음)

3. 탭과 스페이스 혼용 — 눈에 안 보이는 함정

python
def foo():
    print("a")    # 스페이스 4칸
	print("b")    # 탭 → 에디터마다 폭이 달라 보임 → 버그

PEP 8 표준: 스페이스 4칸. 에디터에서 Tab → 4 Space 자동 변환 설정.

for · while · range · enumerate · zip — *반복문 전체*

기본 for — 반복 가능한 객체 순회

python
for name in ['A', 'B', 'C']:
    print(name)

Java 의 for(int i=0; i<n; i++) 같은 인덱스 기반 for 가 없습니다. 인덱스는 range() 로 만듦.

range() — 숫자 시퀀스

python
range(5)         # 0, 1, 2, 3, 4
range(2, 8)      # 2, 3, 4, 5, 6, 7
range(0, 10, 2)  # 0, 2, 4, 6, 8 (step)
range(10, 0, -1) # 10, 9, ..., 1 (역순)

끝값 미포함. Java/JS 와 같음.

python
for i in range(5):
    print(i)     # 0, 1, 2, 3, 4

enumerate() — 인덱스 + 값 동시에

python
names = ['A', 'B', 'C']
for i, name in enumerate(names):
    print(i, name)
# 0 A
# 1 B
# 2 C

for i, name in enumerate(names, start=1):    # 1부터 시작
    print(f'{i}. {name}')

인덱스가 필요할 땐 enumerate. range(len(arr)) 는 비파이썬스러움.

zip() — 여러 시퀀스 동시 순회

python
names = ['A', 'B', 'C']
ages = [30, 25, 28]

for name, age in zip(names, ages):
    print(name, age)
# A 30
# B 25
# C 28

짧은 쪽 기준 으로 자동 멈춤. 두 컬렉션의 대응되는 원소 처리 패턴.

while 과 break · continue

python
n = 0
while n < 10:
    if n == 5:
        break          # 즉시 루프 종료
    if n % 2 == 0:
        n += 1
        continue       # 다음 반복으로
    print(n)
    n += 1

for-else — 별난 문법

python
for item in items:
    if item == target:
        print('찾음')
        break
else:
    print('못 찾음')    # *break 안 만나고 끝까지* 돌면 실행

loop 가 정상 종료되면 else 실행. 검색 패턴에 유용 — 다른 언어엔 없는 Python 만의 기능.

리스트 컴프리헨션 — *Python 의 정체성*

기본 형태

python
# 기존: for + append
squares = []
for x in range(10):
    squares.append(x ** 2)

# 컴프리헨션
squares = [x ** 2 for x in range(10)]

4줄 → 1줄. AI 가 생성하는 Python 코드의 반 이상 이 이 문법.

조건 필터 추가

python
even_squares = [x ** 2 for x in range(10) if x % 2 == 0]
# [0, 4, 16, 36, 64]

뒤에 if — 필터. JS 의 .filter().map() 한 줄로 합친 셈.

중첩 컴프리헨션

python
matrix = [[i * j for j in range(3)] for i in range(3)]
# [[0, 0, 0], [0, 1, 2], [0, 2, 4]]

for 가 여러 개 — 외부 for 가 바깥 루프.

딕트 컴프리헨션

python
squares = {x: x ** 2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

셋 컴프리헨션

python
unique_lengths = {len(name) for name in names}
# 중복 제거된 길이들

가독성의 한계

python
# ❌ 너무 복잡 — 일반 for 로 풀어쓰세요
result = [
    process(x, y)
    for x in items
    for y in others
    if x.active and y.active and check(x, y)
]

2단계 이상 + 복잡한 조건 이면 일반 for 가 더 읽기 쉬움. 컴프리헨션은 짧을 때만 강력.

🤖 AI 에게 이렇게 요청해보세요

  • "이 for 루프를 리스트 컴프리헨션으로 바꿔줘"
  • "이 enumerate + zip 조합을 한 번에 풀어줘"
  • "이 들여쓰기 에러를 고쳐줘" (코드 전체를 같이 보내면 즉시 해결)

🐍 실행해보기 — if · for · while · 컴프리헨션

제어 흐름 4가지를 한 화면에서 실험. 점수·조건을 바꿔가며 출력 변화를 확인하세요.
✏️ Python 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
🐍 Pyodide로 실제 Python 실행 — 첫 실행 시 로딩 3~5초 소요
먼저 읽으면 좋은 개념: 리스트 완전 정복
다음 추천: 함수 정의
제어 흐름 — if · for · while · 컴프리헨션 기초 - Python