Python의 반복문은 동일한 작업을 여러 번 수행할 때 사용하는 제어 구조로, 주로 for문과 while문이 있다. for문은 시퀀스(리스트, 튜플, 문자열 등)의 각 요소를 순회하거나 정해진 횟수만큼 반복할 때 사용하며, while문은 특정 조건이 참인 동안 계속해서 반복 실행한다. Python의 for문은 다른 언어와 달리 iterator 기반으로 작동하여 매우 직관적이고 강력하며, range(), enumerate(), zip() 등의 내장 함수와 함께 사용하면 더욱 효율적인 반복 처리가 가능하다. 반복문 내에서는 break로 완전히 탈출하거나 continue로 현재 반복을 건너뛸 수 있으며, 리스트 컴프리헨션을 통해 더 간결하고 빠른 반복 처리도 할 수 있다.
for문: 리스트, 문자열, range() 순회
for문은 Python에서 가장 많이 사용되는 반복문으로, 리스트나 튜플 같은 시퀀스의 각 요소를 차례대로 순회합니다. 문자열의 각 문자를 하나씩 처리하거나, range() 함수를 사용해 정해진 횟수만큼 반복할 수 있다. 다른 언어의 for문과 달리 인덱스 기반이 아닌 iterator 기반으로 작동하여 매우 직관적이고 읽기 쉬운 코드를 작성할 수 있다.
# 리스트 순회
items = ["사과", "바나나", "체리"]
for item in items:
print(item)
# 문자열 순회
for char in "Python":
print(char)
# range() 순회
for i in range(3):
print(f"{i}번째 반복")
while문: 조건 기반 반복, 무한 루프 제어
while문은 주어진 조건이 참(True)인 동안 계속해서 반복을 수행하는 구문이다. 반복 횟수가 미리 정해지지 않은 상황이나 특정 조건을 만족할 때까지 계속 실행해야 하는 경우에 유용하다. 무한 루프를 만들 때는 while True:를 사용하되, 반드시 적절한 탈출 조건(break)을 포함해야 프로그램이 멈추지 않습니다. 루프 내에서 조건을 변화시키는 코드를 포함하지 않으면 무한 루프에 빠질 수 있으므로 주의가 필요하다.
# 조건 기반 반복
count = 3
while count > 0:
print(f"카운트다운: {count}")
count -= 1
# 무한 루프 제어
while True:
answer = input("종료하려면 'exit'을 입력하세요: ")
if answer == 'exit':
break
고급 기법: enumerate(), zip(), 딕셔너리 순회
enumerate() 함수는 시퀀스를 순회하면서 인덱스와 값을 동시에 얻을 수 있게 해주어, 순서가 중요한 반복 작업에서 매우 유용하다. zip() 함수는 여러 개의 시퀀스를 동시에 순회할 수 있게 해주어, 관련된 데이터들을 한 번에 처리할 때 효과적이다. 딕셔너리는 keys(), values(), items() 메서드를 통해 키만, 값만, 또는 키-값 쌍을 순회할 수 있어 데이터 처리 작업에서 매우 강력한 도구가 된다.
# enumerate()
fruits = ["사과", "바나나"]
for index, fruit in enumerate(fruits):
print(f"인덱스 {index}: {fruit}")
# zip()
names = ["홍길동", "이순신"]
ages = [30, 45]
for name, age in zip(names, ages):
print(f"{name}의 나이는 {age}세입니다.")
# 딕셔너리 순회
user = {"name": "김철수", "job": "개발자"}
for key, value in user.items():
print(f"{key}: {value}")
제어문: break, continue로 흐름 제어
break문은 현재 실행 중인 루프를 완전히 종료하고 루프 밖으로 빠져나가는 데 사용되며, 특정 조건을 만족했을 때 반복을 중단하고 싶을 때 유용합니다. continue문은 현재 반복만 건너뛰고 다음 반복으로 바로 이동하게 해주어, 특정 조건에서만 처리를 생략하고 싶을 때 사용한다. 이 두 제어문을 적절히 사용하면 복잡한 조건문 없이도 깔끔하고 효율적인 반복 로직을 구현할 수 있다.
for i in range(1, 10):
if i % 3 == 0:
continue # 3의 배수는 건너뛰기
if i == 7:
break # 7을 만나면 루프 중단
print(i)
컴프리헨션: 리스트, 딕셔너리, 집합 컴프리헨션
컴프리헨션은 기존의 시퀀스로부터 새로운 자료구조를 생성하는 간결하고 효율적인 방법이다. 리스트 컴프리헨션 [expression for item in iterable if condition]은 일반적인 for문보다 빠르고 읽기 쉬운 코드를 만들어준다. 딕셔너리 컴프리헨션과 집합 컴프리헨션도 같은 방식으로 작동하며, 조건부 처리와 변환을 한 줄로 표현할 수 있어 매우 강력한 기능이다. 단, 복잡한 로직이 들어가면 오히려 가독성이 떨어질 수 있으므로 적절한 상황에서 사용해야 한다.
# 리스트 컴프리헨션 (0~9의 제곱 리스트)
squares = [x**2 for x in range(10)]
print(squares)
# 딕셔너리 컴프리헨션
names = ["철수", "영희"]
ages = [20, 22]
user_dict = {name: age for name, age in zip(names, ages)}
print(user_dict)
# 집합 컴프리헨션 (중복 제거된 제곱)
numbers = [1, 2, 2, 3, 3, 3]
unique_squares = {x**2 for x in numbers}
print(unique_squares)
제너레이터: 메모리 효율적인 반복 처리
제너레이터 표현식은 리스트 컴프리헨션과 비슷한 문법을 사용하지만 () 괄호를 사용하여 모든 값을 메모리에 저장하지 않고 필요할 때마다 하나씩 생성한다. 이는 대용량 데이터를 처리할 때 메모리 사용량을 크게 줄일 수 있어 매우 유용합니다. 특히 파일 처리나 대량의 데이터 스트림을 다룰 때 제너레이터를 사용하면 메모리 효율성을 크게 향상시킬 수 있다.
# 제너레이터 표현식 (괄호() 사용)
# 모든 값을 메모리에 저장하지 않고 필요할 때마다 생성
large_data_generator = (x for x in range(1_000_000))
# 필요한 만큼만 값을 순회하여 사용
for i in large_data_generator:
if i == 5:
break # 5까지만 처리하고 중단
print(i)
로그 분석에서는 반복문을 사용해 각 로그 엔트리를 검사하고 오류나 경고 메시지를 분류하여 통계를 생성한다. 데이터 그룹화는 관련된 데이터들을 특정 키를 기준으로 묶어서 집계하거나 분석하는 작업으로, 딕셔너리와 반복문의 조합으로 효과적으로 처리할 수 있다. 패턴 찾기는 데이터에서 특정한 규칙이나 연속성을 발견하는 작업으로, 조건문과 반복문을 조합하여 복잡한 패턴도 탐지할 수 있다. 이러한 실무 예제들은 데이터 분석, 시스템 모니터링, 비즈니스 인텔리전스 등 다양한 분야에서 직접 활용할 수 있다.