Programming Language/Python

[Python] 13. 함수(function)

lumana 2023. 11. 5. 16:28

함수(function)


함수란?


  • 수학에서 1차함수, 2차함수, 3차함수..., 다변수 함수, 등등 --> 미지수를 통해 나타낸 수식

  • 프로그래밍에서 함수는 미지수(argument)를 전달해서 수식(코드)를 통해 나온 결과를 반환하는 것

파이썬 함수의 구조


def 함수 이름(매개변수):
    수행할 문장 1
    수행할 문장 2

# 호출하는 경우
함수 이름(argument)
변수 = 함수 이름(argument) # return value가 있는 경우
  • example

    def add(a, b):
        return a + b
    # 함수 add
    a = 3
    b = 4
    print(add(a, b)) # 7
  • 매개변수가 없을 수도 있다.

  • 결괏값(return value)이 없는 함수도 있다.

    def add(a, b):
        print(f'{a} + {b} = {a + b}')
    • 이때 add 함수는 반환값이 없다.

      (a = add(3,4) 대입 후 a를 출력했을 때 none이라고 나왔다고 반환값이 있다고 생각하면 안된다!)

매개변수 지정하여 호출하기

def add(a, b):
    return a + b
result = add(a = 3, b = 7)
result = add(b = 5, a = 3)

매개변수의 입력값이 몇 개가 될 지 모를 때

  • 매개변수로 *args 단독 사용

    def 함수이름(*매개변수):
        수행할 문장
        ...
    • example

      def add_many(*args): # *args : 입력값을 전부 모아서 튜플로 만들어 준다,
          result = 0
          for i in args:
              result += i
          return result
  • 매개변수로 *args 외 다른 것과 같이 쓸 때

    • example

      def add_mul(choice, *args):
          if choice == "add":
              result = 0
              for i in args:
                  result += i
          elif choice == "mul":
              result = 1
              for i in args:
                  reuslt *= i
          return result

키워드 파라미터

  • 매개변수 앞에 ** 를표기하면 매개변수가 딕셔너리로 만들어져 출력됨.

    def print_kwargs(**kwargs):
        print(kwargs)
    
    >>> print_kwargs(a=1)
    res: {'a': 1}

함수의 결과값은 언제나 하나이다

  • def add_and_mul(a, b):
        return a+b, a*b
    
    result = add_and_mul(3,4)
    --> result = (7, 12)
    리턴값이 2개가 아니라, (a+b, a*b) 라는 튜플 값을 결과 값으로 받는다.
    
    두개의 결과값처럼 받고 싶다면
    result1, result2 = add_and_mul(3, 4) 로 호출하면 된다.
    이러면 result1, result2 = (7, 12) 이므로 result1 = 7, result2 = 12가 된다.

특별한 상황일 때 함수를 빠져나가기

  • return 사용

    def say_nick(nick):
        if nick == "바보":
            return # 함수 탈출
        print(f'나의 별명은 {nick}입니다')

매개변수에 초깃값 미리 설정하기 : Default Parameter (cpp랑 비슷)

  • example

    def say_myself(name, old, man=True):
        print("나의 이름은 %s입니다." % name)
        print("나이는 %d살입니다." % old)
        if man:
            print("남자입니다.")
        else:
            print("여자입니다.")
    
    say_myself("박응용", 27)
    --> name에는 "박응용", old에는 27, man은 입력값이 없으므로 초깃값인 True를 갖는다.
    say_myself("박응용", 27, False)
    --> name에는 "박응용", old에는 27, man은 False이므로 "여자입니다"가 출력된다.
  • 다음과 같이 초깃값을 설정하면 안된다.

    def say_myself(name, man=True, old):
    --> 오른쪽부터 초깃값을 설정해야 한다.
  • 헷갈리기 쉬운 예시 모음

    def range2(end, start = 0, step=1):
      if start > end:
        (start, end) = (end, start)
      return list(range(start, end, step))
    
    range2(10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    ragne2(1, 10) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
    range2(1, 10, 2) # [1, 3, 5, 7, 9]
    range2(10, step = 2) # [0, 2, 4, 6, 8]
    range2(step=2, 10) # 에러 발생 --> 일반 constant는 반드시 제일 왼쪽에 와야함
    range2(10, step=2, start=1) # [1, 3, 5, 7, 9]
    range2(10, 2, start=1) # 에러 발생 --> start에 2가 대입되고, 또 start에 1이 대입되서 오류 발생
    arg_tuple = (1, 10, 2)
    range2(*arg_tuple) # [1, 3, 5, 7, 9]
    arg_dict = {'end': 10, 'step': 2, 'start': 1}
    range2(**arg_dict) # [1, 3, 5, 7, 9]

함수안에서 선언한 변수의 효력 범위

  • 결론 : 함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없다.
  • 함수 안에서 함수 밖의 변수를 변경하는 방법

    1. return 사용하기

      a = 1
      def vartest(a):
          a += 1
          return a
      a = vartest(a)
      print(a)
    2. global 명령어 사용하기

      a = 1
      def vartest():
          global a
          a += 1
      
      vartest()
      print(a) # 출력 결과 : 2
    • global 명령어를 함수 안에서 사용하는 것은 별로 좋지 않음

    • 함수는 독립적으로 존재하는게 좋고, 외부 변수에 종속적인 함수는 좋은 함수가 아니다.

lambda(람다식)

  • lambda는 함수는 생성할 때 사용하는 예약어

  • def와 동일한 역할

  • 함수를 한줄로 간결하게 만들 때 사용

  • def를 사용할 정도로 복잡하지 않거나, def를 사용할 수 없을 때 사용

  • 형식

    lambda 매개변수1, 매개변수2, .... : (매개변수를 사용한 표현식)
  • example

    add = lambda a, b: a + b # 리턴 명령어가 없어도 결괏값을 돌려줌
    result = add(3, 4)
    print(result) # 7
    
    is_odd = lambda x : True if x % 2 == 1 else False
    is_odd(3) # True

팩토리얼 계산 함수 구현하기

  • for문 사용

    def factorial_for(n):
        f = 1
        for m in range(1, n + 1):
            f *= m
        return f
  • 재귀 함수(recursive function) 사용

    • 재귀 함수란 정의 단계에서 자신을 재참조하는 함수를 뜻한다

    • 함수 안에서 자신의 함수를 다시 호출함

    def factorial_rec(n=1):
        if n <= 0:
            return 1
        else:
            return n * factorial_rec(n-1)

주어진 데이터의 평균과 분산을 구하는 함수 구현하기

# mean_var.py
def mean_var(data):
    n = len(data)
    if (n > 0):
        mean = sum(data) / n # sum is built-in fuction in python
        sum2 = 0
        for datum in data:
            sum2 += data ** 2
        var = sum2 / n - mean ** 2
        return mean, var
    return None, None # you can skip this statement


data = [1, 5, 2, 7, 4, 8, 9]
pair = mean_var(data) # pair is set to tuple
mean, var = mean_var(data)
mean, _ = mean_var(data) # Get only the first one
mean = mean_var(data)[0] # Get only the first one

참조) Do it! 점프 투 파이썬 (박응용 지음)