한양과학기술고등학교

에듀테크 프로젝트 대시보드

for 반복문

for range enumerate zip for-else

파이썬의 for 는 인덱스가 아니라 반복 가능한 객체(iterable)의 원소를 직접 돕니다.

1. 기본형

for ch in "abc":
    print(ch)

for n in [10, 20, 30]:
    print(n)

for k, v in {"a": 1, "b": 2}.items():
    print(k, v)

for i in range(5):        # 횟수 반복
    ...
for _ in range(3):        # 값을 안 쓸 때
    ...

2. enumerate / zip

for i, name in enumerate(names, start=1):
    print(f"{i}번: {name}")

for name, score in zip(names, scores):
    print(name, score)

# 딕셔너리 만들며 순회
result = {name: idx for idx, name in enumerate(names)}

3. break / continue

for n in range(100):
    if n == target:
        print("찾음")
        break            # 반복 완전 종료
    if n % 2:
        continue         # 다음 반복으로 건너뜀
    process(n)

# 중첩 루프 탈출은 함수로 빼거나 플래그 사용
for i in range(n):
    for j in range(m):
        if done(i, j):
            break
    else:
        continue         # 안쪽이 break 안 했으면 계속
    break                # 안쪽이 break 했으면 바깥도 탈출

4. for ... else

# else 는 break 없이 루프가 "끝까지" 돌았을 때 실행
for x in data:
    if x < 0:
        print("음수 발견")
        break
else:
    print("음수 없음")     # break 안 걸리면 여기

# 탐색 실패 처리에 유용
for p in range(2, n):
    if n % p == 0:
        break
else:
    print(f"{n}은 소수")

5. 순회 중 수정 금지

반복 대상을 순회하며 변경하지 말 것
  • 리스트에서 원소 삭제하며 순회 → 인덱스가 밀려 건너뜀
  • 해결: 사본을 순회(for x in lst[:]) 하거나 컴프리헨션으로 새 리스트 생성
  • dict 는 순회 중 크기 변경 시 RuntimeError
# 나쁨:  for x in nums: if bad(x): nums.remove(x)
nums = [x for x in nums if not bad(x)]   # 좋음

6. 유용한 순회 도구

import itertools as it

it.count(10)             # 10, 11, 12, ... (무한)
it.cycle("AB")           # A, B, A, B, ...
it.repeat(0, 3)          # 0, 0, 0
it.chain([1, 2], [3, 4]) # 1, 2, 3, 4
it.islice(gen, 5)        # 앞 5개만
list(it.product([0, 1], repeat=2))  # [(0,0),(0,1),(1,0),(1,1)]
"지금 하는 것이 아예 안 하는 것보다 낫다 — 다만 '지금 당장'보다는 낫지 않을 때가 많다"