반복문(Loop)
1. 반복문의 필요성
- 5개의 정수 원소가 담긴 리스트 numbers에서 순차적으로 아래와 같이 원소에 접근할 수 있다.
numbers = [10, 20, 30, 40, 50]
print(numbers[0])
print(numbers[1])
print(numbers[2])
print(numbers[3])
print(numbers[4])
10
20
30
40
50
- 만약 리스트 numbers의 원소가 100개이면 어떨까?
- 모든 원소에 접근하려면 100줄의 코드를 작성해야 한다. ⇒ 상당히 비효율적이다!
- 이는 원소의 개수가 많으면 많을수록 더 비효율적이다.
numbers = [1, 2, 3, ..., 98, 99, 100]
print(numbers[0])
print(numbers[1])
...
print(numbers[98])
print(numbers[99])
1
2
...
99
100
- 반복문을 사용하면 효율적으로 코드를 개선할 수 있다.
numbers = [10, 20, 30, 40, 50]
for number in numbers:
print(number) # 리스트 numbers의 원소를 하나씩 순회하며 출력
10
20
30
40
50
- 반복문은 컨테이너 자료형의 여러 원소들에 대해 특정 처리를 할 때 유용하게 사용된다.
- 크게 for 반복문과 while 반복문으로 나눌 수 있다.
2. for 반복문
반복 횟수가 정해져 있는 경우에 사용한다. (보통 원소의 개수만큼 반복)
2-1. for 변수 in 컨테이너
for 변수 in 컨테이너:
반복하는 동안 수행되는 동작 1
반복하는 동안 수행되는 동작 2
...
- 먼저 for 변수 in 컨테이너의 형식으로 작성하고 마지막에는 반드시 콜론(:)을 붙인다.
- 컨테이너의 첫 번째 원소부터 마지막 원소까지 반복을 수행한다.
- 변수에는 반복을 수행하면서 컨테이너의 원소가 차례로 하나씩 할당된다.
- 반복문 안에서 수행할 코드는 반드시 들여쓰기를 해야한다.
- 예시
1. 리스트 순회
names = ["kyle", "alex", "justin"]
for name in names:
print(f"안녕하세요! {name}!")
안녕하세요! kyle!
안녕하세요! alex!
안녕하세요! justin!
- 어렵게 생각할 필요 없이, 리스트 names의 원소들을 하나씩 뽑아서 name이라는 변수에 할당한다고 생각하면 된다.
for name in ["kyle", "alex", "justin"]:
print(f"안녕하세요! {name}!")
안녕하세요! kyle!
안녕하세요! alex!
안녕하세요! justin!
2. 문자열 순회하기
word = "PYTHON"
for character in word:
print(character)
P
Y
T
H
O
N
3. 조건문과 함께 사용하기 ⇒ 필터링
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 리스트 numbers의 원소 중에서 짝수만 출력하기
for number in numbers:
if number % 2 == 0:
print(number)
2
4
6
8
10
2-2. for i in range(n)
- 레인지(range)는 연속된 정수 목록을 가지고 있는 컨테이너 자료형이다.
- for 문은 리스트, 문자열 뿐만 아니라 레인지의 원소를 반복하는 데에도 많이 사용된다.
# 0부터 4까지의 정수를 변수 i에 차례로 할당
for i in range(5):
print(i)
0
1
2
3
4
- 레인지의 step을 이용하면 1부터 10까지의 정수 중 홀수만 출력하는 코드를 작성할 수 있다.
# 1부터 10까지 2씩 뛰어넘으면서 변수 i에 정수를 차례로 할당
for i in range(1, 11, 2):
print(i)
1
3
5
7
9
- 보통 for i in range(n)은 특정 횟수만큼 코드를 반복할 때 사용한다.
for i in range(3):
print("이 문장은 3번 반복됩니다.")
이 문장은 3번 반복됩니다.
이 문장은 3번 반복됩니다.
이 문장은 3번 반복됩니다.
- 또한 i를 인덱스로 사용하여 리스트나 문자열의 원소에 접근할 수도 있다.
numbers = [1, 2, 3, 4, 5]
# 0부터 (numbers의 길이 - 1)까지 변수 i에 차례로 할당 (즉, i가 numbers의 인덱스 역할 수행 가능)
for i in range(len(numbers)):
print(numbers[i])
1
2
3
4
5
- 위 코드는 아래와 정확히 동일하게 동작한다.
numbers = [1, 2, 3, 4, 5]
for number in numbers:
print(number)
1
2
3
4
5
- 마지막으로 조건문과 함께 사용하여 더욱 다양하게 반복문을 수행할 수도 있다.
- 1부터 5까지 담겨있는 정수 리스트 numbers를 반복하면서 짝수 번째 인덱스의 원소만 출력하도록 작성할 수 있다.
numbers = [1, 2, 3, 4, 5]
for i in range(len(numbers)):
if i % 2 == 0:
print(numbers[i]) # 0번째, 2번째, 4번째 원소만 출력
1
3
5
3. while 반복문
반복 횟수가 정해져 있지 않은 경우에 사용한다. (사용자가 반복 횟수를 조절 가능)
3-1. while
- while문의 기본적인 구조는 아래와 같다.
while 조건문:
반복하는 동안 수행되는 동작 1
반복하는 동안 수행되는 동작 2
...
- while 문의 오른쪽에는 조건문을 작성하고 마지막에는 반드시 콜론(:)을 붙인다.
- 조건문의 결과가 참(True)으로 판별되면 반복을 수행하고, 거짓(False)로 판별되면 반복을 중단한다.
- 예시
1. 1부터 5까지의 정수를 반복해서 출력하기
number = 1 # 초기화
while number <= 5: # 조건 (참이면 반복 수행, 거짓이면 반복 종료)
print(number)
number += 1 # 증감식 (증감식이 있어야만 나중에 반복을 종료할 수 있음)
1
2
3
4
5
2. 리스트 순회하기
numbers = [10, 20, 30, 40, 50]
i = 0 # 초기화
while i < len(numbers): # 조건
print(numbers[i])
i += 1 # 증감식
10
20
30
40
50
3. 조건문과 함께 사용하기 ⇒ 필터링
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
i = 0
# 리스트 numbers의 원소 중에서 짝수만 출력하기
while i < len(numbers):
if numbers[i] % 2 == 0:
print(numbers[i])
i += 1
2
4
6
8
10
4. (심화) 리스트가 빌 때까지 삭제하면서 그 삭제한 원소를 출력하는 코드를 아래와 같이 작성할 수 있다.
- 리스트는 원소가 1개 이상이면 True, 원소가 없으면 False로 판별되기 때문에 while numbers:와 같은 식으로 작성하면 numbers가 비었는지 안비었는지를 판별할 수 있다.
numbers = [1, 2, 3, 4, 5]
while numbers: # 조건 (numbers가 비는 순간 반복 종료)
deleted_number = numbers.pop() # numbers의 마지막 원소 삭제 및 반환
print(deleted_number)
print(numbers) # []
5
4
3
2
1
[]
- while 문 사용 시 주의사항
- 조건문에 들어가는 변수에 대한 초기화를 반드시 해야한다. ⇒ 초기화를 하지 않으면 존재하지 않는 변수라고 에러가 발생한다.
- 조건문을 False로 만들어 반복을 종료하도록 증감식을 설정해야 한다. ⇒ 증감식이 없으면 무한루프가 발생한다.
3-2. 무한루프
- 반복 횟수가 정해져있는 for 문과 달리, while 문은 사용자가 반복 횟수를 지정할 수 있다.
- 따라서 while 문에서는 반복이 영원히 종료 되지 않도록 할 수 있는데, 이를 무한루프라고 한다.
- 예시
1. 증감식이 없으면 조건이 항상 True로 판별되므로, 무한루프가 발생한다.
number = 1 # 초기화
while number <= 5: # 조건
print(number)
# 증감식이 없음
1
1
1
1
1
...
(무한히 1을 출력)
2. 조건문에 임의로 True를 작성하여 무한루프를 발생시킬 수 있다.
while True:
print("INFINITE")
INFINITE
INFINITE
INFINITE
INFINITE
INFINITE
INFINITE
...
- 무한루프는 프로그램이 종료되지 못하도록 하기 때문에, 반드시 반복문이 언젠가 종료되도록 코드를 작성해야 한다.
- 증감식을 작성하는 것 이외에도, 파이썬에서는 break 라는 키워드를 이용하여 강제로 반복문을 종료할 수 있는 기능을 제공한다.
4. break와 continue
4-1. break
반복문을 강제로 종료하는 키워드이며 for 문과 while 문에서 모두 사용 가능하다.
- 보통 조건문과 함께 사용하여 특정 조건을 만족했을 때 반복문을 종료하도록 설정한다.
- for 문에서는 아래와 같이 작성한다.
numbers = [1, 2, 3, 4, 5]
for number in numbers:
print(number)
# 원소 3을 만난 경우 반복 종료
if number == 3:
print("반복을 종료합니다.")
break
1
2
3
반복을 종료합니다.
- while 문에서는 아래와 같이 작성한다.
numbers = [1, 2, 3, 4, 5]
i = 0
while True:
print(numbers[i])
# 원소 3을 만난 경우 반복 종료
if numbers[i] == 3:
print("반복을 종료합니다.")
break
i += 1
1
2
3
반복을 종료합니다.
- 같은 들여쓰기 레벨에서, break의 아래 부분은 결코 실행될 수 없기 때문에 해당 부분에 코드를 작성하지 않도록 주의한다.
numbers = [1, 2, 3, 4, 5]
for number in numbers:
print(number)
# 원소 3을 만난 경우 반복 종료
if number == 3:
print("반복을 종료합니다.")
break
print("이 부분은 실행되지 않습니다.") # 이 부분은 결코 실행될 수 없다.
1
2
3
4-2. continue
다음 반복으로 강제 이동시키는 키워드이며 for 문과 while 문에서 모두 사용 가능하다.
- 보통 조건문과 함께 사용하여 특정 조건을 만족했을 때 더 이상 아래 부분을 실행하지 않고, 다음 반복으로 넘어가도록 설정한다.
- for 문에서는 아래와 같이 작성한다.
numbers = [1, 2, 3, 4, 5]
for number in numbers:
if number % 2 == 0: # 만약 짝수라면
continue # 아래를 실행하지 않고 다음 반복으로 넘어감
print(number) # 홀수만 출력
1
3
5
- while 문에서는 아래와 같이 작성한다.
number = 0
while number <= 5:
number += 1
if number % 2 == 0: # 만약 짝수라면
continue # 아래를 실행하지 않고 다음 반복으로 넘어감
print(number) # 홀수만 출력
1
3
5
- continue는 일종의 필터링이라고 생각하면 쉽다. 여러 continue를 두어 원하는 데이터만 출력할 수 있다.
# 1부터 20까지의 정수 중 2의 배수도 아니고 3의 배수도 아닌 정수만 출력하는 코드
for i in range(1, 21):
if i % 2 == 0:
continue # 2의 배수이면 다음 반복으로 넘어감
if i % 3 == 0:
continue # 3의 배수이면 다음 반복으로 넘어감
print(i)
1
5
7
11
13
17
19
- 같은 들여쓰기 레벨에서, continue의 아래 부분은 결코 실행될 수 없기 때문에 해당 부분에 코드를 작성하지 않도록 주의한다.
number = 0
while number <= 5:
number += 1
if number % 2 == 0:
continue
print("이 부분은 실행되지 않습니다.") # 이 부분은 결코 실행될 수 없다.
print(number)
1
3
5
'Python' 카테고리의 다른 글
함수(Function) (0) | 2024.03.31 |
---|---|
기초 자료구조와 로직 설계 (1) | 2024.03.23 |
컨테이너(Container) 자료형 (1) | 2024.03.23 |
조건문(Condition) (0) | 2024.03.23 |
연산자(Operators) (1) | 2024.03.17 |