○ if 문
아래에서 a 값을 화면에 출력하는 (가) 명령어는 무조건적(unconditional) 으로 실행되는 명령어이다.
여기서, (가) 명령어를 특정한 상황 또는 조건(condition) 에서만 실행되도록 수정해 보자. 예를 들어, a 값이 10보다 작을 때에만, print(a) 가 실행되도록 바꾸어 보면 아래와 같이 된다.
if (조건식) 구문을 추가하여 print(a) 명령어가 실행되는 조건을 표시하였다. 여기서 (조건식) 을 연산하여 참(True) 이 될 때에만 print(a) 명령어가 실행되어 a 값이 화면에 출력된다.
위의 코드에서 a 값을 15로 바꾸면 어떻게 될까? 그러면 if 문의 (조건식)은 15<10 으로 평가되어 거짓(False)이 된다. 그러면 그 조건이 걸려 있는 문장(들)은 실행되지 않는다. 왜? 그 문장들은 if 의 조건식이 참이 될 때에 만 실행되는 것으로 정의되어 있기 때문이다.
파이썬에서 if 문을 사용함에 있어서 유의해야 할 사항들을 정리하면 다음과 같다.
(1) (조건식)은 비교연산 또는 논리연산의 형태로, 참(True) 또는 거짓(False) 값으로 결정될 수 있는 수식이어야 한다. 예를 들어, 5>3 이란 조건은 항상 참이 되는 조건식이 된다. 또 다른 예로, a<10 란 조건은 a 값이 10보다 작은 수일 때에는 참이 되고, 그렇지 않을 때에는 거짓이 되는 조건식이 된다. 즉, a 값이 무엇인지에 따라 조건식이 참이 되기도 하고 거짓이 되기도 한다.
(2) if 문의 조건식은 괄호로 묶어도 되고, 괄호를 사용하지 않아도 된다.
(3) (조건식)이 True 일 때 실행되는 명령어들은 if 문의 위치보다 오른쪽으로 들여쓰기 (indent) 되어야 한다. ipython이나 주피터 노트북의 경우는 콜른을 쓰고 엔터키를 누르면 자동적으로 들여쓰기가 이루어진다. 자동적으로 들여쓰기가 이루어지지 않은 경우에는 보통 [TAB]키를 누르거나 4개의 [SPACE] 키로 들여쓰기해야 한다.
(4) if 문의 (조건식) 뒤에는 반드시 콜른(colon, : )을 적어야 한다. if (조건식) 문장은 if ~ then~ 의 형태가 된다. "if 바로 뒤에 정의된 (조건식)을 평가하여 True가 되면 then 뒤에 정의된 명령(들)을 실행하라"는 뜻이다. 여기서, 콜른의 의미는then 의 의미로 보면 된다. * 파이썬의 콜른의 의미는 C 또는 자바에서 중괄호 ({ })의 역할과 똑같다.
만약에 then 에 포함되는 문장이 2개 이상인 경우에는 어떻게 해야 할까? 이 때에는 해당하는 문장들을 모두 동일하게 들여쓰기 하면 된다. 예를 들어서, 아래의 In[6]에서 2개의 print( ) 문은 if 조건에 종속되어 있다. 즉, 조건식이 참이 되면 2개의 print( ) 문이 실행되어 그림과 같은 결과를 나타내게 된다.
하지만, 아래 코드와 같이 들여쓰기를 조정하게 되면, 두 번째 print 문장인 (나) 문장은 if 조건식에 종속되지 않게 된다.
위에서 In[6]과 In[5]의 실행 결과는 동일하게 나타나고 있으나, In[6]의 (나) 문장은 조건이 있는 문장이나 In[5]의 (나) 문장은 무조건적으로 실행되는 문장이다. 참고로, a 값을 조정하여 (조건식)이 False 가 되는 아래 코드의 결과를 비교해 보자.
○ if~else 구문
다음의 [문제]에 해당되는 파이썬 코드를 만들어 보자
[문제 1] 사용자가 어떤 임의의 값을 입력한다. 만약에 그 값이 10보다 크면 “greater than 10”문장을 화면에 출력하고, 만약에 그 값이 10보다 작거나 같으면 “less than or equal to 10”문장을 화면에 출력한다.
위 [문제]에 해당하는 파이썬 코드는 다음과 같다.
코드의 실행을 살펴 보면 #1에서, 사용자로부터 어떤 숫자를 입력받고, 그 값을 a 라고 부른다. #2에서, a 값이 문자열 값이므로 정수값으로 형 변환을 한다. 형변환된 값을 b 라고 한다. #3 명령어는 'greater than 10'이라는 문자열을 화면에 출력하는 명령어인데, 조건이 붙어 있다. 즉, b 값이 10보다 클 경우에만 실행되게 된다. #4 문장도 조건이 달려 있다. 즉, b 값이 10보다 작거나 같을 때에만 실행된다. 그래서 실제로 #4 문장에 if 조건문이 매달려 있다.
그런데 여기서 이 2개의 조건식들은, 아래 그림에서와 같이, 서로 배타적(exclusive) 이다.
그래서, 동시에 참이 되거나, 동시에 거짓이 되는 경우는 없다. 즉, #(가) 조건이 True이면 #(나) 조건은 '무조건' False가 되고, #(가) 조건이 False이면 #(나) 조건은 '무조건' True이 된다. 즉, #(나)의 조건식의 값은 항상 #(가) 조건식의 값에 따라 결정되기 때문에, 실제적으로 #(나)의 조건식은 불필요하다.
사실, 위의 [문제]는 다음과 같이 바꾸어 쓸 수 있다.
[문제 2] 사용자가 어떤 임의의 값을 입력한다. 만약에 그 값이 10보다 크면 “greater than 10”문장을 화면에 출력하고, 그렇지 않으면 “less than or equal to 10”문장을 화면에 출력한다.
여기서 “그렇지 않으면”에 해당하는 파이썬 키워드가 있다. 그 키워드는 else이다. 실제 else 를 사용하여 위의 코드를 수정해 보면 다음과 같다.
코딩한 후에 실제 실행해 보면, 원래 문제의 코드와 정확히 동일하게 작동하는 것을 확인할 수 있을 것이다. 그럼 둘 중에 아무 것이나 사용해도 되는가? 그렇지 않다. if~else 구조를 갖는 문제의 경우는 반드시 if~else 의 형태로 코딩해 주어야 한다. 왜 꼭 그래야 하는가? 그 이유를 살펴보면 다음과 같다.
[비교연산의 개수가 적을수록 좋은 코드가 된다] 우리가 이전에서 살펴본 바와 같이 가장 기본적인 연산으로는 사칙연산과 비교 연산이 있다. 하나의 사칙연산과 하나의 비교연산의 실행속도를 살펴보면, 일반 사칙연산의 속도에 비해 비교연산의 실행속도가 상대적으로 느림을 확인할 수 있다. 비교 연산에는 컴퓨터가 계산하기 힘들어하는 판단(decision) 이라는 과정이 포함되기 때문이다. 우리가 연습하고 있는 코드의 경우는 짧아서 차이가 드러나지 않으나, 규모가 큰 소프트웨어를 만들게 되면 속도가 매우 중요한 요인이 된다.
위의 문제는 조건식의 변수가 2개 영역으로 나누어 지는 경우인데 비해, 조건식의 구간이 3개 이상으로 나누어지는 경우에는 어떻게 될까? 다음의 if~ elif~ else 에서 해답을 찾아보자
○ if~elif~else 구문
이런 형태의 문제에 매우 자주 나오는 문제는 아래와 같이 학점을 구하는 문제이다. 먼저, 문제를 살펴보자.
[문제] 0점에서 100점 사이의 값을 갖는 점수값을 입력하면 그 값에 따라 학점을 계산해 주는 코드를 만들고자 한다. 입력된 점수값이 90점 이상이면 A 학점, 80 이상 90 미만이면 B 학점, 70 이상 80 미만이면 C 학점, 60 이상 70 미만이면 D 학점, 60 미만이면 F 학점이 된다.
점수를 score 라고 하고, 학점을 grade 라는 변수로 사용해 보자. 점수 변수의 값은 0부터 100까지의 구간이고, 그 구간은 총 5개의 구간으로 나뉘어져 있다. 즉, 90<=score<=100, 80<=socre<90, 70<=socre<80, 60<=socre<70, 그리고 0<=socre<70.
5개 구간으로 나뉘어져 있는 문제를 2개 구간으로 쪼개어 볼 수 있다.
그리고, 이에 대한 파이썬 코드는 아래와 같다. 이 코드는 아직 완벽하지는 않으나, 최소한 A 학점인 경우는 틀림없이 구해낼 수 있다. 단, B, C, D, F 학점에 해당하는 경우가 else 구문 하나에 뭉뚱그려져 있을 뿐이다.
조금 더 개선해 보자. 아래의 코드는 바로 위 코드 보다는 조금 개선이 되서, 이제 B 학점 까지는 추려낼 수 있다.
위 코드에서 #2의 else 구문이 실행이 된다는 것은 #1에서 if 문의 조건이 False 라는 뜻이니 일단 score 값은 90 미만이 된다. #2의 조건은, 이렇게 90 미만인 값 중에서, 80 이상인 경우에 해당하는 조건으로 결국 80<=score<90 에 해당하게 된다. 자 이제 전체 5개의 조건 중에서 90<=score<=100, 80<=socre<90 등의 2개 조건을 추려낼 수 있게 되었다. 아직도 완전하지는 않은 것이 C, D, F는 여전히 #3의 else 구문으로 뭉뚱그려져 있다.
또 조금 더 개선해 보자. 이제는 C 학점 까지는 추려낼 수 있다.
이제 그만 하자. 무슨 스토리로 흘러가는지 뻔히 보이리라 믿는다. 보이려고 했던 전체 코드를 보여 보겠다. 여러분들의 예상과 같았으면 좋겠다.
실제로 잘 동작하는 코드이다. 이 코드를 가만히 보면 아래 그림과 같이 "else: if" 가 반복되는 것을 볼 수 있다.
파이썬에서는 이 부분을 elif (else if 라는 의미) 키워드로 바꿀 수 있다. 바꿔진 코드를 보이면 아래와 같다 (#상상력을 조금 발휘해 보기 바람). 이러한 형태의 if 구문을 if~elif~else 구조라고 설명한다. 하지만, 결국은 if~else에서 만들어 졌음을 이해해야 한다. (# 개인적으로, elif 는 꼭 필요한 경우가 아니라면 사용하지 않았으면 한다.)
마지막으로 사족을 단다면... 여러 경우의 수로 나누어 지는 문제들도, 결국은 2개의 조건으로 나눠 볼 수 있다. 하나가 if 가 되면, 나머지 하나는 else 가 된다. 물론, if 문에 해당하는 조건을 또 2개로 쪼개면 전체 경우의 수는 3개가 되는 것이고, else 까지도 2개의 경우로 나누면 전체적으로 4가지 경우를 표현할 수 있게 되는 것이다. 이와 같은 과정을 계속 반복한다면 아무리 복잡한 경우도 쉽고 단순하게 만들어 낼 수 있다.
항상 2가지 경우로 나누라. 그게 훨씬 쉽다. 세상에 2가지 경우 보다 단순한 경우는 없다.
'파이썬 (python)' 카테고리의 다른 글
[python 11] 변수에 대한 리뷰 (0) | 2020.02.25 |
---|---|
[python 10] 반복을 위한 for, while (0) | 2020.02.25 |
[python 8] 컨트롤 구조 control structure (0) | 2020.02.20 |
[python 7] 파이썬 내장함수 built-in function (0) | 2020.02.20 |
[python 6] 데이터와 연산 (0) | 2020.02.19 |