개발

파이썬: 반복문(for, while)

Funital01 2026. 4. 9. 11:00
목록

1. 반복문

2. for

    2-1. range

    2-2. enumerate

    2-3. zip

3. 딕셔너리 반복

4. while

5. break와 continue

6. 내포용법

7. 추가내용: 출력 형식 제어

반복문

반복문은 동일한 작업을 반복해서 수행을 할 때 사용하기 좋은 구조입니다.

 

예를 들어, 여러 이름을 하나씩 출력한다고 해보겠습니다.

names=['홍길동','김하나','홍길순','박하나']

# 반복문 X
print(names[0])
print(names[1])
print(names[2])
print(names[3])

# 반복문 O
for name in names:
  print(name)

 

반복문을 사용하지 않는다면,

동일한 구조의 코드를 계속 작성해줘야 하니, 코드도 길어지고 비효율적이죠?

 

하지만 반복문을 사용하면  코드도 간결해지고, 반복되는 구조를 줄여 가독성이 좋아지며

 효율적으로 표현할 수 있습니다. 

 

반복문을 표현하는 대표적인 방법은 다음과 같습니다.

  • for
  • while

for

for문은 정해진 범위 혹은 리스트의 요소들을 순회하면 하나씩 처리를 할 때 사용합니다.

기본적인 구조는 다음과 같습니다.

for 변수 in 반복객체:
    실행구문

 

반복문의 반복객체에는 다양한 값들이 들어올 수 있습니다.

 

range

range는 연속된 숫자를 생성하고자 할때 사용하는 것이 좋습니다.

 

다음과 같은 형태로 입력이 가능한데요,

  • range(끝): "0"부터 "(끝-1)"까지
  • range(시작, 끝): "시작"부터 "(끝-1)"까지
  • range(시작, 끝, 간격): "시작"부터 "(끝-1)"까지 "간격"만큼 증가
for index in range(4): 
  print(index, end=' ')		# 출력값: 0 1 2 3 

for index in range(2,4):
  print(index, end=' ')		# 출력값: 2 3 

for index in range(1,10,2):
  print(index, end=' ')		# 출력값: 1 3 5 7 9
  
for index in range(10,1,-2):
  print(index, end=' ')		# 출력값: 10 8 6 4 2

 

이처럼 range()를 활용하면 단순 반복이나 규칙적인 숫자 생성을 쉽게 할 수 있을 것 같아요.

 

추가적으로,

range()는 리스트가 아니라 range 객체를 반환하는데요!

필요할 경우 list()로 변환해서 사용할 수 있습니다.

data_list=list(range(5))
print(data_list)	# 출력값: [0, 1, 2, 3, 4]

data_list2=list(range(10, 14))
print(data_list2)	# 출력값: [10, 11, 12, 13]

 

이런식으로 리스트를 만들면, 일일이 숫자를 하나씩 집어넣지 않아도 되서 좋은 방법인거 같아요😯

 

enumerate

enumerate()는 반복문에서 인덱스와 값을 튜플 형태로 같이 반환받고자 할때 사용하는 함수에요.

names=['hong', 'kim', 'lee', 'park']

for name in enumerate(names):
  print(name, end=' ')		# 출력값: (0, 'hong') (1, 'kim') (2, 'lee') (3, 'park') 

print()

for name in enumerate(names, start=10):   # 인덱스 시작값 지정
  print(name, end=' ')		# 출력값: (10, 'hong') (11, 'kim') (12, 'lee') (13, 'park') 

print()

for index, name in enumerate(names):    # 언패킹
  print(index, name, end = ' ')		# 출력값: 0 hong 1 kim 2 lee 3 park

 

인덱스의 시작값을 사용자가 따로 지정할 수도 있어요.

또한, enumerate의 반환값이 튜플이기 때문에, 변수 2개로 나누어서 받는 방식인 언패킹이 가능합니다🧐

 

zip

zip() 여러 개의 리스트를 동시에 순회할 때 사용하는 함수에요.

각 리스트의 요소들을 묶어 튜플 형태로 반환해줍니다.

kor_jumsus=[10, 40, 20]
names=['hong','lim','lee', 'test']

for data in zip(names, kor_jumsus):  
  print(data, type(data))	# 출력값: ('hong', 10) <class 'tuple'>
			        #       ('lim', 40) <class 'tuple'>
                                #       ('lee', 20) <class 'tuple'>
 

# 언패킹
for name, jumsu in zip(names, kor_jumsus):
  print(f"이름: {name}, 점수: {jumsu}")	# 출력값: 이름: hong, 점수: 10
                                        #       이름: lim, 점수: 40
                                        #       이름: lee, 점수: 20

 

만약, 두 리스트의 길이가 다르다고 한다면?
서로 짝을 지어서 묶을 수 있는 애들까지만 zip으로 묶어버립니다.
 
즉, 자료를 여러개 받아서 그 자료들을 zip으로 묶어버린다면 한번에 처리가 가능해서
훨씬 효율적으로 작업할 수 있겠죠?🤔

 

딕셔너리 반복

지금까지는 리스트나 튜플과 같은 순서형 자료구조를 반복문으로 순회하는 방법을 살펴보았는데요,

딕셔너리 또한 반복문을 사용할 수 있고, key-value 구조를 기반으로 순회가 되죠.

 

우선, 단순히 딕셔너리 값을 반복 객체에 집어넣고 실행해보면 각 키 값에 따른 value 값들이 출력이 됩니다.

patient_info = {
    "name": "김환자",
    "age": 65,
    "blood_type": "A+",
    "department": "내과"
}

# 방법 1
for key in patient_info :
  print(patient_info.get(key), end=' ')	# 출력값: 김환자 65 A+ 내과 

# 방법 2
for key in patient_info :
  print(patient_info[key], end=' ')	# 출력값: 김환자 65 A+ 내과

 

두 방식 모두 key를 이용해 value에 접근하는 방법이고,

get()은 안전한 접근 방식, []는 일반적인 접근 방식입니다.

 

 

딕셔너리 반복문에서는 key를 기준으로 순회하며, 상황에 따라 key, value, 또는 둘 다 선택해서 사용할 수 있는데요,

patient_info = {
    "name": "김환자",
    "age": 65, 
    "blood_type": "A+", 
    "department": "내과"  
}

# key
for key in patient_info.keys():
  print(f"key: {key}, value: {patient_info[key]}")

# ======= 출력값 ========
# key: name, value: 김환자
# key: age, value: 65
# key: blood_type, value: A+
# key: department, value: 내과

 

keys()를 사용하면 key만 따로 가져올 수 있고,

이를 활용해 value도 함께 출력할 수 있습니다.

 

참고로, for key in dict: for key in dict.keys()는 동작이 동일합니다!😮

 

# value
for value in patient_info.values():
  print(value, end=' ')	# 출력값: 김환자 65 A+ 내과

 

values()를 사용하면 value만 따로 순회할 수 있죠.

 

 

print(patient_info.items()) # 출력값: dict_items([('name', '김환자'), ('age', 65), ('blood_type', 'A+'), ('department', '내과')])

for value in patient_info.items():
  print(value)	
  
# ======출력값======
# ('name', '김환자')
# ('age', 65)
# ('blood_type', 'A+')
# ('department', '내과')



for key, value in patient_info.items(): # 언패킹
  print(f"key: {key}, value: {value}")

# ======출력값======
# key: name, value: 김환자
# key: age, value: 65
# key: blood_type, value: A+
# key: department, value: 내과

 

items() (key, value) 형태의 튜플을 반환하는 거였죠!?

 

 

따라서, 변수 두 개로 나누어 받는 언패킹 방식이 가장 많이 사용됩니다.

 

 

while

반복문에는 for문뿐만 아니라 while문도 있어요.

조건이 참인 동안에만 계속 반복하도록 하는 상황에 사용을 합니다.

 

기본적인 구조는 다음과 같아요.

while 조건:
	실행문

 

조건이 True이면 반복이 계속되고,

False가 되는 순간 반복이 종료됩니다.

 

 

예를 들어, 1부터 10까지 출력하는 코드를 비교해보면 다음과 같습니다.

# 1부터 10까지 반복해서 출력

# for문
for su in range(1,11):
  print(su, end=' ')	# 출력값: 1 2 3 4 5 6 7 8 9 10 

# while문
i=1
while i<11:
  print(i, end=' ')		# 출력값: 1 2 3 4 5 6 7 8 9 10 
  i+=1

 

for문은 반복 횟수가 정해져 있을 때 간단하게 사용할 수 있고,

while문은 조건에 따라 반복 여부가 결정될 때 유용하다는 것을 느낄 수 있습니다.

 

while문의 조건식은 True 또는 False를 반환하는 형태여야 해요.

 

조건이 계속 True인 경우에는 반복이 멈추지 않을 수 있습니다.

while True:
    print("True")

 

이렇게 False를 반환하는 조건이 없다면 무한 루프가 발생해

계속해서 출력이 됩니다.

 

그래서 조건이 False가 되도록 하는,

반드시 값을 변경해주는 코드를 포함을 시켜줘야해요.

 

break와 continue

반복문을 작성하다 보면, 특정 조건에서 강제로 반복을 종료하거나, 특정 조건에서 건너뛰어야 하는 상황이 있을 수도 있어요.

그때 사용하는 것이 바로 break와 continue입니다.

 

break는 반복문을 즉시 종료해주는 기능을 해요.

# 1,2,3,4,5

for count in range(1,10):
  if count==6:
    break
  print(count, end=' ')	# 출력값: 1 2 3 4 5 

i=0
while True:
  i+=1
  if i > 5:
    break
  print(i, end=' ')	# 출력값: 1 2 3 4 5

 

다음과 같이 숫자를 출력하다가 5까지만 출력을 하고 싶을때,

6이 되면 반복을 멈추거나, 5보다 크면 반복을 멈추도록 할 수 있습니다.

 

예시에서도 보다시피, 특정 조건이 만족되면 반복을 완전히 종료하고, 가장 가까운 반복문 하나만 종료됩니다.

 

하지만, continue는 가장 가까운 반복문의 실행을 중단이 아니라 건너뛰고 다음 반복으로 넘어가는 역할을 해요.

for count in range(1,11):
  if count%3==0:
    continue
  print(count, end=' ')	# 출력값: 1 2 4 5 7 8 10

 

출력값을 보면, 3의 배수일 경우에 반복문을 멈추는 것이 아니라 그 다음 루프로 바로 건너뛰어서 3의 배수만 제외되고 출력되는 것을 확인할 수 있었습니다.

 

즉,

break는 반복을 빠르게 종료할 수 있어 불필요한 반복을 줄이는 데 유용하고,

continue는 특정 조건을 제외하고 싶을 때 코드를 더 간결하게 만들어줍니다.🙂

 

내포용법

내포용법은 for문과 if문을 한 줄로 표현하여

간단하게 리스트를 생성하는 방법입니다.

 

반복문을 더 짧고 직관적으로 작성할 수 있어서, 파이썬에서 자주 사용되는 문법입니다.

 

ages=[10, 24, 20, 23, 40, 42, 20, 25]

# 10년 후
after10_ages=[age+10 for age in ages]
print(after10_ages)	# [20, 34, 30, 33, 50, 52, 30, 35]

 

앞서 살펴봤던 for문의 경우, for문을 한 줄로 작성하여 새로운 리스트를 생성한 것을 확인할 수 있었습니다.

 

 

이때, 조건문을 붙여서도 표현할 수가 있는데요,

조건문은 위치에 따라 출력에 영향을 미칠 수 있습니다.

kor_jumsus=[100, 90, 85, 45, 80]

kor_result=['합격' for kor in kor_jumsus if kor>=60]  # ['합격', '합격', '합격', '합격']
print(kor_result)

kor_result=['합격' if kor>=60 else '불합격' for kor in kor_jumsus ]
print(kor_result)	# 출력값: ['합격', '합격', '합격', '불합격', '합격']

 

만약 if문을 for문에 이어서 작성을 할 경우, 해당 조건을 만족하는 자료들만 출력을 할 수가 있습니다.

이때는 elif 혹은 else절을 사용할 수 없어요.

 

삼항연산자를 for문 앞에 작성을 할 수도 있는데요,

이 경우에는 해당 조건을 만족한 값도 출력이 되고 조건을 만족하지 못한 값에 대한 출력값도 지정을 해줄 수 있습니다.

 

즉,

앞쪽 if는 조건에 따른 결과 생성이고,

뒤쪽 if는 필터링으로 이해하시면 좋을 것 같아요🙂

 

이렇게 반복문과 조건문을 사용해 리스트를 한 줄에 작성하는 문법을 리스트 컴프리헨션이라고 합니다.

 

추가 내용: 출력 형식 제어

반복문에서 print()를 사용하면 기본적으로 출력 후에 줄바꿈(\n)이 자동으로 적용됩니다.

그래서 각 요소가 한 줄씩 세로로 출력됩니다.

 

하지만 print() end 옵션을 사용하면

출력 형식을 사용자가 원하는 방식으로 변경할 수 있습니다.

for item in ['a1','a2','a3','a4']:	# 기본
  print(item)

for jumsu in [100, 90, 50, 60]:
  print(jumsu, end=' ')		# 출력값: 100 90 50 60 (공백)

print()

for jumsu in [100, 90, 50, 60]:
  print(jumsu, end='\t')	# 출력값: 100	90	50	60 (탭)

print()

for jumsu in [100, 90, 50, 60]:
  print(jumsu, end=',')		# 출력값: 100,90,50,60, (콤마)

 

이렇게 원하는 방식대로 출력해봐도 좋을 것 같아요.

 

저는 기본적인 세로 출력보다 가로로 이어서 출력하는 방식이 더 보기 편해서,

주로 end=' '를 사용하고 있습니다 🙂


'개발' 카테고리의 다른 글

파이썬: 람다함수(Lambda Functions)  (1) 2026.04.09
파이썬: 함수 선언하기  (0) 2026.04.09
파이썬: 조건문(if)  (0) 2026.04.06
파이썬: 집합(Set)  (0) 2026.04.06
파이썬: 딕셔너리(Dictionary)  (0) 2026.04.06