study

[파이썬] 10강 함수 출력, 독스트링(docstrings), 재귀함수

kmk_sweetlife 2024. 4. 6. 22:41
반응형

10강 강의 요약

 점점 초급 레벨을 떼기 위한 준비가 시작되는 것 같다. 1강~9강에서 배웠던 다양한 개념들이 꾸준히 조금씩 반복해서 등장하지만, 약간 더 심화된 버전으로 내용을 확장해 나가고 있다. 나는 아직 준비가 안됐는데 큰일이다. 오늘은 내가 작성한 코드에 대해 설명을 덧붙이는 '독스트링(Docstrings)에 대해 간단하게 배웠고, 함수의 반환(Return)개념에 대해 본격적으로 익히기 시작했다. 그리고 마지막으로 함수 안에서 함수 그 자신를 호출하는 재귀함수(Recursive Function)에 대해 배웠다. 

 

 

독스트링(Docstrings)

기본적으로는 '작은 문서를 만드는 방법'이라고 볼 수 있다. 함수 또는 기타 코드블록으로 코드를 작성할때 적용할 수 있다. 

length = len()

예를 들면, 이미 정의해둔 함수를 입력했을때 자동으로 작은 말풍선 형태의 문서가 열리며 해당 함수가 어떤 역할을 하는지 알려준다. 

우리가 입력하는 함수에 관한 문서를 만드는 방법이 바로 독스트링을 활용해서 가능한 것이다. 아래 미리 만들어둔 예시를 참고하면 이해하기 쉽다.  

 

format_name이라는 함수에 대한 설명을 작성해봄

 

독스트링은 선언(def format_name 바로 아래줄) 뒤에 이어지는 첫번째 열의 코드가 해당한다. 위 이미지에서 보듯이 반드시 세개의 따옴표를 사용해야 하며 그 안에 문서를 작성하면 된다. 보통 해당 함수가 수행하는 역할에 대해 작성하기에 유용한 기능이다. 

 

 

출력(Print) vs. 반환(Return)

위 2개의 개념을 비교하기 전에 아래와 같은 질문들을 던져보면 매우 좋을 것 같다. 

 

반환과 출력의 차이는 무엇인가? 
값을 반환하는데 대체 출력되지 않는 이유는 무엇일까?

함수를 호출해서 얻는 출력을 가지고 온다면 어떻게 될까? 

변수안에 저장하고 출력하는 대신 또다른 함수의 입력값으로 넣어보면 어떻게 될까? 

#return은 입력값(매개변수) n1, n2를 더한 값을 리턴한다. 
def add(n1,n2):
  return n1 + n2
#print함수는 매개변수 n1, n2를 더한 값을 출력한다. 
def add(n1,n2):
  print(n1+n2)
  return

 

 

위 2개 함수는 결국 콘솔창에 동일한 값을 찍히게 하지만 print는 단순히 '출력'만 한다는 점에서 return 함수의 또다른 기능에 대해 잘 알 고 있어야 한다. 

=> return 은 단순히 출력하는 대신, return된 값을 물고 있는 상태에서 또 다른 함수의 입력값으로 사용될 수 있다. 아래 예시를 보자. 

def is_leap(year):
  if year % 4 == 0:
    if year % 100 == 0:
      if year % 400 == 0:
        return True
      else:
        return False
    else:
      return True
  else:
    return False


def days_in_month(year, month):
  month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
  if month == 2 and is_leap(year):
    return 29
  else:
    return month_days[month-1]
  
year = int(input()) # Enter a year
month = int(input()) # Enter a month
days = days_in_month(year, month)
print(days)

 

 

is_leap(year)이라는 함수, 즉 사용자가 입력한 연도가 윤년인지 아닌지를 판단하여 True or False를 리턴하는 함수가 있다. 

이때 해당 함수를 호출하면 콘솔창에 'True' 'False'가 출력(print)되지는 않지만 일단 프로그램 내부적으로 해당 값을 가지고 있는 상태에서 다음 함수인 days_in_month()로 넘어가게 되는 것이다. 해당 참/거짓 값은 if문에서 하나의 조건으로 사용되며 true였다면(즉, 윤년이었다면) '29'라는 숫자를 반환하게 된다. 

 

계산기 만들기 프로젝트

사용자로부터 숫자를 입력받아, 원하는 연산기호를 선택하여 값을 계산해주는 말그대로 '계산기'를 만드는 기능이다. 

프로젝트에서 배운 주요 개념은 함수를 선언하고 리턴하고, 리턴된 값을  이용하여 또다른 함수에 사용하는 것이었다. 

#Calculator

#Add
def add(n1,n2):
  return n1 + n2

#Subtract
def subtract(n1, n2):
  return n1 - n2
  
#Multiply
def multiply(n1, n2):
  return n1 * n2
  
#Divide
def divide(n1, n2):
  return n1 / n2

operations = {
  "+" : add, 
  "-" : subtract, 
  "*" : multiply, 
  "/" : divide
}



def calculator():  
  num1 = float(input("What's the 1st number?: "))
  for symbol in operations:
    print(symbol)
  
  should_continue = True
  while should_continue:
    operation_symbol = input("Pick an operation from the line above: ")
    num2 = float(input("What's the next number?: "))
    calculation_function = operations[operation_symbol]
    answer = calculation_function(num1, num2)
    
    print(f"{num1} {operation_symbol} {num2} = {answer}")
  
    if input(f"Type 'y' to continue calculating with {answer}, or type 'n' to start a new calculation: ") == "y":
      num1 = answer
    else:
      should_continue = False
      calculator()

calculator()

 

코드 하단의 마지막에서 두번째줄을 보면 강의 끝자락에서 배운 '재귀함수'가 적용된 것을 알 수 있다.

즉 상단에서 선언한 def calculator() 함수 안에 그 자신인 calculator()가 호출되고 있는 부분이다. 재귀함수가 필요한 시점은 사용자의 특정 입력값에 따라 해당 함수를 처음부터 반복할 때다. 여기서는 '기존의 계산을 끝내고 새로운 계산을 시작하고 싶을 경우'를 대비하여 기존 계산된 값들을 모두 초기화하고 다시 처음부터 계산기가 동작할 수 있도록 else 조건일 때 재귀함수가 호출된 것이다. 

 

재밌다ㅋㅋㅋ 위 정답 코드를 보지 않고 혼자 처음부터 생각하여 주욱 코드를 작성해보면서 감을 익혀보면 좋을 것 같다.