#5. 파이썬 기본 5 - 반복문
- PIA team
- 2022년 2월 15일
- 5분 분량

#5-1. while문
python에서 문장을 반복해서 사용해야 할 경우, while문을 사용합니다.
영어에서의 while 이 ~동안에 라는 뜻을 가지는 것과 마찬가지로, while문은 조건문이 참인 동안에 while 아래의 문장들이 반복해서 수행되는 것입니다.
① 기본 While문
구조는 다음과 같습니다.
while <조건문>:
<수행 문장1>
<수행 문장2>
<수행 문장3>
...
예를 들어, 한 반에 성적 1등부터 10등까지 총 10명이 있는데, 1등부터 5등까지는 합격을,
6등부터 10등까지는 탈락이라고 표시하는 코드를 작성해봅시다.
>>> grade = 0
>>> while grade<10:
>>> grade = grade + 1 # grade += 1 이라고 사용하기도 합니다.
>>> if grade<6:
>>> print("%d등:합격" %grade)
>>> else:
>>> print("%d등:탈락" %grade)
이렇게 구성을 하면, grade<10 이 참이 되는 구간에서 grade가 1씩 증가하며 내부 코드를 수행하게 되는데, 이 때, 6보다 작으면 합격을, 그렇지 않으면 탈락을 출력합니다.
만약 grade=10 이 되면, 다시 while 문의 평가식에 다다랐을 때, 평가식이 거짓이 되기 때문에 while문이 종료됩니다.

잘 출력된 것을 확인할 수 있습니다.
② break문
while문에서는 break문을 통해 강제로 빠져나가는 방법이 있습니다.
예를 들어, 지폐 교환기를 파이썬으로 표현해 보겠습니다. 편의를 위해 10,000원 권 지폐를
1,000원 권 지폐 10장으로 교환해주는 지폐 교환기라고 가정하겠습니다.
교환기 안에 1,000원 권 지폐가 충분히 있으면, 10,000원 권 지폐를 넣었을 때 정상적으로 1,000원 권 지폐 10장을 출력해 줍니다. 그런데 정상적으로 계속 교환을 해주기 위해서는 1,000원 권 지폐의 보유 수량을 계속 확인해야 하고, 보유 수량이 없을 경우, 교환 중지 문구를 출력해야 합니다. 이렇게 강제로 중간에 프로그램을 중지하는 것이 바로 break문 입니다.
>>> bill_1000 = 50
>>> bill_10000 = 5
>>> while bill_10000:
>>> print("만 원이 들어왔으니, 천 원권 10장을 줍니다.")
>>> bill_1000 = bill_1000 - 10
>>> print("교환 가능한 천 원권의 수는 %d개입니다." %bill_1000)
>>> if bill_1000 == 10:
>>> break
>>> print("교환 중지 - 천 원권 수량 부족")
이렇게 코드를 구성한다면, 10,000원 권이 들어올 경우, 1000원 권 10장으로 교환해 주고,
1,000원 권 수량이 10개 남으면, while문을 강제로 탈출하고, 교환 중지 문구를 띄울 것입니다.

그런데, 실제 지폐 교환기는 이러한 코드로 이루어져 있지 않을 것입니다. 조금 더 현실성 있는 코드를 구성해보도록 하겠습니다.
③ int ( input( ) ) 내장 함수
int(input())
위의 내장 함수를 알고 있다면, 도움이 될 것입니다. 뒤에서 다룰 것이므로, 간단하게만 설명한다면, input 이라는 함수를 정수로 바꿔주는 것입니다. 예를 들어,
money = int(input("돈을 투입해 주세요:"))
라고 한다면, 숫자를 입력할 경우, 사용자에게 입력받은 숫자를 money 변수에 대입하여 주는 것입니다.
이를 이용해 코드를 구성해 보겠습니다.
지폐 교환기를 이용하기 위해서는,
돈을 넣는다.
10,000원 권 한 장 당 1,000원 권 10장을 받는다.
50,000원 권을 넣으면, 1,000원 권 10장과 나머지 돈을 거스름돈으로 받는다.
10,000원 이하는 교환이 안된다.
기계 내에 1,000원 권이 없을 경우, 교환을 중지하고 문구를 출력한다.
이렇게 5가지의 조건을 충족시키는 코드를 작성해야 합니다.
>>> bill_1000 = 30
>>> bill_10000 = 10
>>> while True:
>>> money = int(input("돈을 투입해 주세요:"))
>>> if money == 10000:
>>> print("10,000 원이 투입되어, 1,000 원 권 10장 드립니다.")
>>> bill_1000 = bill_1000 - 10
>>> bill_10000 = bill_10000 + 1
>>> elif money>10000:
>>> print("%d원이 투입되어, 1,000원 10장과 거스름돈 %s원 드립니다."
>>> ...%(money, money-10000)
>>> bill_1000 = bill_1000 - 10
>>> bill_10000 = bill_10000 + 1
>>> else:
>>> print("교환은 10,000 원 이상부터 가능합니다.")
>>> print("교환 가능한 1,000 원 권은 %d개입니다." %bill_1000)
>>> if bill_1000 == 0:
>>> print("교환 중지-1,000원 권 수량 부족")
>>> break
굉장히 복잡한 코드인 것 같지만, 위부터 차례대로 해석을 해본다면, 이해가 쉬울 것입니다.
돈을 투입해 주세요 옆에 투입하고 싶은 만큼 돈을 입력 후, 엔터를 쳐 봅시다.
본인이 짠 코드대로 출력한다는 것을 확인할 수 있습니다.

예를 들어, 10,000원을 입력하면, if문에 지정한 것처럼 1,000원 권 10장을 받고, if문이 끝난 후 print에 설정한 것처럼 현재 교환 가능한 1,000원 권의 수를 알려줄 것입니다.
④ continue문
while문에서는 continue문을 통해 다시 while문의 다음 Loop로 넘어 가는 것이 가능합니다.
즉, while문을 수행하는 동안에 continue를 만나면, while의 나머지 뒷부분은 수행하지 않고, 바로 while문의 다음 loop 로 넘어갈 수 있습니다. 물론 이 때 while문의 조건식은 다시 평가되어 False인 경우 while문을 빠져나갑니다.
예를 들어 1~20까지의 수 중에, 홀수만 출력하고 싶다면, 다음과 같이 코드를 짤 수 있습니다.
>>> a = 0
>>> while a<20:
>>> a += 1
>>> if a%2 ==0:
>>> continue
>>> print(a)
a가 20보다 작을 때, a를 1만큼 증가시키고, 그 값이 2로 나누었을 때 0이라면 (짝수),
while문의 다음 Loop로 넘어가게 됩니다.
그리고 그 값이 홀수라면, a를 출력합니다. 그리고 다시 while문의 다음 Loop로 넘어갑니다.
이 과정을 조건이 끝나 while문을 빠져나갈 때까지 계속 하는 것입니다.

문제 없이 출력됩니다.
Pass문과 Continue문의 차이점에 대해서 말씀드리겠습니다.
#pass문
>>> a=0
>>> while a<20:
>>> a+=1
>>> if a%2==0:
>>> pass
>>> print(a)
#continue문
>>> a=0
>>> while a<20:
>>> a+=1
>>> if a%2==0:
>>> continue
>>> print(a)
언뜻 보기에는 둘의 차이가 무엇인지 알기 어려울 수 있습니다. 그러나 pass문을 잘 생각해보면, 다음 단계로 진행한다는 의미이므로, a가 짝수인 경우에도, print(a)로 진행하게 됩니다.
continue문을 생각해보면, a가 짝수인 경우, 다시 while문의 다음 Loop로 돌아가 a+1 값으로 if문을 다시 수행하며, 홀수이면 print(a)로 진행할 것입니다.
pass문을 사용한 경우, 1부터 20까지의 모든 수가 출력될 것이고, continue문을 사용한 경우,
홀수만 출력될 것입니다. 직접 한 번 출력해 보시면, 잘 출력됨을 확인할 수 있습니다.
⑤ 무한 루프(Loop)
만약, 이처럼 코드를 짜면 어떻게 출력될까요?
>>> while True:
>>> add=int(input("1+1="))
>>> if add!=2:
>>> print("Wrong answer, 다시 입력하세요.")
>>> else:
>>> break
>>> print("Right answer, 탈출합니다.")
만약 입력값이 2가 아니라면, Wrong answer이라는 문구와 함께 계속해서 1+1= 이라는 input함수가 실행될 것입니다. 그러다가 2를 입력하게 되면, break문이 수행될 것이므로, Loop를 탈출하게 됩니다. 동시에 while문이 끝났으므로, Right answer이라는 문구가 출력되겠죠?
즉, 미리 탈출값으로 설정한 값을 입력하지 않으면 무한으로 문장을 반복하게 됩니다.
이러한 구조를, 무한루프(Loop) 라고 합니다. 프로그램을 짤 때, 생각보다 자주 사용되는
개념이므로, 익혀두도록 합시다.

여기서 추가적으로, A가 계속 출력될 때, 터미널에 커서를 놓고, Ctrl + C 를 입력해주면, exit 하게 됩니다.
#5-2. for문
python에서 반복문 중에 매우 많이 사용되며, 잘 활용할 경우 엄청나게 유용한 문법이 있습니다. 바로 for문 입니다.
for문은 기본적으로 다음과 같은 문법 구조를 갖고 있습니다.
>>> for 변수 in 리스트(또는 튜플, 문자열)
>>> 수행할 문장
영어에서와 마찬가지로, (리스트,튜플,문자열) 안의 (변수)에 대하여 ~다. 라는 뜻으로 해석하면
직관적으로 이해하기 쉬울 것입니다.
아래에서 설명을 위해 다음 번에 다룰 내용 중, list 에 관한 내용을 간단하게 설명하겠습니다.
*** 리스트(list)
list는 [] 기호로 나타내며, 집합과 같은 느낌으로 생각하시면 됩니다. 요소들을 갖고 있는 그릇과 같은 느낌입니다. 예를 들어, 한 반에 30점, 40점, 50점인 학생이 있다면, >>> class_grade = [30, 40, 50]
이런 식으로 나타낼 수 있는 것입니다.
간단한 for문을 작성해 본다면,
>>> a_list = [30, 40, 50]
>>> for i in a_list:
>>> print(i)
이렇게 코드를 작성하면, a_list 라는 리스트 안에 있는 i 라는 변수에 대해 print 해달라는 것이고, 이는 for문을 탈출할 때까지 반복하여 수행합니다. 즉, 30, 40, 50이 모두 출력되게 됩니다.
그리고, 한 번 수행할 때마다 줄이 바뀌므로, 한 line에 하나의 변수가 출력됩니다.

잘 출력되는 것을 확인할 수 있습니다.
예문을 통해 응용해 보겠습니다.
a반에 5명의 학생이 있습니다. 이 학생들을 각각 1~5번 학생이라고 하고, 이들의 점수는 각각
50점, 70점, 90점, 80점, 30점입니다. 이때, 점수가 60점 이하인 경우 불합격, 60점 초과인 경우
합격 메시지를 출력하고자 합니다. for문을 이용하여 코드를 짜보면,
>>> a = [50, 70, 90, 80, 30]
>>> sdt_number = 0 # sdt_number 변수는 학생 번호를 의미합니다.
>>> for grade in a:
>>> sdt_number += 1
>>> if grade<=60:
>>> print("%d번 학생은 %s점으로,불합격입니다." %(sdt_number,grade))
>>> else:
>>> print("%d번 학생은 %s점으로,합격입니다." %(sdt_number,grade))
이렇게 구성하면 될 것입니다.
for문을 한 번 돌 때마다, 학생의 번호가 1씩 증가한다고 설정해놓고, grade를 범위에 따라 조건문을 구성합니다.

각 학생의 번호와 점수, 합격, 불합격이 모두 잘 출력됩니다.
while문에서 continue문을 사용한 것처럼, for문에서도 동일하게 사용이 가능합니다.
그렇다면, 합격생들에게만 축하한다고 메시지를 출력하기 위해서는 어떻게 수정해야 할까요?
>>> a = [50, 70, 90, 80, 30]
>>> sdt_number = 0
>>> for grade in a:
>>> sdt_number += 1
>>> if grade<=60:
>>> continue
>>> print("%d번 학생, %s점으로,합격입니다.축하" %(sdt_number,grade))
이렇게 구성한다면, 점수가 60점 이하 인 경우, 다시 for문의 처음으로 돌아가게 될 것이고, 조건문이 거짓이 되면 print할 것입니다.

잘 출력됩니다.
#5-3. range 함수
for문을 사용할 때, 같이 활용이 많이 되는 함수 중 하나가 range 함수입니다.
영어 뜻에서 알 수 있듯, 범위를 정해주는 함수입니다.
>>> i=range(1,11)
>>> print(i)
이렇게 범위가 지정되어 있다면, 1부터 11까지 출력되겠죠?
아닙니다. 왜냐하면, range함수의 경우, 끝 숫자는 포함하지 않습니다.
문자열 인덱싱과 슬라이싱 할 때에도 끝자리를 포함하지 않았던 것을 떠올려 보시면, 이해가 쉬울 것입니다.
그리고 시작점을 지정하지 않고, range(11)와 같은 식으로 지정하면, 0부터 10까지를 나타내게 됩니다.
range 함수와 for문을 이용하여 1부터 10까지 더하는 코드를 짜 본다면 어떻게 될까요?
>>> a=range(11)
>>> add=0
>>> for j in a:
>>> add = add + j
>>> print(add)
이렇게 코드를 짜면 될 것입니다.
add 변수는 for문을 한 번 돌릴 때마다, 중첩되어 값이 더해질 것입니다.
결과적으로 print를 해주면 모두 다 더해진 값이 출력될 것입니다.

잘 출력됩니다.
이를 활용하여, 위에서 합격 학생들에게만 문자를 보내는 프로그램을 짜 본다면,
>>> a=[50, 70, 90, 80, 30]
>>> for sdt_number in range(len(a)):
>>> if a[sdt_number]>60:
>>> print("%d번 학생,%s점으로 합격."%(sdt_number+1,a[sdt_number])
이렇게 구성할 수 있을 것입니다.
len(a)의 경우, 리스트 안의 인자의 개수를 뜻합니다. 즉, 5가 되어, range(5)가 될 것입니다.
a[0] 의 경우, a라는 리스트에서 0번째 인덱스를 뜻합니다. 문자열 인덱싱과 슬라이싱에서 배웠던 개념을 그대로 적용하면 됩니다. 즉, a[0] 이라고 한다면, 50이 되겠죠?
즉, range(5) 안에서 sdt_number라는 변수에 대해서 a 리스트 안에서 sdt_number번째 인덱스의 값이 60보다 큰 경우, 합격일 것입니다.
또한, print할 때에는, %d번 학생으로 출력할텐데, 인덱스는 0부터 시작이므로, %d를 포맷팅할 때에는 +1를 해주어야 합니다. 이렇게 출력을 해보면,

잘 출력됩니다. 여러 개념이 섞여 있는 심화 예문이므로, 두 번, 세 번 보면서 반복 학습 하시면,
도움이 될 것입니다.
댓글