본문 바로가기

진리는어디에/Python

[Python] 함수 #1 소개

이번 포스트 부터 몇 장에 걸쳐 파이썬 함수에 대해서 다룬다. 먼저 본 포스트에서는 파이썬 함수의 기본 문법에 대해 빠르게 살펴 본 다음, 파이썬 함수의 인자 전달 방법을 알아본다. 파이썬 함수에 대해 기본 사항을 파악하고 난 후 다음 포스트 부터 파라미터 패킹/언패킹, 데코레이터들을 이어서 살펴 보도록하겠다.

목차

  1. >> 함수 소개
  2. 디폴트 파라미터 주의 사항
  3. 파라미터 언패킹
  4. 파라미터 패킹
  5. 함수 객체
  6. 일급 객체(first class object)
  7. 람다(lambda)

파이썬 함수의 문법

파이썬 함수는 다음과 같은 형식을 가진다.

def 함수명(매개변수 리스트) :
    수행할 표현식
    수행할 표현식
    ...

def 키워드는 파이썬에서 함수를 선언 할때 사용 되는 키워드이며, 함수명은 사용자가 임의 지정한다. 함수명 뒤, 괄호 안의 매개변수 리스트는 이 함수에 입력으로 전달 되는 값을 받을 변수이다.

이렇게 함수를 정의 후, 수행할 표현식에 if, while 등의 표현식들로 함수의 로직을 작성한다.

함수는 표현식을 수행 후 단순 종료하거나, return 키워드를 이용해 값을 호출자에게 돌려 줄 수 있다. 다음 예제를 보자.

def add(a, b) :
    return a + b
    
a = 10
b = 20
r = add(a, b)

print(r) # 30

위에서 소개된 함수 add는 a와 b를 입력 값으로 받아 더하기 연산을 수행 후, 그 결과를 돌려 준다.

함수 인자를 전달하는 방법

"함수 인자"란 함수를 호출 할 때 넘겨 주는 값들을 말한다. 예를 들어 앞에서 다룬 예제의 add()함수를 호출 할 때 넘겨 주었던 10, 20과 같은 값들을 함수 인자라고 한다.

"함수의 인자"는 "아규먼트(argument)" 또는 "파라미터(parameter)"라고도 불리며 이후 강좌들에서 "인자", "아규먼트", "파라미터"라는 용어가 나오면 모두 동일한 뜻이라고 이해 하면 된다.

이번 섹션에서는 파이썬에서 함수인자를 전달하는 두 가지 방법에 대해 살펴 보도록 한다. 파이썬에서는 두 가지 함수 인자 전달 방법을 제공한다.

  • positional argument : 인자의 위치에 따른 전달
  • keyword argument : 매개변수의 이름으로 전달

먼저 positional argument(위치 기반 인자 전달)을 먼저 살펴보자. 예를 들어 아래와 같은 함수가 있다고 가정하자.

def foo(a, b, c, d, e, f) :
    print(a, b, c, d, e, f)

위에서 본 예제대로라면 다음과 같이 인자를 전달 할 수 있다.

foo(1, 2, 3, 4, 5, 6)

이  방법은 positional argument. 즉, 위치에 따라 함수의 인자를 구분한다. 가장 첫번째 위치에 있는 1이 a로써 전달, 2는 b 이런식으로 5는 f까지, 전달 되는 인자의 위치에 따라 매칭 되는 변수가 결정 된다.

그리고 다른 방법, keyword argument는 아래와 같다.

foo(a=1, b=2, c=3, d=4, e=5, f=6) # (1, 2, 3, 4, 5, 6)
foo(f=6, e=5, d=4, c=3, b=2, a=1) # (1, 2, 3, 4, 5, 6)

매개변수의 이름으로 인자를 전달하는 방법으로써, 이름을 기준으로하기 때문에 위 예제 처럼 인자의 전달 순서와 상관 없이 동일한 결과를 얻을 수 있다.

두 방법을 섞어서 사용하는 것 또한 가능하다

foo(1, 2, c=3, d=4, e=5, f=6)    # (1, 2, 3, 4, 5, 6)
foo(1, 2, d=4, c=3, f=6, e=5)    # (1, 2, 3, 4, 5, 6) 
foo(1, b=2, 3, d=3, f=6, e=5)    # error

세번째 방식에서 에러가 발생한 이유는 keyword argument가 positional argument 앞에 있기 때문이다. 모든 positional argument는 반드시 keyword argument 앞에 있어야 한다.

/, * 를 사용한 매개 변수 표기

def foo(a, /, b, *, c) :
    print(a, b, c)

/와 *의 의미는 아래와 같다. (python 3.x version only)

  • / - '/' 의 앞쪽(왼쪽)에는 positional argument 만 올수 있다.
  • * - '*' 의 뒷쪽(오른쪽)에는 keyword argument 만 올수 있다.
  • / 와 * 사이에는 positional argument 와 keyword argument 의 구분 없이 아무 형태나 올수 있다.
foo(1, 2, 3)       # error. 세번째 인자는 keyword argument가 와야 한다.
foo(a=1, b=2, c=3) # error. 첫번째 인자는 positioal argument가 와야 한다.
foo(1, 2, c=3)     # ok
foo(1, b=2, c=3)   # ok
foo(1, b=2, c=3)   # error. 세번째 인자는 keyword argument가 와야 한다.
Tip. keyword only arguement의 장점
  • 가독성을 높여준다.
  • API 함수들이 함수의 모호함을 피하기 위해서 Keyword-Only Arguments 로만 중요한 인자들을 받을 수 있다.
  • Keyword-Only Arguments로만 인수들을 받을 수 있도록 함수를 만들 수 있다.

함수가 엄청나게 많은 양의 인수들을 받는 때와 같은 selected case scenario 에서 유용하게 사용된다.

디폴트 파라미터 사용하기

파이썬 함수에서는 디폴트 파라미터를 제공한다. 디폴트 파라메터란, 함수 호출시 파라메터를 지정하지 않았을 경우 인터프리터가 자동으로 미리 지정된 기본 값을 함수에게 넘겨 주는 것을 말한다.

def foo(a, b=0, c=None) :
    print(a, b, c)
    
foo(1, 2, 3)    # (1, 2, 3)
foo(1, 2)       # (1, 2, None)
foo(1)          # (1, 0, None)

디폴트 파라메터의 선언은 마지막 인자부터 앞으로 차례로 지정해야 한다. 하지만 위에서 언급된 '*' - keyword only arguement는 파라메터 리스트 가운데 디폴트 파라메터 선언이 가능하다.

def foo(a, b=0, c) :
    print(a, b, c)

foo(1, 2)    # error.

def bar(a, b=0, *, c) :
    print(a, b, c)

bar(1, c=2)  # ok. c는 keyword parameter여야 하므로 명시적으로 인자 지정 가능.
             # b에는 아무런 인자가 넘어오지 않는다는 것을 알 수 있으므로 디폴트 파라메터 적용

마치며

이상으로 파이썬 함수의 기본 문법과 함수의 인자에 대해서 알아 보았다. 다음 장에서는 디폴트 인자를 사용 할 때 주의 해야 할 사항에 대해 알아 보도록 하겠다.

부록 1. 같이 보면 좋은 글

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!