본문 바로가기

파이썬

제어문(control statement) (2) - 반복문 for, while

반복문은 코드 블록을 반복 실행할 수 있는 제어문이다. 파이썬에는 2가지 종류의 반복문이 있는데, 바로 for과 while 반복문이다. 

■ for 문은 정해진 횟수만큼 반복하는 횟수 반복문이라고 할 수 있으며, while 문은 특정한 조건이 성립되는 동안 반복하는 조건 반복문이라고 할 수 있다. 

 

1. while 반복문 - 조건 반복문

■ 조건 반복문인 while 문은 특정한 조건이 만족되는 동안 계속 루프가 계속 실행된다. 


1.1 while 문의 기본 구조

■ while 문의 기본 구조는 다음과 같다.

while 조건식:
    실행할_문장_1
    실행할_문장_2
    ....

■ while 문은 일정한 조건을 만족하기까지 위와 같이 들여쓰기한 명령문 블록을 반복 실행한다. 

■ while 문 기본 구조에서 while로 시작한 행은 반복문의 '헤더'라고 한다. 헤더의 조건은 해당 반복문의 연속 조건이라고 한다.연속 조건은 True나 False를 연산하는 boolean 표현이다. 즉, 헤더의 조건식이 반복 여부를 결정하게 된다. 

while 문은 헤더의 조건의 값을 확인하고, 조건이 True이면 명령문 블록을 반복 실행하며, False이면 반복을 종료한다. 이 과정에서 매번 헤더의 조건을 재확인하고, 조건 결과(True인지 False인지)에 따라 반복문을 진행한다.  

money = 1000
year = 0
rate = 0.03

while money < 2000:
    money += money * rate
    year += 1
    
print(year)
```#결과#```
24
````````````
money = 1000
year = 5
rate = 0.03

while year:
    money += money * rate
    year -= 1
    print(year)
    
print(money)
```#결과#```
4
3
2
1
0
1159.2740743
````````````

■ 위의 예시들은 모두 조건문이 False가 될 때까지 루프가 실행되는 것을 볼 수 있다. 두 번째 예시의 경우 False인 year = 0이 될 때까지 루프를 실행한다.

■ while 문도 for 문처럼 횟수 반복을 수행할 수 있다. 반복할 횟수를 알고 있다면, 아래와 같이 while 문 헤더의 조건식에 반복 횟수를 제어하는 조건을 설정하면 된다.

year = 0
money = 1000
rate = 0.03

while year <= 10:
    money += money * rate
    year += 1

print(money)
```#결과#```
1384.2338707244455
````````````

■ 위의 예시는 year가 0부터 시작해서 year <= 10이 될 때까지 반복하기 때문에 총 11번 루프가 수행된다.

■ while 문의 경우 조건식을 잘못 설정하면 무한히 반복된다. 이것을 무한 루프(infinite loop)라고 한다. 아래 예시는 year = year + 1이 빠져 있기 때문에 while 문 헤더의 조건식이 계속 True로 설정되어 무한 루프가 발생하는 예시이다.

year = 0

while year <= 10:
    money += money * rate

1.2 else가 포함된 while 문

파이썬에서는 while 루프에 else를 붙일 수 있다. else는 조건식이 False이면 실행된다. 만약, while 루프가 break 문으로 종료되면 else는 실행되지 않는다.

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('종료')
```#결과#```
0
1
2
종료
````````````

i = 4
while i < 3:
    print(i)
    i += 1
else:
    print('종료')
```#결과#```
종료
````````````

i = 1
while i < 5:
    print(i)
    if i % 3 == 0:
        break
    i += 1
else:
    print('종료')
```#결과#```
1
2
3
`````````````

이와 같이 while 문은 문장을 수행하다 조건이 맞지 않으면 루프를 종료한다. 이때 while 문을 빠져나가지 않고 while 문의 조건문으로 다시 돌아가게 만들어야 할 경우, continue 문을 사용한다.

i = 0
while i < 5:
    i += 1
    if i % 2 == 0:
        continue
    print(i)
```#결과#```
1
3
5
````````````

- i = 1, 3, 5일 때 if 문의 조건식을 만족하지 않아 print(i)를 수행하지만, i = 2일 때 if 문의 조건식이 True이므로 continue 문이 수행된다.

- continue 문이 수행되어 다시 while 문의 조건문으로 다시 돌아가고 i += 1에 의해 i = 3이 된다. i = 4일 때도 동일한 방식으로 while 루프가 작동한다.



2. for 반복문 - 횟수 반복문 


2.1 for 문의 기본 구조

■ 일반적인 for 루프의 구조는 다음과 같다.

for 변수 in 반복 가능한 객체(리스트/튜플/문자열):
    실행할_문장_1
    실행할_문장_2
    ....
# 리스트
for i in [1, 2, 3, 4, 5]:
    print('Hellow World')
```#결과#```
Hellow World
Hellow World
Hellow World
Hellow World
Hellow World
````````````

# 튜플
a = [(1, 2), (3, 4), (5, 6)]
for (one, two) in a:
    print(one, two)
```#결과#```
1 2
3 4
5 6
````````````

# 문자열
for i in 'abcde':
    print(i)
```#결과#```
a
b
c
d
e
````````````

■ 위와 같이 리스트/튜플/문자열의 요소를 첫 번째 요소부터 마지막 요소까지 하나씩 꺼내 변수에 대입되어 들여쓰기된 명령문이 수행되는 것을 볼 수 있다.

- 문자열이라면 문자열의 첫 번째 문자로 시작해서 마지막 문자까지 하나씩 꺼내 본문에 있는 명령문을 실행한다. 

- 리스트나 튜플이라면, 리스트나 튜플 내에 존재하는 요소별로 한 번씩 본문에 있는 명령문을 실행한다. 


2.2 range( ) 함수

■ 위와 같은 방법으로도 반복할 수 있지만, 반복 횟수가 1000번, 10000번, .... 이라면 이 방법은 불가능하다. 이런 경우 range( )함수를 사용하면 된다.

■ range() 함수의 일반적인 형식은 다음과 같다.

range(start=0, stop, step=1)

for i in range(5): # 0, 1, 2, 3, 4
	...
    
for i in range(1, 5): # 1, 2, 3, 4
	...
    
for i in range(1, 10, 2): # 1, 3, 5, 7, 9
	...

■ start와 step이 생략되면, start와 step의 기본값은 start는 0으로, step은 1로 간주된다.

■ 위와 같이 range 함수의 start값이 stop값보다 작고 증분값인 step의 값은 양수이면, 변수 i에 할당되는 값은 start값으로 시작하여 stop값에 도달하기 전까지 증가하는 순열을 생성한다.

■ 반대로 step 값이 음수이고 start값이 stop값보다 크면 range() 함수는 start값으로 시작하여 stop값에 도달하기 전까지 감소하는 순열을 생성한다.

for i in range(10, 0, -1): # 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
	...

2.3 중첩 반복문(nested loop)

■ 반복문은 중첩해서 사용할 수 있다. 즉, 반복문 안에 다른 반복문이 포함될 수 있다. 이런 형태를 중첩 반복문(nested loop)이라 하며, 외부에 있는 반복문을 외부 반복문(outer loop), 외부 반복문 안에 있는 반복문을 내부 반복문(inner loop)이라 한다.

for x in range(3):
    for y in ['a','b','c']:
        print(x, y)
```#결과#```
0 a
0 b
0 c
1 a
1 b
1 c
2 a
2 b
2 c
````````````

위와 같이 중첩 반복을 할 경우 작동 방식은 예를 들어, 외부 반복문이 먼저 수행되어 x = 0일때, 내부 반복문이 모두 실행되어 (x = 0, y  = a), (x = 0, y = b), (x = 0, y = c)가 된다.

■ 이러한 중첩 반복문은 다음과 같이 컴프리헨션에도 사용할 수 있다. 

# 리스트 컴프리헨션

[표현식 for 변수1 in 반복 가능한 객체1 if 조건문1
		for 변수2 in 반복 가능한 객체2 if 조건문2
        ...,
        ...,
        for 변수n in 반복 가능한 객체n if 조건문n]
[print(x, y) for x in range(3) for y in ['a', 'b', 'c']]
```#결과#```
0 a
0 b
0 c
1 a
1 b
1 c
2 a
2 b
2 c
````````````


3. break, continue 명령문

while, for 반복문 내에 if 조건식:을 작성하고, if 문의 결과에 break나 continue 명령문을 사용하면, if 문 조건식 결과에 따라 반복문을 즉시 종료하거나 반복문의 처음으로(헤더 부분으로) 돌아가게 만들 수 있다. 

while True: # 무한 루프
    if 조건:
        break
    if 조건:
        continue
        
for i in ~:
    if 조건:
        break
    if 조건:
        continue

■ break 명령문이 반복문 내부에서 실행될 때, 반복문은 즉시 종료된다.

■ continue 명령문은 반복문 내부에서 실행되면, while/for 문의 헤더 부분으로 돌아가는데, 예를 들어 1부터 10까지 숫자 중에서 2의 배수만 제외하고 출력하고 싶다면 다음과 같이 continue 명령문을 사용하면 된다. 

for i in range(10):
    if i%2==0:
        continue
    print(i, end=' ')
```#결과#```
1 3 5 7 9 
````````````

■ 위의 코드는 0부터 9까지 모든 정수에 대하여 반복한다. 만약 정수가 2의 배수이면 continue 명령문이 실행되어 for 문으로 돌아가게 된다.

- 예를 들어 i = 0이라면 if 문이 True이므로 continue가 실행되어, if 문 아래의 print() 명령문을 수행하지 않고 for 문으로 돌아가서 다음 반복이 시작된다. 즉, i = 1이 되는 것이다. 


참고) pass  명령문

■ while/for 반복문에는 적어도 들여쓰기한 1개 이상의 명령문 블록이 들어가야 한다. 만약, 아무것도 하지 않으면서 반복하는 명령문이 필요한 경우 명령문 블록으로 pass 명령문을 사용하면 된다.

pass 명령문은 아무런 작업도 하지 않고 자리만 차지하는 명령문이기 때문이다. 


'파이썬' 카테고리의 다른 글

함수  (1) 2024.09.06
파일 읽고 쓰기  (0) 2024.09.03
제어문(control statement) (1) - 조건문 if  (0) 2024.08.28
자료형(Data Type) (4) - 세트(집합), 딕셔너리  (0) 2024.08.24
자료형(Data Type) (3) - 튜플, 불(bool)  (0) 2024.08.23