🚀

5편 라이캣의 EXIT

다루고 있는 개념
반복문
난이도
Type
강의
file

1. 캣의 로봇(for)

notion imagenotion image
 
캣의 생선회사는 어느덧 위니브 월드 전체에서 가장 빠르게 성장하는 생선회사가 되었습니다. 대부분의 스타트업이 그렇듯이 성장세에 일만하다 보니 높은 연봉에도 직원들의 불만이 늘어가고 있었습니다.
"자율성과 창의적 생각이 보장되고, 개인이 성장하면서, 각자 하는 일에 대한 명료한 목적과 동기부여를 줄 수는 없을까냥?"
캣은 어느새 대표다운 생각을 하고 있었어요. 매주 아침 하는 회의에서 캣은 말했습니다.
"생산성을 극대화 하면서도, 직원들의 휴식시간을 늘려줄 수 있는 로봇을 만들어보는 것은 어떨까냥?"
하지만 이미 불만이 가득차 있는 직원들은 냉담한 반응이었습니다.
"누가 만드냥!? 대표가 만드냥!?"
캣은 더이상의 회의가 무의미하다는 생각에 회의를 종료했습니다. 그리고, 정말 혼자 만들기 시작했어요.
"밤을 새서라도 다음주까지 만들겠다냥!"

 
 
  • 라이캣의 상태창!
#[In] 이름 = '캣' 설명 = '위니브 월드에서 가장 급성장하는 생선회사 대표 캣' 나이 = 19 오늘_잡은_물고기 = '100000' 직원수 = 4 키 = '45.9cm' 몸무게 = 1.6 잡식 = True 돈 = 1100000 훈장 = ['백상아리를 잡은 고양이', '성실한 납세자', '해골섬 낚시꾼', '청년 고용 착한 기업', '회사를 설립한 자'] 기술 = ['고기잡이', '고기팔기', '낚시_Lv5', '통발_Lv5', '큰그물_Lv5']
 
 

캣은 가용한 모든 자원, 알고 있는 모든 지식을 투입하기 시작했어요. 아래 코드를 봅시다.
 
#[In] for x in (1,2,3,4,5): print(f'고등어 포장 {x}번째 입니다.')
우선 직원들이 가장 힘들어하는 고등어 포장 로봇을 만들기 시작했어요. for라는 강력한 프로그래밍 문법을 사용하였습니다.
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 고등어 포장 1번째 입니다. 고등어 포장 2번째 입니다. 고등어 포장 3번째 입니다. 고등어 포장 4번째 입니다. 고등어 포장 5번째 입니다.
위 코드처럼 정해진 횟수를 반복하는 것을 for문이라고 합니다. 코드를 조금 더 살펴보죠. x라는 변수를 선언하여 튜플 (1,2,3,4,5)의 길이만큼 for문 아래에 있는 문장을 반복하게 됩니다.
또, 변수 x 는 튜플 요소의 값을 하나씩 가지게 되죠. 조금 어렵죠? 더 자세한 설명은 다음 챕터에서 하도록 하겠습니다.

1.1 for문의 기본 구조

위에서 배운 for문의 기본 구조를 더 자세하게 정리하고 넘어가도록 하겠습니다. for문은 순서열을 순회하며 순서열의 끝에 도달하면 반복을 멈추게 됩니다. 또한 객체를 처음부터 끝까지 하나씩 추출하며 순회하기 때문에 그 사용법이 쉬워 가장 많이 사용되는 반복문 입니다.
다음 챕터에서 배울 while은 비교할 변수를 먼저 선언 해주어야 하기 때문에, 비교적 for를 더 많이 사용합니다. 하지만 각자의 용법이 있어, 어느 문법이 좋다고는 할 수 없습니다!
#[In] for x in (1,2,3): print(f'{x}번째 로봇을 뚝딱뚝딱')
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 1번째 로봇을 뚝딱뚝딱 2번째 로봇을 뚝딱뚝딱 3번째 로봇을 뚝딱뚝딱
위의 코드를 실행하면 변수 x에는 튜플(1, 2, 3)의 요소가 순서대로 출력됩니다. 위 예제에서 튜플의 길이는 3이므로 for문은 반복을 3번 수행합니다. 여기서 x는 다른 언어처럼 초기화 하지 않아도 작동합니다.
#for 문의 구조 for (변수명) in (순회 가능한 객체) : 수행할 문장1 수행할 문장2
for 문의 범위로 사용되는 것은 시퀀스 자료형 자료 또는 반복 가능한 자료형이어야 합니다.
  • 반복문 순서도(Flow Chart) - for 문
notion imagenotion image
1. String(문자열)을 범위로 지정한 예시
#[In] 왕국 = '위니브 월드' for a in 왕국 : print(a)
 
#[Out] 위 니 브 월 드
 
2. List(리스트)를 범위로 지정한 예시
#[In] 기술 = ['고기잡기', '고기팔기', '낚시_Lv1', '통발_Lv1', '큰그물_Lv1'] for a in 기술: print(a)
 
#[Out] 고기잡기 고기팔기 낚시_Lv1 통발_Lv1 큰그물_Lv1
 
3. Dictionary(사전)을 범위로 지정한 예시
#[In] 캣의_상태창 = { '이름': '캣', '설명':'위니브 월드에서 가장 급성장하는 생선회사 대표 캣', '나이':'19', '키': '45.9cm', '몸무게': 1.6 } for a in 캣의_상태창: print(a)
 
#[Out] 이름 설명 나이 키 몸무게
위의 예제에서 Dictionary(사전)형 자료의 경우에는 key(키)만을 가져오게 됩니다.
key(키)에 해당하는 value(값) 또한 가져오고 싶다면 아래와 같이 튜플 언패킹을 사용할 수 있습니다.
#[In] for key,value in 캣의_상태창.items(): print("{0} : {1}".format(key, value))
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 이름 : 캣 설명 : 위니브 월드에서 가장 급성장하는 생선회사 대표 캣 나이 : 19 키 : 45.9cm 몸무게 : 1.6
 
for문에서 가장 많이 사용되는 range에 대해 알아봅시다. range는 특정 범위를 생성하기 위해 사용할 수 있습니다.
💡
range는 2.x에서는 선언하는 즉시 list가 되었으나 3.x으로 넘어오면서 range는 list로 변환해주어야 list가 됩니다. 이는 2.x에서 썼었던 xrange와 같은 함수입니다.
 
range 함수는 연속하는 수열을 만듭니다. range(시작_값, 종료_값, 연속하는_두_수의_차)형식으로 선언되며 아래 예제를 보며 자세히 설명해 드리도록 하겠습니다.
 
💡
range(start, stop, step)으로 주요 표현합니다. 어디서 많이 보았던 형식이죠? 바로 슬라이싱에서 보았던 형식입니다.
 
시작 값 : 0, 종료 값 : 5, 연속하는 두 수의 차 : 1
#[In] for a in range(0, 5, 1): print(a)
 
#[Out] 0 1 2 3 4
 
시작값 0과 멈춤값 5 사이의 연속하는 두 수의 차 1을 가지고 있는 요소들이 생성되었습니다. 생성된 range의 마지막 요소가 멈춤값보다 한 단계 작다는 사실에 주의하세요.
 
시작 값 : 0, 종료 값 : 10, 연속하는 두 수의 차 : 2
#[In] for a in range(0, 10, 2): print(a)
 
#[Out] 0 2 4 6 8
 
시작 값 0과 종료 값 10 사이의 연속하는 두 수의 차 2를 가지고 있는 요소들이 생성되었습니다.
생성된 range의 마지막 요소가 종료 값보다 한 단계 작다는 사실에 주의하세요. range()함수의 마지막 매개변수인 연속하는 두 수의 차는 생략할 수 있습니다. 생략할 시 연속하는 두수의 차는 1입니다.
 
시작 값 : 0, 종료 값 : 5, 연속하는 두수의 차 : 생략
#[In] for a in range(0, 5): print(a)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 0 1 2 3 4
 
마지막 매개변수인 연속하는 두 수의 차를 생략하고 range()함수를 호출하였습니다. 이 경우 range()함수의 마지막 매개변수인 연속하는 두 수의 차는 1이 됩니다.
 
시작 값 : 생략, 종료 값 : 5, 연속하는 두 수의 차 : 생략
#[In] for a in range(5): print(a)
 
#[Out] 0 1 2 3 4
 
또한 range() 함수는 종료 값만을 입력하여 호출할 수 있습니다. 종료 값만 입력했을 시에는 시작값은 0이 되며 두 수의 차는 1이 됩니다.
 
시작 값 : 10, 종료 값 : 5, 연속하는 두 수의 차 : -1
#[In] for a in range(10, 5, -1): print(a)
 
#[Out] 10 9 8 7 6
 
연속하는 두 수의 차를 마이너스로 둘 수도 있습니다. 이 경우 시작 값과 종료 값 보다 크게 주셔야 한다는 점도 기억해주세요.
좀 더 알아볼까요? 얕은물에서 할 내용은 아니니 가볍게 읽고 넘어가주세요. for 문에 사용될 수 있는 시퀀스형 자료는 문자열, 리스트, 튜플이 있습니다. 이 자료형은 메서드로 __iter__와 __next__를 가지고 있으며 이 두개의 메서드로 순회가 가능하게 합니다.
이는 아래와 같이 iter()함수와 next()함수로도 실행을 할 수 있습니다.
 
#[In] listx= [100,200,300,400] strx= 'abcd' listxlter = iter(listx) strxlter= iter(strx) print(next(listxlter),next(listxlter),next(listxlter),next(listxlter)) print(next(strxlter),next(strxlter),next(strxlter),next(strxlter))
 
위 결과값은 아래와 같습니다.
 
#[Out] 100 200 300 400 a b c d
 

1.2 for, else

 
#[In] for i in range(100): print(f'{i} 물고기를 잡았습니다.') if i == 5: print('만선입니다. 물고기를 다 잡았습니다.') break else: print('아직 여유가 좀 있지만, 물고기가 더 없는 것 같으니 이정도로 만족하고 돌아갑시다.') print('수고하셨습니다.')
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 0마리의 물고기를 잡았습니다. 1마리의 물고기를 잡았습니다. 2마리의 물고기를 잡았습니다. 3마리의 물고기를 잡았습니다. 4마리의 물고기를 잡았습니다. 5마리의 물고기를 잡았습니다. 만선입니다. 물고기를 다 잡았습니다.
 
#[In] for i in range(5): print(f'{i} 물고기를 잡았습니다.') if i == 5: print('만선입니다. 물고기를 다 잡았습니다.') break else: print('아직 여유가 좀 있지만, 물고기가 더 없는 것 같으니 이정도로 만족하고 돌아갑시다.') print('수고하셨습니다.')
 
위 코드를 실행시키면 아래와 같이 출력됩니다.위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 0마리의 물고기를 잡았습니다. 1마리의 물고기를 잡았습니다. 2마리의 물고기를 잡았습니다. 3마리의 물고기를 잡았습니다. 4마리의 물고기를 잡았습니다. 아직 여유가 좀 있지만, 물고기가 더 없는 것 같으니 이정도로 만족하고 돌아갑시다. 수고하셨습니다.
 
if문 뿐만 아니라 for에서도 else를 사용할 수 있습니다. else는 루프가 정상 종료되었을 때, 처음부터 자료형이 비어있었을 때 실행됩니다. break문을 만나면 else 문을 실행하지 않고 빠져나옵니다.
 

1.3 지능형 리스트(list comprehension)

얕은물에서는 가볍게 이런 것이 있다는 것만 알고 넘어가도록 하겠습니다. 가장 많이 사용되는 list 생성 기법입니다. 'list comprehension'은 한국어로 표현할 때 리스트 표현식, 지능형 리스트로 번역이 되곤 합니다.
 
#[In] #1 x= [i for i in range(1, 10)] print(x) #2 y=['{}X{}={}'.format(i, j, i*j) for i in range(2, 10) for j in range(1, 10)] print(y) #3 def sumthingFunction(i): if i % 100 ==0: return i else: return 0 기존리스트= [100,200,300,101,202,303] 새로운리스트= [sumthingFunction(i) for i in 기존리스트] print(sum(새로운리스트))
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] #1 [1,2,3,4,5,6,7,8,9] #2 구구단 리스트 출력 #3 600
 

1.4 다중인자 리스트 순회

 
#[In] #다중 리스트 for문 skill = [ ('고기잡이', 100), ('고기팔기', 120), ('낚시', 5), ('통발', 5), ('큰그물', 5) ] for i,j in skill: print(i,j)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고기잡이 100 고기팔기 120 낚시 5 통발 5 큰그물 5
 
#[In] #하나만 리스트여도 쌍이면 상관없이 잘 돌아감 skill = [ ('고기잡이', 100, 'SS'), ('고기팔기', 120, 'SSS'), ('낚시', 5, 'C'), ('통발', 5, 'C'), ('큰그물', 5, 'C') ] for skillName, skillLevel, skillGrade in skill: print(skillName, skillLevel, skillGrade)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고기잡이 100 SS 고기팔기 120 SSS 낚시 5 C 통발 5 C 큰그물 5 C

1.5 enumerate

enumerate는 순서를 매길 때 사용합니다. 각각의 스킬들을 습득한 순서대로 출력하고 싶어요. 그럼 어떻게 출력을 해줄 수 있을까요? enumerate는 별도의 변수를 선언하지 않고 이것이 가능하게 해줍니다.
 
#[In] # enumerate skill = [ ('고기잡이', 100, 'SS'), ('고기팔기', 120, 'SSS'), ('낚시', 5, 'C'), ('통발', 5, 'C'), ('큰그물', 5, 'C') ] for i, (skillName, skillLevel, skillGrade) in enumerate(skill): print(i, skillName, skillLevel, skillGrade) for i, j in enumerate(skill, 100): print(i, j)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 0 고기잡이 100 SS 1 고기팔기 120 SSS 2 낚시 5 C 3 통발 5 C 4 큰그물 5 C 100 ('고기잡이', 100, 'SS') 101 ('고기팔기', 120, 'SSS') 102 ('낚시', 5, 'C') 103 ('통발', 5, 'C') 104 ('큰그물', 5, 'C')
 

1.6 계산하는 로봇

캣은 로봇을 이용해서 '고등어 포장' 보다 조금 더 어려운 '카운터 보기'를 맡기기로 했어요. 손님께 생선 몇 개를 구매하실 건지 여쭤보고 그 갯수에 맞는 금액을 출력할 수 있는 로봇을 만들었어요.
#[In] for i in range(5): num = int(input("고등어 몇 개를 구매하실 건가요?")) result = num * 5000 print(result,"원 입니다.") print("로봇이 종료되었습니다. 삐빅.")
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 고등어 몇 개를 구매하실 건가요? 5 25000원 입니다. 고등어 몇 개를 구매하실 건가요? 3 15000원 입니다. 고등어 몇 개를 구매하실 건가요? 19 95000원 입니다. 고등어 몇 개를 구매하실 건가요? 1 5000원 입니다. 고등어 몇 개를 구매하실 건가요? 7 35000원 입니다. 로봇이 종료되었습니다. 삐빅.
고등어를 몇 개 구매할 건지 input() 명령어를 통해 손님께 여쭤보고, 그 갯수에 가격을 곱해서 출력을 해주도록 만들었습니다.
 

 

2. 캣의 로봇(while)

 
금방 배웠던 for문을 이용해서 로봇을 만들면 정해진 숫자에서 종료되기 때문에, 생선이 더 있거나 손님이 더 있어도 로봇이 꺼지기 때문에 로봇을 다시 시작해줘야 한다는 단점이 있었어요.
그래서 캣은 while문을 활용하여 영업이 종료되거나 생선이 다 팔릴 때까지 작동을 하는 로봇을 만들기로 했습니다. 우선 간단하게 while 문을 살펴보도록 해요.
 
#[In] a = 1 while a < 10 : print(a) a += 1
while문은 조건이 참인 동안에 명령을 반복해서 수행합니다. 반복할 명령은 들여쓰기로 구분되며 조건이 거짓이면 들여쓰기로 구분되어 있는 반복 구문을 탈출합니다.
위의 예제에서 9를 출력하고 마지막 a+=1이 연산(할당연산)되면 a=10이 되어 조건이 거짓이 되므로 루프를 탈출 합니다. 다음 a의 값이 10이 된다는 것 잊지 마세요.
 
while문의 구조 while 조건문 : 수행할 문장1 수행할 문장2
 
  • 반복문 순서도(Flow Chart) - while 문
notion imagenotion image
 

2.1 무한반복 while, break

그럼 이제 생선이 다 팔리면 로봇이 종료되도록 만들어볼까요? 현재 고등어는 5개가 남았고, 고등어가 0개가 된다면 다 팔았다는 말과 함께 while문을 종료하고 싶어요.
 
#[In] fish = 5 while True: print("고등어 ", fish, "개 남았습니다.") fish -= 1 if fish == 0: print("고등어 다 팔렸습니다.") break
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고등어 5 개 남았습니다. 고등어 4 개 남았습니다. 고등어 3 개 남았습니다. 고등어 2 개 남았습니다. 고등어 1 개 남았습니다. 고등어 다 팔렸습니다.
while 문의 조건을 부분에 bool형인 True가 오게 하면 반복문은 무한 반복되게 됩니다. 무한 반복이 일어나면 프로그램이나 서비스가 죽는 사태가 발생되기 때문에 조건을 탈출할 수 있는 구문을 중간에 입력하거나 메모리 공간을 확보할 쉬는 시간을 주어야 합니다. 여기서는 break 문으로 조건을 탈출하도록 설계하였습니다.

2.2 while, else

위 예시와 똑같은 문장을 else문으로도 만들어 볼 수 있어요. 여기서 주석 처리된 부분을 풀어보시고 주석이 될 때와 되지 않을 때를 비교해보세요.
 
#[In] fish = 5 while fish > 0: print("고등어 ", fish, "개 남았습니다.") # if fish < 3: # break fish -= 1 else: print('고등어 다 팔렸습니다.')
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고등어 5 개 남았습니다. 고등어 4 개 남았습니다. 고등어 3 개 남았습니다. 고등어 2 개 남았습니다. 고등어 1 개 남았습니다. 고등어 다 팔렸습니다.
else문은 다양하게 활용(특히 if문에서)됩니다. while문에서 else는 루프가 정상 종료되었을 때와 처음부터 while의 조건문이 False일 경우 실행됩니다. 위 두번째 예제에서 a==5인 경우 break문을 만나면 else 문을 실행하지 않고 빠져나옵니다.
 

 

3. break

 
break는 흐름을 끊어 중단할 때 사용합니다. 특정 코드를 반복하고자 for, while 문을 이용하여 반복문(loop)을 만들었다면 break 문을 사용하여 반복문을 중단할 수 있습니다. 여기서 주의하셔야 할 점은 이 break 구문은 바로 위의 for나 while문만 탈출한다는 것입니다!
반복문(loop) 순회 중에 break 문을 만나면 반복문의 내부 블록을 벗어나게 됩니다. 그러나 예제 1번과 같이 어떠한 장치 없이 break를 넣으면 반복문이 반복하지 않으므로 예제 2번과 같이 주로 조건 안에 넣어 실행합니다.
 
# 예제1(while) while 조건: 반복 실행할 코드 break # while 구문을 탈출 # 예제1(for) for 변수 in 범위: break # for 반복문 탈출
 
# 예제2(while) while 조건: 반복 실행할 코드 if 조건: break # while 구문을 탈출 # 예제2(for) for 변수 in 범위: 반복 실행할 코드 if 조건 : break # for 반복문 탈출
 
  • 순서도(Flow Chart) - while, break 문
notion imagenotion image
  • 순서도(Flow Chart) - for , break 문
notion imagenotion image

3.1 break 문

#[In] 시간 = 0 현재시간 = int(input("시(hour)를 입력해주세요. ")) 종료시간 = 18 if 현재시간 < 종료시간: print('영업시간이 끝났기 때문에 영업을 종료합니다.') else: while True: 시간 += 1 현재시간 += 1 print('{}시간이 지나 {}시가 되었습니다'.format(시간,현재시간)) if 현재시간 == 종료시간: print('영업 종료시간이 되었기 때문에 영업을 종료합니다.') break
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 시(hour)를 입력해주세요. 10 1시간이 지나 11시가 되었습니다 2시간이 지나 12시가 되었습니다 3시간이 지나 13시가 되었습니다 4시간이 지나 14시가 되었습니다 5시간이 지나 15시가 되었습니다 6시간이 지나 16시가 되었습니다 7시간이 지나 17시가 되었습니다 8시간이 지나 18시가 되었습니다 영업 종료시간이 되었기 때문에 영업을 종료합니다.
 
반복문이 실행되다 시간이 지나 현재 시간과 종료 시간이 같아지는 경우 영업을 종료한다는 메시지를 출력 후 break 문을 통하여 반복문을 빠져나갑니다.
반복문을 빠져나가자 반복문이 중단되어 더 이상 실행되지 않으므로 시간이 지나가지 않습니다.
앞서 말씀드린 것처럼, 중첩 반복문에서 바로 위에 반복문만 탈출하는 경우를 살펴보도록 하겠습니다. 아래의 경우 각 단의 i X 5까지만 실행이 됩니다.
 
#[In] for i in range(2, 10): for j in range(1, 10): if j > 5: break print(f'{i} X {j} = {i*j}')
 
 

 

4. continue, pass

 
continue의 사전적 의미를 살펴보면 '계속하다'라는 뜻이 있습니다. 파이썬에서 continue문은 반복문이 실행하는 코드 블록의 나머지 부분을 실행하지 않고 다음 반복으로 건너가게 흐름을 조정합니다. pass의 사전적 의미는 '지나치다'라는 뜻이며, 파이썬에서 pass문은 단순히 실행할 코드가 없다는 것을 의미하며 아무런 동작을 하지 않고 다음 코드를 실행합니다. continue와 pass는 구분해서 사용을 해야 하니 차이점을 잘 정리해 두세요.
반복문 순회 도중 continue문을 만날 시 continue문은 이후의 나머지 반복문 내부 코드 블록을 실행하지 않고 다음 아이템을 선택하여 반복문의 내부 코드 블록 시작 부분으로 이동합니다.
break와 마찬가지로 예제1과 같이 조건이 없이 continue를 사용하는 것은 큰 의미가 없으므로 주로 예제2처럼 조건문을 달아 사용합니다.
 
# 예제1(while) while 조건: 반복 실행할 코드 continue #while 다음 반복문 수행 반복 실행할 코드 # continue 사용시 무시되는 코드 # 예제2(for) for 변수 in 범위: 반복 실행할 코드 continue #for 다음 반복문 수행 반복 실행할 코드 # continue 사용시 무시되는 코드
 
# 예제1(while) while 조건: 반복 실행할 코드 if 조건 : continue #while 다음 반복문 수행 반복 실행할 코드 # continue 사용시 무시되는 코드 # 예제2(for) for 변수 in 범위: 반복 실행할 코드 if 조건: continue # for 다음 반복문 수행 반복 실행할 코드 # continue 사용시 무시되는 코드
 
  • 순서도(Flow Chart) - while, continue 문
 
notion imagenotion image
  • 순서도(Flow Chart) - for, continue 문
notion imagenotion image
 
#[In] #continue 구매개수_총가격= [ (3, 15000), (5, 25000), (1, 5000), (8, 40000), (0, 0), (2, 10000) ] for 구매개수, 총가격 in 구매개수_총가격: if 구매개수 < 1: continue print('구매개수는 {}개이며 {}원입니다.'.format(구매개수, 총가격))
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 구매개수는 3개이며 15000원입니다. 구매개수는 5개이며 25000원입니다. 구매개수는 1개이며 5000원입니다. 구매개수는 8개이며 40000원입니다. 구매개수는 2개이며 10000원입니다.
 
1개도 구매하지 않았을 경우 if의 조건이 참(True)이 되어 continue문을 실행합니다.
따라서 나머지 코드블록인 구매개수와 가격을 출력해주는 print문을 실행하지않고 다시 for 반복문의 내부 코드블록 시작부분으로 돌아갑니다.
여기서 continue라고 되어 있는 부분을 pass로 바꾸면 수험번호 1005번의 58점도 출력하는 것을 볼 수 있습니다. 반복 중간에 continue를 만나면 다음 반복으로 넘어가지만 pass를 만나면 그 라인만 지나치고 아래 문장을 그대로 실행합니다.
 
#[In] #pass 구매개수_총가격= [ (3, 15000), (5, 25000), (1, 5000), (8, 40000), (0, 0), (2, 10000) ] for 구매개수, 총가격 in 구매개수_총가격: if 구매개수 < 1: pass print('구매개수는 {}개이며 {}원입니다.'.format(구매개수, 총가격))
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 구매개수는 3개이며 15000원입니다. 구매개수는 5개이며 25000원입니다. 구매개수는 1개이며 5000원입니다. 구매개수는 8개이며 40000원입니다. 구매개수는 0개이며 0원입니다. 구매개수는 2개이며 10000원입니다.
 
 

 

5. else

 
앞서 살펴본 것처럼 Python에서는 while, for 문에서도 else문을 사용할 수 있습니다. 여기서의 else는 if에서의 else처럼 '그렇지 않으면'이라는 의미 보다는 '그런 다음'이라는 의미가 더 강하기 때문에 than으로 쓰여야 된다는 논의가 있기도 했습니다.
  • else문 순서도(Flow Chart) - while문
notion imagenotion image
  • else문 순서도(Flow Chart) -for문
notion imagenotion image
반복문이 break 등에 의해 중단없이 정상적으로 반복이 종료된 후 특정 코드를 실행하게 해야할 때 while~else, for~else를 사용할 수 있습니다.
 
while 조건: 반복 실행할 코드 else: while 반복문이 모두 실행되어 종료되고 실행할 코드
 
for 변수 in 범위: 반복 실행할 코드 else: for 반복문이 모두 실행되어 종료되고 실행할 코드
 
 
#[In] #for, else문 for i in range(5, 0, -1): print("고등어 ", i, " 개 남았습니다.") else: print('고등어 다 팔렸습니다.')
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고등어 5개 남았습니다. 고등어 4개 남았습니다. 고등어 3개 남았습니다. 고등어 2개 남았습니다. 고등어 1개 남았습니다. 고등어 다 팔렸습니다.
 
 
#[In] #break문이 있을 때 for i in range(5, 0, -1): print("고등어 ", i, " 개 남았습니다.") if i == 1: break else: print('고등어 다 팔렸습니다.')
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 고등어 5개 남았습니다. 고등어 4개 남았습니다. 고등어 3개 남았습니다. 고등어 2개 남았습니다. 고등어 1개 남았습니다.
 
위 코드에서 1번 예제처럼 break문 없이 정상 종료되었을 때에는 else문이 실행됩니다. 그러나 2번 예제처럼 break문이 있을 경우에는 else문을 실행하지 않게 됩니다.
if문에서 else는 '그렇지 않으면'이라는 의미로 조건이 거짓일 때 쓰입니다.
 
if 조건: 조건이 참일 경우 실행문 else: 조건이 거짓 일 경우 실행문
 
#[In] i = 2 if i < 4: print('i는 4보다 작습니다') else: print("i는 4보다 크거나 같습니다")
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] i는 4보다 작습니다
try~except~else문에서 else는 예외가 발생하지 않을 때 쓰입니다.
 
try: 실행문 except: 예외 발생 시 처리문 else: 예외 발생하지 않을 경우 실행문
 
#[In] try: i = 1 j = 1 x = i/j except: print("error") else: print(x)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] 1.0
 
 

 

6. 중첩 반복문

 
반복문 내부에 또 다른 반복문이 있을 경우, 중첩되었다고 얘기합니다. 중첩 반복문이란 반복문 안에 반복문이 들어가 중첩된 것을 얘기합니다. 중첩 반복문에서는 종료되는 값을 항상 확인하세요.
#[In] i = 2 while i < 10 : k = 1 while k < 10: print(i, " * ", k, " = ", i * k) k += 1 i += 1
위 코드를 실행시키면 아래와 같이 출력됩니다.
#[Out] 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 3 * 1 = 3 ... ... ... 9 * 5 = 45 9 * 6 = 54 9 * 7 = 63 9 * 8 = 72 9 * 9 = 81
 
구구단은 2단부터 시작하기에 변수 i를 2로 설정해줍니다. 9단을 수행한 후 종료할 수 있도록 10미만이라는 조건을 설정해주었습니다. i는 구구단의 단을, k는 순차적으로 반복될 곱의 수이며 while문을 하나 더 이용하여 반복될 곱의 수를 1씩 순차적으로 더해주었습니다.
여기서 중요한 것은 종료되는 값입니다. k가 10이 된 상태로 안에 반복문이 종료되기 때문에 3단을 하기 위해서는 다시 k를 1로 초기화 시켜주어야 합니다.
for문과 range 함수를 이용하면 좀 더 간단하게 구구단을 출력할 수 있습니다.
 
#[In] for i in range(2,10): print("---{0}단---".format(i)) for k in range(1,10): print(i,"*",k,"=",i*k)
 
위 코드를 실행시키면 아래와 같이 출력됩니다.
 
#[Out] ---2단--- 2 * 1 = 2 2 * 2 = 4 2 * 3 = 6 2 * 4 = 8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 ---3단--- 3 * 1 = 3 3 * 2 = 6 ... ... 중략
 
for문을 중첩 사용하면 좀 더 간결하고 직관적인 코드를 작성할 수 있습니다.
첫 번째 for문에서 range 함수를 이용하여 2단부터 10단까지 차례로 i에 대입됩니다. 두 번째 for문에서 곱해지는 수를 k에 넣고 구구단을 출력하고 있습니다.
while과 달리 k의 값이 for문 안에서 자동으로 초기화가 되기 때문에 while문처럼 k=1을 두 번째 for문 위에 넣을 필요는 없습니다.
퀴즈! 생선의 종류는 고등어, 연어, 숭어가 있습니다. 고등어는 5천원, 연어는 8천원, 숭어는 3천원입니다. 모든 손님들은 3가지 종류의 생선을 모두 구매할 예정입니다. 5명의 손님께 구매할 생선들의 갯수를 각각 물어본 뒤, 맨 마지막엔 계산한 총 금액을 출력해주세요. (문제가 어려우니 반드시 여러번 생각한 후 풀어보세요. - 힌트 : list를 사용해보세요)
#정답입니다. sum = 0 fish_name = ['고등어','연어','숭어'] fish_price = [5000, 8000, 3000] for i in range(5): for i in range(3): fish_num = int(input(fish_name[i] + " 몇 개를 구매하실 건가요?")) sum += (fish_num * fish_price[i]) print(sum,"원 입니다.")
#퀴즈 - 출력해야 하는 값 입니다. 고등어 몇 개를 구매하실 건가요?3 연어 몇 개를 구매하실 건가요?4 숭어 몇 개를 구매하실 건가요?2 53000 원 입니다. 고등어 몇 개를 구매하실 건가요?1 연어 몇 개를 구매하실 건가요?2 숭어 몇 개를 구매하실 건가요?3 83000 원 입니다. ... 중략