[Python] Function Definition

2 minute read

python-version-3.7.1

Function Definition (함수)

1. def

Name Convention

  • sneak_case : 소문자와 언더바(_)를 활용하여 작성.


Example

def example(a, b):
    return a+b

print(add(3, 4))

>>> 7

return 을 통해 값을 반환할 수 있다. (return 이 없을 경우, 해당함수는 아무런 값도 반환하지 않는다.)


*args

위치인자

def example(*args):
    print(args)
    
example(1, 2, 3)

>>> (1, 2, 3)

  • 정해지지 않은, 여러개의 입력값을 받도록 Asterisk(*) 를 통해 인자(Parameter)를 설정할 수 있다.

  • 입력인자 앞에 *를 붙이게 되면 입력인자 args는 입력받는 값을 튜플형태로 변환한다.

  • args가 아닌, 다른 이름으로 인자(Parameter)를 정의해도 문제없으나 관용적 표현인 args를 사용하는 것을 권장한다.


def example(a, *args):
    print(a)
    print(args)
    
example(1, 2, 3)

>>> 1
>>> (2, 3)

위와 같이 단일 인자와 *args 를 같이 사용할 경우 순서에 유의한다.
a*args 순서가 바뀔 경우 함수 정의는 되지만 실제로 함수를 호출할 때, a 에 위치인수로는 전달할 수가 없게되어 아래와 같이 TypeError 가 발생한다.

def example(*args, a):
    print(a)
    print(args)

example(1, 2, 3) # 1, 2, 3 이 모두 *args 에 전달된다.

>>> TypeError: example() missing 1 required keyword-only argument: 'a'


아래와 같이 키워드인자로 전달할 수는 있겠지만, 권장되지 않는다.

example(1, 2, a=77)

>>> 77
>>> (1, 2)



**kwargs

키워드인자

def example(**kwargs):
    print(kwargs)

example(arg1=1, arg2=2)

>>> {‘arg1’: 1, ‘arg2’: 2}

  • 키워드로 인수를 전달받아, 해당값을 Dictionary 형태로 변환한다.

  • 함수 정의시 항상 마지막에 위치한다.

  • *args 와 마찬가지로 다른 이름으로 정의가능하나, **kwargs 가 관용적으로 사용된다.


Notice : Parameter 순서

권장

def func_order(arg1, arg2, *args, arg_init=10, **kwargs):
    print(f'arg1: {arg1}')
    print(f'arg2: {arg2}')
    print(f'args: {args}')
    print(f'arg_init: {arg_init}')
    print(f'kwargs: {kwargs}')
    
func_order(1, 2, 3)

>>> arg1: 1
>>> arg2: 2
>>> args: (3,)
>>> arg_init: 10
>>> kwargs: {}

초기값이 설정되어 있는 arg_init*args 앞에 위치하게 할 경우를 살펴보겠다.

def func_order(arg1, arg2, arg_init=10, *args, **kwargs):
    print(f'arg1: {arg1}')
    print(f'arg2: {arg2}')
    print(f'args: {args}')
    print(f'arg_init: {arg_init}')
    print(f'kwargs: {kwargs}')
    
func_order(1, 2, 3)

>>> arg1: 1
>>> arg2: 2
>>> args: ()
>>> arg_init: 3
>>> kwargs: {}

arg_init 의 초기값 10이 위치인수로 3이 전달되어 3이 되어버린 것을 확인할 수 있다.
이러한 경우를 방지하기 위해서, 초기값을 설정한 인자(Parameter)는 *args 뒤에 두는 것을 권장한다.



Docstring

def example(a, b):
    """
    This is a example.
    """
    return a + b

위와 같이 """ """ 를 활용하여 함수에 대한 Docstring 을 작성할 수 있다.
사용자가 이 설명을 보기 위해서는 help()함수를 사용한다.

help(example)



2. lambda

  • 익명 함수이자 일회성이다.

  • 결과값이 무조건 return 되어진다.

def add(a, b):
	return a + b
    
print(add(5,2))

>>> 12

정의된 위의 함수를 lambda 를 활용하여 변형시킬 경우 아래와 같이 정의된다.

f = lambda a, b : a + b
print(f(5, 7))

>>> 12

lambda 의 몸체에는 expression(식) 만 올 수 있다.


Expression vs Statement

a + b → expression (식)

c = a + b → statement (문)

Leave a comment