[Python] 13. 함수(function)

2023. 11. 5. 16:28·Programming Language(Sub)/Python

함수(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! 점프 투 파이썬 (박응용 지음)

'Programming Language(Sub) > Python' 카테고리의 다른 글

[Python] 15. 파일 입출력(FILE Input/Output)  (0) 2023.11.06
[Python] 14. 사용자 입력  (0) 2023.11.05
[Python] 12. for 문(for statements)  (0) 2023.11.05
[Python] 11. while 문(while statements)  (0) 2023.11.05
[Python] 10. if 문(if statements)  (0) 2023.11.05
'Programming Language(Sub)/Python' 카테고리의 다른 글
  • [Python] 15. 파일 입출력(FILE Input/Output)
  • [Python] 14. 사용자 입력
  • [Python] 12. for 문(for statements)
  • [Python] 11. while 문(while statements)
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (456)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (129)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (5)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Python] 13. 함수(function)
상단으로

티스토리툴바