파이썬 반복문(for, while) 기초 (5)
반복문이란?
안녕하세요. 이번에는 파이썬 반복문에 대해 알아보겠습니다. 프로그래밍에서 반복문은 매우 중요한 개념 중 하나입니다. 어떤 작업을 특정 횟수만큼 반복해야 할 때 반복문을 사용하는데요. 파이썬에서는 크게 for 문과 while 문 두 가지 반복문이 있습니다.
프로그래밍에서 반복문이 왜 필요할까요? 예를 들어 1부터 10까지의 수를 차례로 출력해야 한다고 가정해 봅시다. 이를 반복문 없이 일일이 출력하려면 아래와 같이 10줄의 코드가 필요합니다.
print(1)
print(2)
print(3)
...
print(10)
하지만 반복문을 사용하면 훨씬 간단하게 해결할 수 있습니다.
for i in range(1, 11):
print(i)
이처럼 반복문을 사용하면 코드를 짧고 간결하게 작성할 수 있습니다. 반복적인 작업을 자동화할 수 있어 시간과 노력도 줄일 수 있죠.
그렇다면 구체적으로 파이썬의 for문과 while문에 대해 알아볼까요?
for 문
for 문은 시퀀스 자료형(문자열, 리스트, 튜플 등)의 요소들을 순차적으로 반복하여 작업을 수행합니다. 기본 문법은 다음과 같습니다.
for 요소 in 시퀀스자료형:
반복 실행할 코드
간단한 예를 들어보겠습니다.
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(f"I like {fruit}!")
# 출력 결과
# I like apple!
# I like banana!
# I like cherry!
위 코드에서 리스트 fruits의 요소들을 하나씩 fruit 변수에 순차적으로 대입하면서 반복합니다. 그래서 "apple", "banana", "cherry" 각각에 대해 print(f"I like {fruit}!")가 실행되는 것입니다.
range() 함수와 함께 for문을 사용하면 특정 횟수만큼 반복할 수도 있습니다.
for i in range(5):
print(i)
# 출력 결과
# 0
# 1
# 2
# 3
# 4
range(5)는 0부터 4까지의 숫자 시퀀스를 생성합니다. 그래서 0, 1, 2, 3, 4가 차례로 출력되는 것입니다. 반복 횟수를 제어하기 위해서는 이렇게 range()를 활용하면 됩니다.
또한 다음과 같이 시작값과 끝값, 증가값을 지정할 수도 있습니다.
for i in range(1, 11, 2): # 시작=1, 끝=11, 증가=2
print(i)
# 출력 결과
# 1
# 3
# 5
# 7
# 9
이렇듯 for 문은 다양한 방식으로 반복 작업을 수행할 때 사용됩니다. 시퀀스 자료형의 요소를 하나씩 차례로 반복하거나, range() 함수로 특정 횟수만큼 반복할 수 있습니다.
while 문
while 문은 특정 조건이 만족하는 동안 계속해서 반복 작업을 수행합니다. while 문의 기본 구조는 다음과 같습니다.
while 조건문:
반복 실행할 코드
while 문의 조건문이 True인 동안 반복 실행할 코드가 계속해서 실행됩니다. 반면 조건문이 False가 되면 반복이 종료됩니다.
간단한 예를 하나 들어보겠습니다.
num = 0
while num < 5:
print(num)
num += 1 # num = num + 1
# 출력 결과
# 0
# 1
# 2
# 3
# 4
위 코드에서 num이 0부터 시작해서 5 미만일 때까지만 반복이 이루어집니다. num += 1에 의해 num값이 1씩 증가하다가 5가 되면 조건문이 False가 되어 반복이 멈춥니다.
while 문은 무한 루프(Infinite Loop)에 빠질 위험이 있으므로 주의해야 합니다. 무한 루프란 조건문이 영원히 True가 되어 반복이 끝나지 않는 상황을 말합니다.
x = 1
while x > 0: # 이 조건은 항상 True이므로 무한 루프에 빠짐
print(x)
위 코드는 x가 0보다 큰 조건이 영원히 충족되므로 무한히 반복됩니다. 이럴 경우 코드를 강제 종료해야 합니다.
따라서 while 문에는 반드시 반복을 끝낼 수 있는 조건이 있어야 합니다. 보통 반복 작업 중에 조건식의 값을 바꾸어 언젠가는 False가 되도록 합니다.
이렇게 for 문과 while 문은 용도에 맞게 적절히 활용해야 합니다. for 문은 순차 자료형을 반복할 때, while 문은 특정 조건에 따라 반복할 때 주로 사용됩니다. 특히 while 문 사용 시에는 무한 루프에 주의해야 합니다.
반복문의 중첩과 제어
그렇다면 반복문 안에 또 다른 반복문을 넣을 수 있을까요? 네, 당연히 가능합니다. 이를 반복문의 중첩이라고 합니다.
for i in range(3):
for j in range(2):
print(f"바깥 Loop: {i}, 안쪽 Loop: {j}")
# 출력 결과
# 바깥 Loop: 0, 안쪽 Loop: 0
# 바깥 Loop: 0, 안쪽 Loop: 1
# 바깥 Loop: 1, 안쪽 Loop: 0
# 바깥 Loop: 1, 안쪽 Loop: 1
# 바깥 Loop: 2, 안쪽 Loop: 0
# 바깥 Loop: 2, 안쪽 Loop: 1
위 예시에서 바깥쪽 반복문이 한 번 실행될 때마다 안쪽 반복문이 전부 실행됩니다. 즉, 바깥 Loop가 0일 때 안쪽 Loop는 0과 1을 반복하고, 바깥 Loop가 1일 때에도 안쪽 Loop는 0과 1을 반복합니다.
이렇게 중첩 반복문을 사용하면 2차원 형태의 반복 작업을 수행할 수 있습니다. 행렬 계산이나 다중 Loop가 필요한 알고리즘에서 유용하게 활용됩니다.
한편 반복문에서는 반복을 제어할 수 있는 두 가지 문법이 있습니다.
- break 문: 반복문을 종료합니다.
- continue 문: 현재 반복을 중지하고 다음 반복으로 넘어갑니다.
예를 들어보겠습니다.
nums = [3, 1, 4, 1, 5, 9]
for num in nums:
if num > 5:
print(f"{num}를 찾았습니다. Loop를 종료합니다.")
break
print(num)
# 출력 결과
# 3
# 1
# 4
# 1
# 5
# 9를 찾았습니다. Loop를 종료합니다.
위 코드에서 num값이 5보다 크면 break문에 의해 반복문이 종료됩니다. 따라서 9를 찾자마자 Loop가 끝나게 되죠.
for num in nums:
if num == 1:
continue # 1을 만나면 이번 반복은 넘어감
print(num)
# 출력 결과
# 3
# 4
# 5
# 9
반면 이번에는 continue 문을 사용했습니다. num이 1일 때 continue에 의해 이번 반복은 넘어가고 다음 반복으로 진행합니다. 그래서 1은 출력되지 않습니다.
이렇게 반복문을 제어하는 break와 continue 문은 특정 조건에 따라 반복 작업을 건너뛰거나 중단할 때 활용됩니다.
반복문의 실전 활용
앞서 배운 반복문 개념들을 실전에서 어떻게 활용할 수 있을까요? 다음 예시들을 통해 알아보겠습니다.
예시 1) 리스트 내부 요소의 총합 구하기
scores = [85, 92, 78, 88, 64]
total = 0
for score in scores:
total += score # 리스트의 값들을 하나씩 더함
print(f"총점은 {total}점 입니다.")
# 출력 결과
# 총점은 407점 입니다.
위 코드는 리스트 scores에 있는 값들의 총합을 계산합니다. for 문을 통해 scores 리스트의 요소들을 하나씩 꺼내서 total 변수에 더해나갑니다.
예시 2) 문자열 내 문자 개수 세기
text = "Hello, World!"
char_count = {}
for char in text:
if char != " ": # 공백 문자는 건너뜀
if char in char_count:
char_count[char] += 1
else:
char_count[char] = 1
print(char_count)
# 출력 결과
# {'H': 1, 'e': 1, 'l': 3, 'o': 2, ',': 1, 'W': 1, 'r': 1, 'd': 1, '!': 1}
이 코드는 문자열 text에 있는 각 문자가 몇 번씩 등장했는지 세는 프로그램입니다. 공백을 제외한 각 문자가 키가 되고, 그 값은 등장 횟수가 됩니다.
for char in text:를 통해 text의 문자들을 하나씩 반복합니다. 그리고 char_count 딕셔너리에 문자를 키로 하고 값은 1로 초기화한 후, 이미 딕셔너리에 키가 있다면 값을 1 증가시킵니다.
예시 3) 2차원 리스트 출력하기
students = [
["철수", 85, 92, 78],
["영희", 75, 82, 88],
["민수", 92, 86, 73],
["나영", 89, 75, 64]
]
for student in students:
total = 0
for score in student[1:]: # 인덱스 1부터 끝까지(성적 데이터만)
total += score
avg = total / 3
print(f"{student[0]}의 평균 점수는 {avg:.2f}입니다.")
# 출력 결과
# 철수의 평균 점수는 85.00입니다.
# 영희의 평균 점수는 81.67입니다.
# 민수의 평균 점수는 83.67입니다.
# 나영의 평균 점수는 76.00입니다.
마지막 예시는 중첩 반복문을 사용했습니다. 2차원 리스트 students에는 이름과 세 과목 점수가 리스트 형태로 저장되어 있습니다.
바깥쪽 반복문 for student in students:에서 학생 한 명씩 꺼냅니다. 그리고 안쪽 반복문 for score in student[1:]에서 이름을 제외한 성적 데이터만 꺼내어 total에 더합니다. 마지막으로 total을 과목 수로 나눕니다.
반복문 효율적 활용을 위한 팁
지금까지 반복문의 기본 개념과 다양한 활용 예시를 살펴보았습니다. 반복문을 코딩할 때 고려해야 할 몇 가지 팁을 추가로 알아보겠습니다.
1. 적절한 반복문 선택하기
먼저 주어진 상황에 맞게 for문과 while문 중 적절한 반복문을 선택하는 것이 중요합니다.
- 순차 자료형의 반복에는 for문이 적합합니다.
- 특정 조건에 따른 반복에는 while문이 적합합니다.
예를 들어 리스트에 있는 요소를 모두 출력하는 경우에는 for문이 간결하지만, 사용자가 특정 입력을 할 때까지 반복해야 한다면 while문이 나을 것입니다.
2. 중첩 반복문에 주의하기
중첩 반복문은 2차원 형태의 반복이 필요할 때 유용하지만, 반복 횟수가 기하급수적으로 많아질 수 있으므로 주의해야 합니다.
예를 들어 다음과 같은 중첩 반복이 있다고 가정해봅시다.
for i in range(100):
for j in range(100):
# 코드
이 경우 안쪽 반복문은 100번, 바깥쪽 반복문은 100번으로 총 10,000번의 반복이 일어납니다.
따라서 반복 효율성을 위해 꼭 필요한 경우가 아니라면 중첩 반복문은 피하는 것이 좋습니다. 상황에 맞게 한 번에 순회할 방법은 없는지 고민해보아야 합니다.
3. 조건문과 break 활용하기
불필요한 반복을 줄이고 싶다면 조건문과 break 문을 잘 활용하는 것이 좋습니다. 이미 앞서 봤듯이 break는 반복문에서 벗어날 수 있는 좋은 방법입니다.
nums = [3, 1, 4, 1, 5, 9, 2, 6]
for num in nums:
if num > 5:
print(f"{num}을 찾았습니다. Loop를 종료합니다.")
break
print(num)
# 출력 결과
# 3
# 1
# 4
# 1
# 5
# 9를 찾았습니다. Loop를 종료합니다.
위 예시에서는 9를 찾자마자 break로 반복문을 종료시켰습니다. 이렇게 하면 불필요한 반복을 줄여 프로그램의 효율성이 높아집니다.
4. 반복 가능한 객체(Iterable) 활용하기
파이썬에서는 반복 가능한 객체(Iterable)에 대해 반복문을 수행할 수 있습니다. 리스트, 튜플, 문자열 등이 대표적인 반복 가능 객체입니다.
for char in "Hello":
print(char)
# 출력 결과
# H
# e
# l
# l
# o
위 예시에서는 문자열 "Hello"가 반복 가능한 객체이므로, for문을 통해 문자열의 각 문자를 차례대로 반복할 수 있습니다.
또한 다음과 같이 시퀀스 자료형이 아닌 객체에 대해서도 __iter__ 메서드와 __next__ 메서드를 정의하면 반복 가능한 객체로 만들 수 있습니다.
class Counter:
def __init__(self, start, stop):
self.current = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current < self.stop:
num = self.current
self.current += 1
return num
raise StopIteration
for num in Counter(3, 8):
print(num)
# 출력 결과
# 3
# 4
# 5
# 6
# 7
이처럼 반복 가능한 객체를 잘 활용하면 반복문 코드를 간결하고 유연하게 작성할 수 있습니다.
5. 고급 기법: 컴프리헨션(Comprehension) 활용하기
컴프리헨션은 반복문과 조건문을 한 줄의 코드로 작성할 수 있게 해줍니다. 리스트 컴프리헨션, 딕셔너리 컴프리헨션, 셋 컴프리헨션이 있습니다.
# 리스트 컴프리헨션
squares = [x**2 for x in range(10)]
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 딕셔너리 컴프리헨션
squared = {x: x**2 for x in range(5)}
print(squared) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 셋 컴프리헨션
odd_squares = {x**2 for x in range(10) if x**2 % 2 == 1}
print(odd_squares) # {1, 9, 25, 49, 81}
컴프리헨션은 한 줄에 반복문과 조건문을 모두 작성할 수 있어 코드가 간결해지지만, 가독성이 떨어질 수 있습니다. 따라서 간단한 경우에 활용하되 너무 복잡해지면 일반 반복문으로 작성하는 것이 좋습니다.
이렇게 파이썬의 반복문을 보다 효율적이고 유연하게 활용할 수 있는 방법들이 있습니다. 상황에 맞게 적절한 방법을 선택하면 코드의 가독성과 효율성을 높일 수 있습니다.
정리 및 연습문제
지금까지 파이썬의 반복문 for문과 while문에 대해 알아보았습니다.
- for문은 시퀀스 자료형의 반복에 사용됩니다.
- while문은 특정 조건에 따른 반복에 사용됩니다.
- 중첩 반복문을 통해 2차원 반복을 수행할 수 있습니다.
- break와 continue로 반복문의 흐름을 제어할 수 있습니다.
- 반복문을 효율적으로 활용하기 위한 다양한 팁들이 있습니다.
여기에서 몇 가지 연습문제를 풀어보며 배운 내용을 확인해보겠습니다.
1) 1부터 100까지의 숫자 중 홀수만 출력하는 코드를 for문과 while문으로 각각 작성해보세요.
2) 사용자로부터 구구단 단수를 입력받아, 해당 구구단을 출력하는 코드를 작성해보세요. (while 문 활용)
3) 주어진 2차원 리스트 안의 숫자 중 5의 배수만 찾아서 새로운 리스트에 담는 코드를 작성해보세요. (중첩 반복문 활용)
nums = [[3, 15, 7], [9, 20, 25], [11, 8, 10]]
파이썬 반복문 기초에 대해 충분히 이해하셨기를 바랍니다. 궁금한 점이나 추가 설명이 필요한 부분은 말씀해주시기 바랍니다.
참고 자료
[1] 박응용 박사, "혼자 공부하는 파이썬"
[2] Python Software Foundation, "Python Documentation: For Statement", "Python Documentation: While Statement"
[3] Jose Portilla, "Python for Data Structures, Algorithms, and Interviews"
[4] Cory Althoff, "The Self-Taught Programmer"
한 고대 문서 이야기
여기 한 고대 문서가 있습니다. 이 문서는 B.C. 1,500년 부터 A.D 100년까지 약 1,600 여 년 동안 기록되었습니다. 이 문서의 저자는 약 40 명입니다. 이 문서의 고대 사본은 25,000 개가 넘으나, 사본간 오
gospel79.tistory.com
유튜브 프리미엄 월 1만원 할인받고 월 4000원에 이용하는 방법
올해 5월부터 월 8000원 정도이던 유튜브 프리미엄 요금이 15000원 정도로 인상됩니다. 각종 OTT 서비스, ChatGPT 같은 서비스들이 늘어나다보니 이런 거 몇 개만 이용하더라도 월 이용요금이 5만원을
stock79.tistory.com
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."