이번에는 python 반복문에 대하여 알아보겠습니다!

파이썬에서 코드의 흐름을 제어하는 아주 중요한 문법 중 하나인 반복문(for문)에 대해 자세히 알아보겠습니다.
for문은 반복 횟수가 명확하게 정해져 있을 때 사용하는 제어문입니다.
단순히 숫자를 세는 것을 넘어, 파이썬의 강력한 자료구조(리스트, 딕셔너리 등)와 결합하여 데이터를 효율적으로 처리하는 데 핵심적인 역할을 합니다.
1. for문의 기본 문법과 작동 원리
for문은 컬렉션(리스트, 문자열 등)이나 제너레이터에서 데이터를 하나씩 꺼내어 변수에 담고, 데이터가 떨어질 때까지 정해진 코드를 반복 수행합니다.
# 기본 문법
# for 개별데이터 in 컬렉션계열(리스트, 튜플, 문자열 등):
# 수행할 코드
문자열과 리스트 순회 예시
# 문자열 순회: 문자가 하나씩 추출됩니다.
for ch in 'abc_z':
# ord() 함수는 문자의 ASCII 코드값을 반환합니다. (빈도 계산 등에 활용)
print(ch, ord(ch))
# 출력:
# a 97
# b 98
# c 99
# _ 95
# z 122
# 리스트 순회: 처음부터 끝까지 정방향으로 추출됩니다.
datas = [1, 2, 3, 4, 5]
for data in datas:
print(data)
# 출력: 1, 2, 3, 4, 5 (각 줄에 하나씩 출력)
# 💡 추가 지식: 리스트를 역순으로 순회하고 싶다면?
# reversed() 함수나 슬라이싱([::-1])을 사용하면 쉽게 거꾸로 출력할 수 있습니다.
for data in reversed(datas):
print(data)
# 출력: 5, 4, 3, 2, 1
2. 다양한 자료구조와의 결합 (언패킹 활용)
실무에서는 리스트 안에 튜플이나 딕셔너리가 들어있는 복잡한 구조를 자주 다룹니다.
이때 파이썬의 분해(Unpacking) 기능을 for문과 함께 사용하면 코드가 매우 직관적으로 변합니다.
리스트 + 튜플 구조
데이터베이스에서 조회한 결과가 통상적으로 이런 형태를 띱니다.
# (온도, 습도) 쌍으로 이루어진 센서 데이터
sensor_infos = [(29, 39), (28, 40), (25, 35)]
# ❌ 비효율적인 방식 (인덱스 번호로 접근)
for sensor_info in sensor_infos:
print(f'온도 {sensor_info[0]}, 습도 {sensor_info[1]}')
# ✅ 파이썬다운 방식 (for문에서 바로 언패킹)
for 온도, 습도 in sensor_infos:
print(f'온도 {온도}, 습도 {습도}')
# 출력:
# 온도 29, 습도 39
# 온도 28, 습도 40
# 온도 25, 습도 35
# 💡 특정 값만 필요할 때는 언더스코어(_)로 필요 없는 값을 무시합니다.
for _, 습도 in sensor_infos:
print(f'습도 {습도}')
# 출력: 습도 39, 습도 40, 습도 35
딕셔너리 구조
딕셔너리를 for문으로 순회할 때 기본적으로는 '키(Key)'만 추출됩니다.
키와 값을 모두 사용하려면 items() 메서드를 사용해야 합니다.
subways = {'name': '영등포역', 'age': 100}
# 키와 값을 한 번에 추출
for key, value in subways.items():
print(key, value)
# 출력:
# name 영등포역
# age 100
실무에서 가장 많이 쓰이는 리스트 + 딕셔너리 구조
리스트 안에 딕셔너리가 겹겹이 쌓인 구조에서도 변수 분해를 영리하게 활용할 수 있습니다.
airflow_dags = [
{"name": "로그 전처리", "sch": "1일 1회", "tags": ["#sensor", "#온도"]},
{"name": "환율 크롤링", "sch": "1분", "tags": ["#금융", "#환율"]}
]
# values()를 활용하여 딕셔너리의 값들만 순서대로 추출 및 분해
for dag in airflow_dags:
# (_, tag, _) 처럼 태그 리스트 내부의 두 번째 요소만 콕 집어낼 수도 있습니다.
name, sch, (_, tag) = dag.values()
print(f'작업: {name:>10}, 스케줄: {sch:>10}, 태그: {tag}')
# 출력:
# 작업: 로그 전처리, 스케줄: 1일 1회, 태그: #온도
# 작업: 환율 크롤링, 스케줄: 1분, 태그: #환율
3. 인덱스가 필요할 땐 enumerate()
반복문을 돌리면서 데이터뿐만 아니라 '몇 번째 순서인지(인덱스)' 알아야 할 때가 있습니다.
이때는 내장 함수인 enumerate()를 사용합니다.
# (인덱스, (키, 값)) 형태로 2중 분해가 일어납니다.
for i, (key, value) in enumerate(subways.items()):
print(i, key, value)
# 출력:
# 0 name 영등포역
# 1 age 100
4. 수치를 생성하는 마법사 range()
지정된 범위의 숫자를 순차적으로 만들어내는 내장 함수입니다.
- 기본 문법: range(시작값, 끝값, 간격) (끝값은 포함되지 않습니다)
- 특징 (제너레이터): range()는 천만 개의 숫자를 요구한다고 해서 미리 천만 개를 메모리에 만들어 두지 않습니다. 반복문이 돌아갈 때마다 필요한 순간에 하나씩 수치를 생성하여 공급합니다. 덕분에 메모리 효율이 극도로 좋습니다!
# 1부터 9까지 2칸씩 띄어서 생성
for n in range(1, 10, 2):
print(n)
# 출력: 1, 3, 5, 7, 9
5. 흐름의 제어: 조건문 필터링과 중첩 for문
반복문 + 조건문 (필터링)
for문 내부에서 if문을 결합하여 원하는 조건의 데이터만 골라낼 수 있습니다.
for n in range(5):
# n이 짝수일 때만 출력 (2로 나눈 나머지가 0이 아닌 것의 반대 -> 짝수)
if not n % 2:
print(n)
# 출력: 0, 2, 4
중첩 반복문 (이중 for문)과 continue 최적화
for문 안에 for문을 넣어 격자형(Grid) 로직을 처리할 수 있습니다. 딥러닝 이미지 처리나 2D 게임 개발에서 픽셀 단위로 스캔할 때 자주 쓰입니다.
- 요구사항: 3~6단 구구단 출력 중, 5단을 제외하고 같은 수의 곱(예: 3x3)도 제외합니다. 이때 continue를 활용하면 불필요한 들여 쓰기(depth)를 줄여 코드를 깔끔하게 만들 수 있습니다.
for i in range(3, 7):
# 5단이면 아래 코드를 무시하고 다음 단으로 점프 (들여쓰기 방지)
if i == 5:
continue
for j in range(1, 10):
# 곱하는 수가 같으면 무시하고 점프
if i == j:
continue
print(f'{i} x {j} = {i*j:>2}')
# 출력 (요약):
# 3 x 1 = 3
# 3 x 2 = 6
# 3 x 4 = 12 ... (3x3, 5단 전체 등은 생략됨)
6. 결과를 향한 지름길: 리스트 컴프리헨션 (내포)
파이썬의 꽃이라고 불리는 리스트 컴프리헨션(List Comprehension)입니다. 여러 줄의 반복문과 데이터 추가(.append()) 과정을 단 한 줄의 직관적인 코드로 압축해 줍니다.
- 장점: 코드가 간결해질 뿐만 아니라, 파이썬 내부적으로 C언어 수준에서 최적화되어 실행되기 때문에 일반 for문보다 처리 속도가 훨씬 빠릅니다.
# 기존 방식
# results = list()
# for i in range(3, 7):
# for j in range(1, 10):
# results.append(f'{i} x {j} = {i*j:>2}')
# 🚀 컴프리헨션 적용: [최종형태 for문1 for문2 ...]
results = [f'{i} x {j} = {i*j:>2}' for i in range(3, 7) for j in range(1, 10)]
print(len(results), results[0])
# 출력: 36, '3 x 1 = 3'
오늘의 한 마디
생각나는 것이 있다면 하겠습니다. ㅎ
'코딩 개발 > Python' 카테고리의 다른 글
| Python - 절차적 프로그래밍1 (숫자 맞추기 만들기 step1 ~ step3) (0) | 2026.07.15 |
|---|---|
| Python - 반복문(break, continue, else, while) (0) | 2026.07.14 |
| Python - 흐름제어, 조건식 (0) | 2026.07.12 |
| Python - 튜플 Tuple (생성, 인덱싱, 슬라이싱, 분해) (0) | 2026.07.11 |
| Python - 딕셔너리 Dictionary (데이터 추가 및 수정, 인덱싱, get(), keys(), values(), items(), del, clear()) (0) | 2026.07.10 |