python

Python - 제어문-반복문

cinnamonbrown 2026. 5. 27. 17:38

Python의 반복문은 특정 코드를 여러 번 실행하기 위해 사용하는 제어문이다.

대표적으로 for문과 while문이 있다.


1. while 문

  • 특정 조건이 참인 동안 코드 블록을 반복해서 실행하는 제어문이다
  • 조건이 True이면 반복을 계속하고, 조건이 False가 되는 순간 반복을 멈춘다
while 조건: # 조건 : 평가 결과 : 참/거짓이 될 수 있는 표현식
    # 조건이 참인 동안 실행될 코드

예시)


2. for 문

  • 시퀀스(리스트, 튜플, 문자열 등)의 각 항목에 대해 반복 작업을 수행하는 반복문이다
  • 주로 "정해진 범위 내에서 반복"할 때 사용된다
# 요소: 반복할 시퀀스의 각 항목이 for 문의 실행 도중에 할당되는 변수
for 요소 in 시퀀스:
    # 요소에 대한 작업 수행

문자열(str)에 대한 반복 작업

리스트(list)에 대한 반복 작업 ①

리스트(list)에 대한 반복 작업 ②

딕셔너리(dict)에 대한 반복 작업

dic1 = {'no':1, 'userid':'apple', 'name':'김사과', 'hp':'010-1111-1111'}

print('==키만 복사==')
for i in dic1:
    print(i, end=' ') # 키만 복사

print()

print("==키만 복사2==")
for i in dic1.keys():
    print(i, end=' ') # 키만 복사

print()

print("== 값만 복사 ==")
for i in dic1.values():
    print(i, end=' ') # 값만 복사

print()

print("== 인덱싱 ==")
for i in dic1:
    print(dic1[i], end=' ')

print()

print("== get()이용 ==")
for i in dic1:
    print(dic1.get(i), end=' ')

print()

print("== items() 이용 ==")
for i in dic1.items():
    print(i)

print("== items() 이용 ==")
for key, value in dic1.items():
    print(key, value)

실행 결과

==키만 복사==
no userid name hp 
==키만 복사2==
no userid name hp 
== 값만 복사 ==
1 apple 김사과 010-1111-1111 
== 인덱싱 ==
1 apple 김사과 010-1111-1111 
== get()이용 ==
1 apple 김사과 010-1111-1111 
== items() 이용 ==
('no', 1)
('userid', 'apple')
('name', '김사과')
('hp', '010-1111-1111')
== items() 이용 ==
no 1
userid apple
name 김사과
hp 010-1111-1111

3. range() 함수

range()연속된 정수의 범위를 만들어주는 내장 함수이다.

 

주로 for문과 함께 사용되며, 반복 횟수를 정하거나 일정한 숫자 범위를 순회할 때 많이 사용한다.

 

 

range([start], stop, [step])

range(0,10,1) # 객체가 만들어짐
  • start (option): 시작 값, 생략하면 기본값은 0
  • stop (필수): 끝 값, 단 stop 값은 포함되지 않는다
  • step (option): 증가 또는 감소 간격, 생략하면 기본값은 1

 

예를 들어 다음 코드는 0부터 9까지 반복한다.

for i in range(10):
  print(i)

 

👉 range(10)[0, 1, 2, ..., 9]라는 리스트를 실제로 전부 만들어두는 것이 아니다.

👉 range는 필요한 숫자를 그때그때 만들어내는 객체에 가깝다.

👉 그래서 큰 범위를 반복할 때도 리스트를 직접 만들어 사용하는 것보다 메모리를 더 효율적으로 사용할 수 있다.

 

 

아래 두 코드는 결과는 비슷해 보여도 메모리 사용 방식은 다르다.

 

👉 첫 번째 코드는 필요한 값을 순서대로 꺼내 쓰는 방식이고,

👉 두 번째 코드는 리스트 안에 값을 미리 전부 담아두고 반복하는 방식이다.


예시 – for문을 이용하여 1부터 100까지의 짝수의 총합 구하기


4. enumerate() 함수

  • 파이썬에서 반복문을 사용할 때 인덱스을 함께 가져오기 위해 사용되는 내장함수이다
  • 주로 for문과 함께 사용된다
  • (인덱스, 값)튜플을 반환하는 이터레이터(iterator)를 생성한다
enumerate(iterable, [start=0])

 

👉 iterable은 리스트, 튜플, 문자열처럼 반복할 수 있는 객체를 의미한다.

예시 1


예시 2 

 

👉 위의 경우처럼  시작 인덱스를 2로 지정해서 사용할 수도 있다.

 

다만 실제로는 대부분 기본값인 0을 사용하는 경우가 훨씬 많다.


5. 이터러블(Iterable)과 이터레이터(Iterator)

5.1 Iterable

Iterable은 반복할 수 있는 객체를 의미한다.

즉, for문에서 사용할 수 있는 객체라고 생각하면 된다.

 

for item in 객체:

 

리스트, 튜플, 문자열, 딕셔너리, 세트 등이 대표적인 이터러블 객체이다.

 

다만 “반복할 수 있다”는 말이 꼭 순서가 있다는 뜻은 아니다.

 

예를 들어 리스트나 문자열은 인덱스로 접근할 수 있지만,

세트는 반복은 가능해도 인덱스로 접근할 수는 없다.


5.2 Iterator

Iterable객체는 iter() 함수를 사용해서 이터레이터로 바꿀 수 있다.

 

또한 next()를 사용해서 값을 하나씩 꺼낼 수 있다.

 

 

👉 더 이상 꺼낼 값이 없을 때 next()를 호출하면 StopIteration 예외가 발생한다.

 

 

그런데 우리가 for문을 사용할 때는 이 예외를 직접 처리하지 않아도 된다.

for문 내부에서 값을 하나씩 꺼내고, 더 이상 값이 없으면 반복을 자연스럽게 종료해주면서 예외를 처리해주기 때문이다.

6. zip 함수

  • 여러 개의 반복 가능한(iterable) 객체를 병렬적으로 묶어주는 내장 함수이다.
  • 각 객체로부터 순서대로 하나의 요소씩 가져와 튜플로 묶어주는 이터레이터를 반환한다.
  • 주로 여러 개의 리스트나 튜플을 병렬적으로 처리하고자 할 때 사용된다.
zip(iterable1, iterable2, ...)

예시

 

👉 위 코드는 li1li2의 값을 같은 위치끼리 가져와 출력하는 코드이다.

 

실행 결과는 원하는 대로 나오지만, 이 방식은 좋은 코드라고 보기 어렵다.

 

가장 큰 이유는 range(0, 3)처럼 반복 횟수가 코드 안에 직접 적혀 있기 때문이다.

현재는 리스트의 길이가 3이기 때문에 문제가 없지만, 나중에 데이터의 개수가 바뀌면 코드를 직접 수정해야 한다.

예를 들어 li1이나 li2의 길이가 달라졌는데도 range(0, 3)을 그대로 두면, 일부 값이 출력되지 않거나 인덱스 오류가 발생할 수 있다.

 


그래서 다음처럼 len()을 사용하면 리스트의 길이에 맞춰 반복할 수 있다.

 

👉 이 방식은 앞의 코드보다는 낫다.

리스트의 길이를 직접 숫자로 적지 않아도 되기 때문이다.

하지만 이 코드도 완전히 좋은 방식이라고 보기는 어렵다.

왜냐하면 반복 횟수를 li1의 길이에만 의존하고 있기 때문이다.


이럴 때는 zip()을 사용하면 두 리스트의 값을 더 자연스럽게 묶어서 처리할 수 있다.

 


다만 zip()을 사용할 때 유의할 점이 있다.


zip()은 길이가 다른 객체를 묶을 경우, 가장 짧은 객체의 길이에 맞춰서 반복한다.

 

👉 li2에는 'melon'이 추가되어 있지만, li1에는 네 번째 값이 없기 때문에 'melon'은 출력되지 않는다.


7. continue

  • Python의 반복문(for나 while) 안에서 사용되며, 현재 반복을 즉시 건너뛰고 다음 반복으로 넘어가도록 하는 제어문이다
  • continue 아래에 있는 코드는 실행하지 않고, 반복문의 처음으로 돌아가 다음 조건을 검사하거나 다음 요소를 처리한다
  • 불필요한 코드 실행은 피하고, 조건에 따라 반복 흐름을 세밀하게 제어할 수 있다

예시

logs = [
    "INFO: 사용자 로그인 성공",
    "DEBUG: 세션 생성 중",
    "ERROR: 데이터베이스 연결 실패",
    "INFO: 요청 처리 완료",
    "ERROR: 파일 저장 실패",
    "DEBUG: 응답 전송"
]

error_logs = []

for log in logs:
    # 로그가 ERROR로 시작하지 않으면 건너뜀
    if not log.startswith("ERROR"):
        continue
    # ERROR 로그만 리스트에 추가
    error_logs.append(log)

print("오류 로그만 출력:")
for e in error_logs:
    print(e)

실행 결과

오류 로그만 출력:
ERROR: 데이터베이스 연결 실패
ERROR: 파일 저장 실패

8. break

  • Python의 반복문(for나 while) 안에서 사용되어, 반복을 즉시 종료시키는 제어문이다
  • break가 실행되면 반복문의 조건과 상관없이 해당 반복문을 완전히 빠져나온다


9. 중첩 반복문

  • Python에서 하나의 반복문 안에 다른 반복문이 포함된 구조를 의미한다
  • 외부 반복문의 각 반복마다 내부 반복문이 모두 실행되는 방식으로 작동한다
  • 다차원의 데이터를 처리하거나 복잡한 작업을 수행할 수 있다
for 외부_변수 in 외부_시퀀스:
    for 내부_변수 in 내부_시퀀스:
        # 내부 반복문 코드
    # 외부 반복문 코드

예시 1

# '🎃'를 이용하여 아래와 같은 도형을 만들어보자.
'''
🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃 🎃
'''

for i in range(5):
  for j in range(5):
    print('🎃',end=' ')
  print()  

실행 결과

🎃 🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃

예시 2

'''
🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃
🎃 🎃 🎃
🎃 🎃
🎃
'''

for i in range(5):
  for j in range(5-i):
    print('🎃',end=' ')
  print()

실행 결과

🎃 🎃 🎃 🎃 🎃
🎃 🎃 🎃 🎃
🎃 🎃 🎃
🎃 🎃
🎃

예시 3

‘’’
🎃 
🎃 🎃 
🎃 🎃 🎃 
🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃
‘’’
for i in range(1,6):
  for j in range(i):
    print('🎃',end=' ')
  print()

실행 결과

🎃 
🎃 🎃 
🎃 🎃 🎃 
🎃 🎃 🎃 🎃 
🎃 🎃 🎃 🎃 🎃

예시 4 – 2단부터 9단까지 구구단을 출력하는 프로그램 작성

for i in range(2,10):
  print(f'===={i}단====')
  for j in range(1,10):
    print(f'{i} x {j} = {i*j}')

실행 결과


10. 컴프리헨션(Comprehension)

 

컴프리헨션(Comprehension)은 파이썬에서 리스트, 세트, 딕셔너리 등의 컬렉션을 간단하게 생성하거나 변형하는 방법 중 하나이다.

 

컴프리헨션은 반복문과 조건문을 사용하여 간결하게 컬렉션을 생성하는 기법으로, 코드를 더 간단하고 가독성 좋게 작성할 수 있도록 도와준다.


10.1 리스트 컴프리헨션

기존 리스트의 각 요소를 반복하면서 조건을 적용하여 새로운 리스트를 생성할 수 있다.

예시 1


예시 2

 

👉 조건문이 뒤에 있고 for문이 앞에 있어서 일반적인 반복문과 순서가 다르다


예시 3– if else 조건부 표현식 이용

 

 

✔️ 조건부 표현식은 조건의 참(True)과 거짓(False)에 따라 값을 선택하는 한 줄짜리 조건문이다.

조건이 참인 경우 값 if 조건 else 조건이 거짓인 경우 값

 

리스트 컴프리헨션에서는 if -else를 사용할 경우 위치가 조금 다르다.

 

단순히 조건을 거는 경우에는 if가 뒤에 오지만,

조건에 따라 서로 다른 값을 넣어야 할 때는 if else 표현식이 앞에 온다.


예시 4 – 중첩 for 문

사실 중첩 for문의 경우라면 굳이 리스트 컴프리헨션을 쓰는 것은 그렇게 권장되지는 않는다.


10.2 세트 컴프리헨션

  • 새로운 세트를 생성하는데 사용된다.
  • 기존 세트의 각 요소를 반복하면서 조건을 적용하여 새로운 세트를 생성할 수 있다.

사실 컴프리헨션의 경우 리스트가 더 중요하고 세트와 이후의 딕셔너리의 경우는 그냥 이런게 있구나 하고 넘어가자


10.3 딕셔너리 컴프리헨션

  • 새로운 딕셔너리를 생성하는데 사용된다
  • 기존 딕셔너리의 각 요소를 반복하면서 조건을 적용하여 새로운 딕셔너리를 생성할 수 있다.