지금까지 만들어온 소프트웨어를 살펴보면, 프로그램의 실행과 함께, 위에서 아래로 모든 줄을 하나 하나 실행하면서 내려갑니다.
하지만, 조금만 관심을 기울이면 뭔가 아쉬운 부분이 많습니다.
구구단인데 1~9외의 숫자를 사용자가 입력하면 에러이므로 다시 입력하라고도 하고 싶고,
주민등록번호도 입력 받은 값을 보고 1900년대 사람인지 아니면 2000년대 사람인지 바로 알수만 있어도 좀 더 고급진 소프트웨어 개발이 가능할 겁니다.
이런 아쉬운 부분을 해결해 주는 기능이 "조건문" 입니다.
본 수업에서는 어떻게 조건에 따라 프로그램이 다르게 동작할 수 있는지를 공부합니다.
if
와 else
의 문법 이해하기¶Python을 포함한 대부분의 프로그래밍 언어는 조건문(conditional statement)이있으며, 심지어 대부분 문법이 비슷합니다.
조건문은 "만약 ~ 하다면, ~ 한다"라는 의미인, 영어의 if
문법이 갖는 의미와 거의 동일합니다.
그러면 Python의 조건문 문법을 먼저 살펴보도록 합니다.
이미 우리는 상당히 많은 Python의 문법을 이해하고 있으므로, 바로 실제 동작하는 Python 코드를 보도록 합니다.
바로 우리가 구구단에서 봤었던, 사용자로부터 단수를 입력 받는 과정으로, 1~9의 숫자가 아니면 에러 메시지를 보여주도록 합니다.
아래의 입력창에, 다음의 코드를 입력하고 실행하여 어떻게 동작하는지 경험해 봅니다.
userInput = input(prompt="Enter integet (1..9): ")
userInput = int(userInput)
if (userInput >= 1) and (userInput <=9) : # Grammar.1
print("Your input is " + str(userInput))
print("Right input and execute program.")
else: # Grammar.2
print("Your input is " + str(userInput))
print("Wrong input and terminate program.")
userInput = input(prompt="Enter integet (1..9): ")
userInput = int(userInput)
if (userInput >= 1) and (userInput <=9) : # Grammar.1
print("Your input is " + str(userInput))
print("Right input and execute program.")
else: # Grammar.2
print("Your input is " + str(userInput))
print("Wrong input and terminate program.")
Enter integet (1..9): 8 Your input is 8 Right input and execute program.
그러면, 앞서 실행한 프로그램에서 새롭게 등장한 문법을 이해해 봅니다.
사실 새로운 문법은 단지 2곳에서 나타납니다.
첫번째, # Grammar.1
으로 명시된 부분으로서, if _condition_ :
의 형태임을 볼수 있습니다.
그리고 다음줄은 줄의 시작에서 4칸이 들어가 있는 것(인덴트, indent)을 볼 수 있습니다.
이렇게 인덴트를 주는 것은 앞서 우리가 공부한 내용 중에 함수 부분에서 있었습니다.
즉, 함수에서 함수에 속한 문장들은 함수를 선언하는 최초의 def
문장 다음에 2칸 혹은 4칸 공백을 두거나 혹은 Tab
으로 시작한 것을 보았습니다.
조건문에서도 같은 의미라고 이해하면 됩니다.
print("Right input and execute program.")
문장은 if
문장의 줄에 종속적인 문장들입니다.
그러면, if
문장은 무슨 의미일까요?
if (userInput >= 1) and (userInput <=9) :
문장을 살펴보면 사실 if
라는 글자와 :
기호 사이에 자주 봤던 문장들이 있습니다.
Boolean 데이터 타입에서 봤던 것으로, 의미를 말로 하자면 (userInput이 1보다 크거나 같고, 또한 9보다 작거나 같다)
는 의미입니다.
결국 이 문장은 True
혹은 False
를 결과값으로 돌려주게 됩니다.
그렇다면 우리는 이제 if
로 시작해서 :
로 끝다는 문장의 의미를 유추할 수 있습니다.
즉, if _condition_ :
구문은 _condition_
이 True
이면 :
이후에 인덴트가 들어가 있는 문장들을 수행하라는 의미입니다.
만약 조건이 맞지 않으면 어떻게 해야 하나요?
이를 위해서 else:
구문이 존재합니다.
if _condition_ :
구문이 True
가 아니라면, 바로 else:
구문에 종속한 문장들을 수행하게 됩니다.
elif
의 문법 이해하기¶세상에 조건이 왼쪽과 오른쪽, 즉 두개의 선택만으로 이루어 지지는 않습니다.
예를 들어 화학에서 산도를 측정하여 특성을 정의할 때는 다음과 같은 여러 레벨을 보고 판단하게 됩니다.
표는 예를 위한 것이지, 정확한 표가 아니니 참조하기 바랍니다.
pH level | Solution Category |
---|---|
0 - 4 | Strong acid |
5 - 6 | Weak acid |
7 | Neutral |
8 - 9 | Weak base |
10 - 14 | Strong base |
그러면 사용자로부터 산도를 키보드로 부터 입력 받으후, 이 다섯 중 하나를 선택하는 프로그램은 어떻게 만들수 있을까요?
먼저 if 구문만으로 만든다면 다음 처럼 만드는 것이 가능합니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
if (phInput >= 5) and (phInput <=6):
print("Weak acid")
if (phInput == 7):
print("Neutral")
if (phInput >= 8) and (phInput <=9):
print("Weak base")
if (phInput >= 10) and (phInput <=14):
print("Strong base")
아래의 입력창에, 코드를 입력하고 실행하여 어떻게 동작하는지 직접 경험해 봅니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
if (phInput >= 5) and (phInput <=6):
print("Weak acid")
if (phInput == 7):
print("Neutral")
if (phInput >= 8) and (phInput <=9):
print("Weak base")
if (phInput >= 10) and (phInput <=14):
print("Strong base")
Enter the pH level (integer, 0...14): 7 Neutral
그런데, 이 프로그램을 자세히 바라보면 이런 생각이 듭니다.
첫번째 조건문에 맞으면 화면에 출력을 할텐데, 그럼에도 다음 조건문들을 모두 비교해야 할테고, 이러면서 시간도 버리고 컴퓨터도 쓸데없는 일을 한다는...
이런 생각은 맞습니다 - 결국 컴퓨터는 조건에 맞는 경우 해당 조건의 작업만 하면 되는데, 지금은 모든 if 구문을 수행하느라 시간과 자원을 낭비합니다.
이럴때 사용하는 문장이 elif
문법입니다.
사실 elif
는 줄임말이며 풀어서 쓰면 else-if 라는 의미입니다.
앞서 조건문이 맞지 않아서 else 구문에 온 상태이므로, 다시 한번 조건을 검사해 보자는 의미인 것입니다.
그렇다면, if
구문 만으로 작성한 위의 프로그램을 elif
로 바꾸면 어떻게 되는지 아래의 변경된 코드를 살펴봅니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
elif (phInput >= 5) and (phInput <=6):
print("Weak acid")
elif (phInput == 7):
print("Neutral")
elif (phInput >= 8) and (phInput <=9):
print("Weak base")
elif (phInput >= 10) and (phInput <=14):
print("Strong base")
else:
print("Not matched")
아래의 입력창에, 코드를 입력하고 실행하여 어떻게 동작하는지 직접 경험해 봅니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
elif (phInput >= 5) and (phInput <=6):
print("Weak acid")
elif (phInput == 7):
print("Neutral")
elif (phInput >= 8) and (phInput <=9):
print("Weak base")
elif (phInput >= 10) and (phInput <=14):
print("Strong base")
else:
print("Not matched")
Enter the pH level (integer, 0...14): 1 Strong acid
위의 개선된 프로그램에서 볼 수 있듯이, 이제는 앞의 조건에 부합하면 뒤의 조건은 검사를 하지 않으므로 프로그램이 효율적으로 동작합니다.
더불어 잘못된 입력에 대한 처리도 else
구문을 활용해서 처리할 수 있게 되어 안정성도 좋아졌습니다.
그런데 자세히 보니 아직 불만적인 부분이 있습니다.
새롭게 추가된 else
구문의 경우, 잘못된 값은 언제나 5번의 조건 검사를 모두 거치게 됩니다.
어떻게 하면 이런 불합리점을 다시 개선할수 있을까요?
앞서 프로그램의 문제점은 잘못된 입력을 사용자가 주는 경우가 성능 면에서 가장 많은 시간과 자원을 사용한다는 점입니다.
여기서의 개선 포인트는 의미있는 값이 0이상이고 14이하인 값이라는 점입니다.
따라서 사용자가 입력값을 주면 일단 의미가 있는 값인지, 아니면 에러 처리 할지를 미리 하는 것입니다.
이런 경우는 어떻게 해야할까요?
새로운 문법은 필요 없으며, 이미 배운 문법을 사용하면 되는데, 이를 중첩된(Nested) 조건문이라고 합니다.
바로 조건문 안에 조건문을 넣는 방법입니다.
실제 위의 프로그램을 중첩된 조건문을 사용하여 개선하면 다음과 같습니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <= 14):
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
elif (phInput >= 5) and (phInput <=6):
print("Weak acid")
elif (phInput == 7):
print("Neutral")
elif (phInput >= 8) and (phInput <=9):
print("Weak base")
elif (phInput >= 10) and (phInput <=14):
print("Strong base")
else:
print("Not matched")
아래의 입력창에, 코드를 입력하고 실행하여 어떻게 동작하는지 직접 경험해 봅니다.
phInput = int(input("Enter the pH level (integer, 0...14): "))
if (phInput >= 0) and (phInput <= 14):
if (phInput >= 0) and (phInput <=4):
print("Strong acid")
elif (phInput >= 5) and (phInput <=6):
print("Weak acid")
elif (phInput == 7):
print("Neutral")
elif (phInput >= 8) and (phInput <=9):
print("Weak base")
elif (phInput >= 10) and (phInput <=14):
print("Strong base")
else:
print("Not matched")
Enter the pH level (integer, 0...14): 1 Strong acid
재귀함수란 자기자신을 호출하는 함수를 말합니다. 때로 함수를 짤때 조건문과 재귀함수기법을 이용해서 간단하고 빠른 함수를 만들수도 있습니다.
factorial이라는건 수학에서 4! 이런식으로 표기되며 4! = 4x3x2x1=24 식으로 계산됩니다
def factorial(n):
if n>=2:
return n*factorial(n-1)
if n==1:
return n
위의함수를 만들어보고 테스트해봅니다.
factorial(3)
factorial(4)
factorial(5)
factorial(6)
720
사용자로부터 정수 하나를 입력 받아서, 짝수이면 "Even number"
를 출력하고 홀수이면 "Odd number"
를 출력하는 프로그램을 만들어 봅니다.
이를 위하여 decideNumber()
함수를 만들며, 함수의 입력은 사용자로부터 입력받은 숫자를 전달하고, 함수의 출력으로 위의 문자열을 돌려주도록 합니다.
그러면 아래 입력창에 이 프로그램을 만들고 실행하여, 숫자를 입력받고, 화면에 결과가 나타나도록 만들어 봅니다.
def decideNumber(input_value):
if input_value%2==0:
return "Even number"
else:
return "Odd number"
decideNumber(23)
'Odd number'
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, decideNumber()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert decideNumber(23) == "Odd number"
assert decideNumber(22) == "Even number"
사용자로부터 두개의 정수를 입력 받아서, 둘 중 큰 값을 화면에 출력하는 프로그램을 만들어 봅니다.
이를 위하여 decideLarger()
함수를 만들어서, 사용자가 입력한 두 개의 숫자를 입력 파라메타로 전달받고, 이 중 큰 값을 결과값으로 return 합니다.
decideLarger()
함수 내부에서는, 입력 파라메타의 두 수 중 큰 수를 판단할 떄 if-else
구문을 사용하여 구현해야 합니다.
이 프로그램은, 만약 두 수가 같은 수라면, 화면에는 두 수가 같다는 메세지를 출력해야 합니다.
그러면 아래 입력창에 이 프로그램을 만들고 실행해 보도록 합니다.
def decideLarger(input_1,input_2):
if input_1>input_2:
return input_1
else:
return input_2
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, decideLarger()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert decideLarger(20,10) == 20
assert decideLarger(-20,10) == 10
사용자로부터 문자열 하나와 글자 하나를 입력 받아서, 해당 문자열에 해당 글자가 몇개나 포함되는지를 세는 프로그램을 만들어 봅니다.
이를 위해서 사용자가 입력한 문자열을 첫번째 입력 파라메타로 받고, 사용자가 입력한 타깃이 되는 문자를 두번째 입력 파라메타로 받아서,
해당 문자열에 타깃 글자가 몇개 포함되어 있는지를 return하는 함수인 calcCharacterFromString()
함수를 작성 합니다.
만약 문자열에 타깃 글자가 있다면 갯수를 출력하고, 그렇지 않다면 에러 메시지를 화면에 출력합니다.
참고로 Python은 문자열에서 어떤 문자가 몇개 인지를 카운팅하는 기능을 미리 제공하며, 이의 수행 예제는 다음과 같습니다.
sentence = 'Mary had a little lamb'
numChs = sentence.count('a')
그러면 아래 입력창에 이 프로그램을 만들고 실행해 보도록 합니다.
def calcCharacterFromString(sentence,string):
return sentence.count(string)
[자가진단] 본인이 만든 LAB 프로그램이 제대로 동작하는지 확인합니다.
아래의 입력창을 수정하지 않고, 그대로 실행해서, 아래와 동일하게 나온다면 제대로 작성한 것입니다.
만약 그렇지 않다면, calcCharacterFromString()
함수를 수정하여 에러가 없도록 다시 작성합니다.
assert calcCharacterFromString("You only live once", 'a') == 0
assert calcCharacterFromString("You only live once", 'o') == 3
assert calcCharacterFromString("You only live once", 'Y') == 1
Step_09_Method_and_Class (0) | 2021.05.26 |
---|---|
Step_08_Module (0) | 2021.05.23 |
Step_06_Boolean (0) | 2021.05.18 |
Step_05_String (0) | 2021.05.15 |
Step_04_Functions_Part_2 (0) | 2021.05.13 |
댓글 영역