homebody's blog

[Python] 함수(Function) - 1 본문

Python

[Python] 함수(Function) - 1

homebody 2019. 7. 3. 20:52

함수(Function)

def func(parameter1, parameter2):
    code line1
    code line2
    return value
  • 함수 선언은 def로 시작하여 :으로 끝나고, 다음은 4spaces 들여쓰기로 코드 블록을 만든다.
  • 함수는 매개변수(parameter)를 넘겨줄 수도 있다.
  • 함수는 동작후에 return을 통해 결과값을 전달 할 수도 있다. (return 값이 없으면, None을 반환)
  • 함수는 호출을 func(val1, val2)와 같이 한다.

문제 - 1
rectangle() 함수 만들기

def rectangle(height, width):
    return 2 * (height + width), height * width

print("{}".format(rectangle(30, 20)))
(100, 600)

-> 함수에서 결과값을 여러 개를 동시에 반환하면 tuple형식으로 전달이 된다.

  • 내장함수 목록 확인

      dir(__builtins__)
  • 함수의 return

    • 함수는 반환되는 값이 있으며, 이는 어떠한 종류의 객체여도 상관없다.
    • 단, 오직 한 개의 객체만 반환된다.
    • 함수가 return 되거나 종료되면, 함수를 호출한 곳으로 돌아간다.

문제 - 2
my_max() 함수 만들기 -> 정수를 두개 받아서, 큰 값을 반환한다.

def my_max(a,b):
    if a>b:
        return a
    elif a==b:
        return "same"
    else:
        return b
print(my_max(1,5))
5

문제 - 3
리스트 두개를 받아 각각 더한 결과를 비교하여 값이 큰 리스트를 반환하는 함수를 만든다.

def my_list_max(a, b):
    if sum(a)>sum(b):
        return a
    elif sum(a)==sum(b):
        return "same"
    else:
        return b
print(my_list_max([10, 3], [5,9]))
[5, 9]

함수의 인자/인수

함수는 인자(parameter)를 받을 수 있다.
함수는 기본적으로 인수를 위치로 판단한다.

  • 기본 값(Default Argument Values)

      def func(p1=v1):
          return p1
    • 함수가 호출될 때, 인자를 지정하지 않아도 기본 값을 설정할 수 있다.

    • 기본 값이 설정이 되어 있어도 파라미터가 넘어오면 넘어온 값으로 넣는다.

    • 기본 값이 설정되어 있더라도 기존의 함수와 동일하게 호출 가능하다.

    • 호출시 인자가 없으면 기본 인자 값이 활용된다.

    • 단, 기본 매개변수 이후에 기본 값이 없는 매개변수를 사용할 수는 없다.

      • 기본 값을 쓸려면 제일 뒤에서 부터 사용해야한다.그래야 기본값이 없는 매개변수를 사용할 수 있다.

          def hello(name = "익명"):
              print(f"'안녕 {name}아'")
          hello()
          '안녕 익명아'
  • 키워드 인자(Keyword Arguments)

    • 키워드 인자는 직접적으로 변수의 이름으로 특정 인자를 전달할 수 있다.

        def greeting(age, name='ssafy'):
        print(f'{name}은 {age}살입니다.')
      
        # 다양하게 함수를 호출
        greeting(39, '태형')
        greeting(name = '태형', age = 39)
        태형은 39살입니다.
        태형은 39살입니다.
    • 단 아래와 같이 활용할 수는 없다. 키워드 인자를 활용한 뒤에 위치 인자를 활용할 수는 없다.

        def greeting(age, name='ssafy'):
            print(f'{name}은 {age}살입니다.')
        greeting(age=39,'태형')
    • 우리가 주로 활용하는 print() 함수는 파이썬 표준 라이브러리의 내장함수 중 하나이며, 다음과 같이 구성되어 있다.

           print(*objects, sep='', end='\n', file=sys.stdout, flush=False)
  • 가변 인자 리스트

      def func(*args):
    • print()처럼 정해지지 않은 임의의 숫자의 인자를 받기 위해서는 가변인자를 활용한다.

    • 가변인자는 tuple 형태로 처리가 되며, *로 표현한다.

    • 이렇게 처리하면 몇 개의 인자값이 전달 되던지 해결할 수 있다.

        # 가변 인자 예시 (print문은 *obejcts를 통해 임의의 숫자의 인자를 모두 처리한다.)
        print('hi', 'hello', '안녕', 'guten tag', '', sep='.')
        # args는 tuple임을 확인
        def my_func(*args):
            print(type(args))
            print(args)
        my_func(1,2,3,4,5,6,7,8,9)
        <class 'tuple'>
        (1, 2, 3, 4, 5, 6, 7, 8, 9)

      문제 - 4
      정수를 여러 개 받아서 가장 큰 값을 반환하는 my_max()

      def my_max(*nums):
          tmp=list(nums)
          tmp.sort()
          return tmp[-1]
      
      #or
      
      def my_max(*nums):
      max_num = nums[0]
      for num in nums:
          if num > max_num:
              max_num = num
      return max_num
      
      my_max(1, 2, 6, 5, 2, 3, 4)
      6
  • 정의되지 않은 인자들 처리

      def func(**kwargs):
    • 정의되지 않은 인자들은 dict 형태로 처리가 되며, **로 표현한다.

    • 주로 kwagrs라는 이름을 사용하며, **kwargs를 통해 인자를 받아 처리할 수 있다. kwagrs는 다른 이름으로 바뀔 수 있다.

    • 우리가 dictionary를 만들 때 사용할 수 있는 dict() 함수는 파이썬 표준 라이브러리의 내장함수중 하나이며, 다음과 같이 구성되어 있다.

        class dict(**kwarg)
        class dict(mapping, **kwarg)
        class dict(iterable, **kwarg)

      문제 - 5

       실제 dictionary모습으로 출력하는 함수 만들기
        def my_fake_dict(**languages):
        for lang in languages:
            print("{}: {}".format(lang, languages[lang]), end=' ')
        my_fake_dict(한국어='안녕', 영어='hi', 독일어='Guten Tag')
        한국어: 안녕 영어: hi 독일어: Guten Tag 
  • dictionary를 인자로 전달(unpacking arguments list)

    • **dict(변수명)를 통해 함수에 인자를 넘길 수 있다. dictionary를 인자로 넘기면 에러가 발생한다.

        # user 검증(유사 회원가입)을 작성
        # username, password, password_confirmation을 받아서 비밀번호 일치 여부를 판단
        def user(username, password, password_confirmation):
            if password == password_confirmation:
                print(f"{username}님, 회원가입이 완료되었습니다.")
            else:
                print("비밀번호가 일치하지 않습니다.")
      
        my_account = {'username': 'jang', 'password' : '1234', 'password_confirmation' : '234'}
        user(**my_account)

이름공간 및 스코프(Scope)

  • 파이썬에서 사용되는 이름들은 이름공간(namespce)에 저장되어 있다.

    • 변수에서 값을 찾을 때 아래와 같은 순서대로 이름을 찾아나간다.

      1. Local scope: 정의된 함수

      2. Enclosed scope: 상위 함수

      3. Global scope: 함수 밖의 변수 혹은 import된 모듈

      4. Built-in scope: 파이썬안에 내장되어 있는 함수 또는 속성

         str(1)     #정수 1을 문자열 '1'로 변환해줌 -> 제대로 작동함
         str = 4 #str을 Global scope에 4라는 값을 가지고 있는 변수로 선언됨
         str(1)     #그래서 Built-in scope에 있는 str()함수를 사용할려고 하면 not callable이라는 오류가 발생 왜냐면 str은 Global scope에 선언된 변수이기 때문이다.
         del(str)#그래서 del을 써서 선언된 변수를 없애주어야한다.
         str(1)    #그러면 Built-in scope에 있는 내장함수를 제대로 사용할 수 있다.
    • 이름공간은 각자의 수명주기가 있다.

      • built-in scope : 파이썬이 실행된 이후부터 끝까지
      • Global scope : 모듈이 호출된 시점 이후 혹은 이름 선언된 이후부터 끝까지
      • Local/Enclosed scope : 함수가 실행된 시점 이후부터 리턴할때 까지
Comments