본문 바로가기
Python/Coding Base

7. 반복문(Iteration) - while문

by Nanki 2022. 1. 13.

앞에서 설명했던 게시글을 먼저 참고하기 바란다.

 

while문을 쉽게 알아보자

while문은 어떤 조건을 정해 놓고 반복을 하는 구조를 말한다. 체육시간에 오래 달리기 시험을 본다고 하자. 이때 짝을 지어줄 것이다. 한 명은 달리는 사람, 한 명은 달리는 사람의 바퀴수를 세는 사람으로 역할이 나뉜다. 이때 달리는 사람은 명령어가 될 것이고, 바퀴수를 세는 사람은 while문에 해당한다. 

달리는 사람(명령어)가 달릴 때마다 세는 사람에게 몇 바퀴 뛰었냐고 물어보면, 세는 사람(while문)은 진행된 바퀴를 알려주거나, 앞으로 남은 바퀴수를 알려줄 것이다.

 

while문의 구조는 어떻게 될까?

i=1
while i < 11 :
	print("운동장 아직 더 돌아야돼")
	i = i+1
print("10바퀴 다 뛰었어 그만 뛰어")

1. 변수 i에다가 1을 대입하여 초기값(initial)을 입력한다.

2. while 문이 시작되고 1번 순서에서 대입한 i값을 가져와 11과 비교한다. 

3. 이전 i<11에서는, i가 0 이므로 0 <11은 지당하다. 조건문, 비교문은 결과를 블론(True, False)로 변환하는데, 지당하므로 True라는 결과를 뱉는다. 이후 뒤에 : 가 있을 것이라 기대한다. (없으면 구문 에러)

  • 이때 while문은 : 뒤 들여 쓰기 된 하위 명령어들을 실행할지 말지 결정한다. 이 결정의 기준이 바로 위에서 도출한 블론(True, False)이다. True일 경우에만 아래 명령어들을 수행한다.
  • i < 11처럼 블론으로 True면 통과 False면 종료 시긴다. 따라서 11은 어찌 보면 수문장 역할을 담당한다. 이 역할 값인 11을 보초 값(sentinel)이라고 부르며 다음과 같은 상황에 쓰인다. 보초 값은 뒤에서 더 자세한 예제로 다뤄보도록 하겠다. 
아래의 보초 값의 상황에 해당되는 상황이면 이를 위해 while문을 써야될 것이다 판단할 수도 있다. 따라서 while문을 공부할 때 보초값의 쓰임이 되는 예제를 익혀두면, 적절하게 while문을 사용할 수 있을 것이다.
  • 입력될 데이터의 값이 미리 알려지지 않음
  • 데이터가 너무 많아서 개수를 알기가 힘든 경우
    • ex) 성적을 입력받아 평균을 구하는 프로그램일 경우 음수나 100을 초과하는 값을 보초 값(sentinel)으로 선택하는 것이 좋다. ( while i >= 0  또는 while i > 100 )

4. 그리고 이 i라는 변수에 1을 더하여 i값을 키운다. 

  • 만약 i라는 변수를 키우지 않으면, 계속 i는 1의 숫자에 고정되어 있을 것이고 계속해서 블론 값은 True를 반환하게 된다. 이럴 경우 무한 루프(infinite loop)에 빠지게 된다. 따라서, 이 루프를 빠져나가는(블론 값이 False를 만드는) 조건을 하위 명령어에 달아주어야 한다.

5. 이후 다시 2번부터 4번까지의 순서를 반복하고 i가 11이 되는 순간 while 내 하위 명령어를 실행하지 않고 종료한다. 즉, while문과 대등한 위치의 명령어인 print("10바퀴 다 뛰었어 그만 뛰어")를 실행하게 된다.

 

무한 루프(Infinite loop) 과연 나쁜 것 일까?

우리 주변에는 무한 루프로 되어있는 프로그램들이 상당히 많이 존재한다. 에어컨, PC, 모니터 등이 그것이다. 즉, 전원 버튼을 켜면 끌 때까지 계속 작동된다. 킨 이후 작동되는 것이 무한루프로 동작한다는 것이고, 끄는 버튼이 이러한 무한 루프를 종료하는 조건인 셈이다. 즉, 무한 루프와 이를 빠져나가는 조건문은 바늘과 실의 관계이다.

 

보초 값(sentinel, 센티널)을 사용하는 상황을 예제로 한번 더 알아보자.

만약 내가 이익을 얻은 종목들에 한해서 수익률의 평균을 내는 프로그램을 만든다고 하자. 여기서 변수는 종목들(n)과 수익률(income)이다. 즉 내가 투자한 종목의 개수가 계속 바뀌고, 이에 따른 수익률도 계속 변한다. 

n = 0
sum = 0
income = 0

print("음수를 입력하면 평균 계산이 종료 됩니다.")

while income >= 0:
    income = int(input("수익률을 입력하세요"))
    if income > 0:
        sum = sum + income
        n = n+1

if n > 0 :
	average = sum / n
print("%s 개의 종목 중에서" %n, "당신의 수익률은 %f 입니다." %average)
  • 상수를 변수에 대입하는 경우 보통 변수를 대문자로 표기한다. 하지만 while문으로 지속적으로 변할 값이므로, 소문자로 표기한다.

이 예제로 알 수 있는 while의 필수 조건은 다음과 같다.

while의 필수 조건

1. 초기값(initial)이 존재한다. 초기값은 당연 상수이나, 이후 대부분 while에서 변하는 변숫값이 된다. 

2. 보초 값(sentinel)이 존재한다. 보초 값의 블론 결과에 따라 while문 실행/중단 여부가 결정된다.

3. 초기값과 보초 값은 밀접한 관련이 있다.

반복문의 응용, 중첩 루프

반복문 안에 다른 반복문이 포함될 수 있다. 이러한 형태를 중첩 반복(nested loop)이라고 부르며, 외부 위치하는 반복문은 외부 반복문(outer loop), 안쪽의 반복문을 내부 반복문(inner loop)이라 한다. 

  • 내부 반복문은 외부 반복문이 한번 반복할 때마다 새롭게 실행된다.

중첩 루프는 2차원 데이터에서 원하는 값으로 바꾸거나, 차원을 늘린 데이터를 생성하기 위해 많이 사용된다. 본 예시에서는 *로 5행, 10열로 표현한 출력 값을 만들어 보겠다.

(보통 행렬해서 행(row)을 i, 열(column)을 j로 표기하기에, 외부 반복문은 i , 내부 반복문은 j로 표기하였다.)

for i in range(5) : #=== 외부 반복문 시작 ===#
    for j in range(10) : #=== 내부 반복문 시작 ===#
        print("*", end="") #=== 내부 반복문 끝 ===#
    print("") #=== 외부 반복문 끝 ===#
  • end 문은 여러 번의 반복으로 출력된 print() 결과를 한 줄로 이어주는역할을 한다. 이 end문이 내부 반복문에 존재하므로 내부에서 동작했다면 한줄로 표현될 것이고, 외부 반복문을 거쳐 다시 내부 반복문이 동작했다면 다음 줄에 *가 생성될 것이다.
  • 결과는 다음과 같다.
    **********
    **********
    **********
    **********
    **********​

 

'Python > Coding Base' 카테고리의 다른 글

9. 함수(function) 2 - 디폴트 인수, 키워드 인수  (0) 2022.01.23
8. 함수(function) 1 - 인수, 매개변수, 반환 값  (0) 2022.01.18
6. 반복문(Iteration) - for문  (0) 2022.01.11
5. 조건문  (0) 2022.01.10
4. 자료형  (0) 2022.01.06