python

파이썬 함수 이해하기

햇농nongnong 2021. 12. 8. 19:40

(이 글은 '언어와정보처리' 과목에서 '파이썬 기초' 수업 내용을 정리한 글이다.)

 

pytorch 에 대해 들어가기 전, python 기초를 간단하게 리뷰하고 넘어가려한다.

 

 

함수 (function)


  • 함수의 기본 개념 : 입력값 - 함수 - 출력값
  • 코딩에서 가장 중요한 개념이자, 중급 수준의 코딩 실력으로 가기 위한 필수 과정
  • 특정 작업을 하는 여러 줄의 코드를 하나의 묶음으로 정하여 편리하게 쓸 수 있음
  • 반복적으로 사용하지 않더라도, 코드 전체에서 맡고 있는 역할에 이름을 부여하여 코드 내 '구간'을 만들 수 있음

 

함수 코드의 기본 구조

  • 함수를 만들 때 입력값(var)을 추가하여 함수 안에서 사용할 수 있음
  • 함수 내 일련의 코드를 거쳐 나온 결과는 return(반환)을 통해 함수의 결과로 출력

 

    • def function(var) : code 1 code 2(var) ... return result

 

ex) 이름을 입력하면 "my name is (이름)." 이 출력되도록 하는 함수

def my_name(input_name):
    message = "My name is {}.".format(input_name)
    return message
    
name = "Python"
result = my_name(name)
print(result)

결과 : My name is Python.

 

 

ex) 성적-점수 표를 바탕으로 평균이 3.7 이 넘는 학생에게는 장학금을 주려고 한다.
      학생별로 장학금을 받을 수 있는지 알아보자. 

 

A+ : 4.3, A0 : 4.0, A- : 3.7, B+ : 3.3, B0 : 3.0

파이썬 : A0, B0, A+, A0, A-

파에톤 : B0, B+, A0, A+, B+

애플파이썬 : B+, B+, A0, A0, A+

grade_dict = {'A+':4.3, 'A0':4.0, 'A-':3.7, 'B+':3.3, 'B0':3.0}

# 학생과 성적 리스트를 각각 key 와 value 로 하는 딕셔너리 생성
student_score_dict = {'Python' : ['A0', 'B0', 'A+', 'A0', 'A-'],
                      'Phaethon' : ['B0', 'B+', 'A0', 'A+', 'B+'],
                      'Applepython' : ['B+', 'B+', 'A0', 'A0', 'A+']}

def check_scholarship(student_name):
    
    # 학생 이름을 넣으면 student_score_dict에서 그 학생의 성적 리스트가 반환
    student_score_list = student_score_dict[student_name]
    
    score_total = 0
    # 성적 리스트에서 성적을 하나씩 grade_dict 에서 나온 점수를 score_total 에 누적
    for score in student_score_list :
        score_total = score_total + grade_dict[score]
        
    # 성적 평균 내기
    num_subjects = len(student_score_list)
    score_average = score_total / num_subjects
    
    # 평균 점수가 3.7 이 넘는지 체크
    if score_average > 3.7 :
        msg = "Scholarship!"
    else :
        msg = "No scholarship"
        
    # 장학금 지급 여부(msg)를 결과로 반환
    return msg
scholarship_result_Python = check_scholarship('Python')
print(scholarship_result_Python)

scholarship_result_Phaethon = check_scholarship('Phaethon')
print(scholarship_result_Phaethon)

scholarship_result_Applepython = check_scholarship('Applepython')
print(scholarship_result_Applepython)

결과 : Scholarship!
No scholarship
Scholarship!

 

 

함수를 사용하지 않았을 때와 풀이 비교

  • 똑같은 작업을 학생이 바꿀 때마다 똑같은 코드를 작성해서 실행해야 함
  • 복사 및 붙여넣기를 할 수 있지만 불필요한 코드의 양이 그만큼 배로 증가함
  • 코드 내에서 연달아 쓰지 않고 중간에 다른 코드가 있고 나중에 다시 써야 할 때 난감해짐

 

 

재귀함수 (recursive function)

  • 함수를 정의하는 동안 함수 자기 자신이 함수의 정의에 포함되어 있는 형태

 

재귀함수 기본 구조

def func() :
    code 1
    code 2
    if ~~ :
        code 3
    else :
        func()
        
    return something

- else 에 func() 이 있는 것처럼 함수 안에 자기 자신이 있음

 

재귀함수 활용 예시

- 0부터 입력값 n 까지의 합계 구하기 (단, n 은 자연수)

- 출력값 : 0 + 1 + 2 + ... + n

def add_upto_n(n) :
    if n == 0 :
        return 0
    else :
        total = n + add_upto_n(n-1)
        return total
        
total = add_upto_n(100)
print(total)

결과 : 5050

 

함수 예제 문제

- 1, 1, 2, 3, 5, 8, 13, ... 처럼 앞 두 수의 합이 다음 수가 되는 피보나치 수열이 있다. 자연수 n을 입력하였을 때 n번째 피보나치 수열의 수가 나오는 함수를 만들어보자.

ex) n=7 ---> 결과 : 13

     n=10 ---> 결과 : 55

     n=20 ---> 결과 : 6765

def fibonacci(n):
    if n == 1 or n == 2:
        return 1
    else : 
        n_th_fib_num = fibonacci(n-2) + fibonacci(n-1)
        return n_th_fib_num
        
result_1 = fibonacci(7)
print(result_1)
result_2 = fibonacci(10)
print(result_2)
result_3 = fibonacci(20)
print(result_3)

결과 : 13

         55

         6765

 

 

함수 정리

  • 함수는 반복 작업을 훨씬 효율적으로 처리할 수 있는 강력한 기능
  • 특히, 재귀함수를 잘 이해하고 사용하면 while 보다는 안전한 조건부 무한 루프를 만들어 함수를 지속적으로 사용할 수 있게 됨
  • 앞서 언급하였듯이, 함수 내에서도 IF문과 FOR문은 활발하게 쓰이고 있음