게시:

국문으로 작성된 이 글을 읽고 있는 한국의 정규 교육을 받은 많은 이들이 알고있는 그 함수가 맞다.

파이썬에서 함수는 전달받은 입력값(인수, Argument)으로 사전에 정의한 어떠한 작업을 수행한 다음 결과물을 내놓는 코드 블록이다. 수학적 계산, 문자열 처리, 반복문 처리 등 다양한 작업에 대한 처리가 가능하다. 함수는 코드를 정의할 뿐이지 호출하기 전까지는 그 어떠한 결과도 만들지 않는다.

함수를 이해하기 쉽게 표현한 이미지
입력값을 넣으면 적절한 처리 후 결과물을 내놓는다.

왜 사용하는가?

주된 목적은 추상화(Abstract)를 통한 생산성(재사용성) 향상이다.

같은 연산을 하는 코드를 사용할 때마다 작성하는 것은 번거롭다. 이 경우 미리 코드 블록으로 만들어두면 같은 코드를 다시 작성할 필요없이 함수를 재사용하여 해당 작업을 처리할 수 있어 효율적이다.

또한 이와 같이 추상화를 해놓으면 모듈이 어떻게 작성되었는지 숨길 수 있고 사용자는 굳이 비즈니스 로직을 모르더라도 Docs나 명세만을 참고하여 해당 기능을 활용할 수 있다.

구조

  • 예약어(def)
  • 함수명(func_name)
  • 매개변수(params)
  • 명세(Docstring)
  • 수행작업
  • 반환문(return)
# Function declaration
def func_name(param1, param2...):  # 예약어, 함수명, 매개변수가 있는 부분
    """                            # 명세(Docstring) 부분
    param1: str
    param2: list
    
    param1이 param2 안에 포함되어 있는지 검사한다...
    """
    if param1 in param2:           # 수행작업
      return True                  # 반환문

# Function call
function_name(argument1, argument2...)

각 용어의 의미

예약어(def)

모든 함수의 시작. 정의하다는 뜻의 영단어 define의 약자로 함수를 만들 때 사용하는 예약어이다.

함수명(func_name)

함수명은 개발자가 자유롭게 네이밍한다. 단, 직관적으로 기능을 추론할 수 있고 가독성이 좋아야 하므로 적당한 길이의 동사(Verb) 형태로 네이밍하는 것이 좋다.

매개변수(parameter)

함수에 전달되는 입력값이다. 인수가 전달되지 않았을 때를 대비하여 기본 값을 정의할 수 있다. 매개변수가 2개 이상인 경우에는 콤마(,)로 구분한다. 종류는 5가지(Position argument, Default value parameters, Variable length arguments, keyword arguments, Variable length keyword arguments)가 있다. 자세한 내용은 아래에 따로 서술한다.

수행작업

함수 안의 코드이다. 입력받은 값으로 어떤 연산을 할 것인지 정의한다. 함수 안에 선언된 변수는 함수 바깥에서 읽거나 쓸 수 없다. 이러한 변수를 지역변수(Local variable)라고 한다.

반환문(return)

호출한 코드로 수행 결과를 되돌려줄 때 작성하는 구문이다. 반환문이 생략되어도 함수를 제대로 동작한다. 반환문이 생략되는 경우 입력값으로 처리한 값을 결과로 되돌려주지 않을 뿐이다.

예를 들어 수행작업에 print 명령어를 작성 후 반환문을 생략하여 함수를 실행해보면 함수가 잘 동작하는 것을 확인할 수 있고 이때 호출한 코드의 처리 결과로 None이 반환되는 것을 확인할 수 있다.

참고: 파이썬은 내포하는 코드의 계층 관계를 들여쓰기로 엄격하게 구분한다. 이는 함수뿐 아니라 파이썬 전체에 공통적으로 해당되는 사항이다. 함수는 코드 블록에 포함되는 수행작업과 구문을 함수 선언부보다 안쪽으로 들여쓰기 해야 한다. 만일 이를 무시하는 경우에는 Syntex error가 발생한다.

들여쓰기는 공백 2칸, 4칸, 탭(Tab) 등 다양하게 할 수 있지만 어느 한 가지로 통일하는 것이 가독성과 유지보수 측면에서 유리하고 파이썬 공식문서(PEP8)에서는 공백 4칸을 권장한다.

인수와 매개변수(Argument and Parameter)

인수와 매개변수 모두 함수의 입력으로 전달되는 값(Input)을 말하는데 호출하는 입장에서 함수에게 전달하는 값이면 인수(Argument)라 하고, 함수 입장에서 받는 값이면 매개변수(Parameter)라 한다.

인수(Argument)

함수를 호출할 때 함수에게 전달하는 값을 인수(Argument)라고 한다. 호출할 때 반드시 인수가 전달되어야 하는 것은 아니며 인수없이 함수를 호출하는 경우도 있다.

함수를 호출할 때 괄호 안에 입력하며 정의된 매개변수의 수만큼 입력 가능하고 콤마(,)로 구분한다. 매개변수가 2개 이상일 때 매개변수의 순서에 맞추어 인수도 순차적으로 대입되는데 이를 Position Argument라고 한다.

# name1, name2는 함수 입장에서 받는 값이므로 매개변수
def my_func2(name1, name2):
    print("We are name is" + name1 " and" + name2)

# 'Dann', 'John'은 함수에게 전달하는 값이므로 인수
>>> my_func2('Dann', 'John')
We are name is Dann and John

매개변수(Parameter)

함수 입장에서 전달받은 입력값(Input)을 말한다. 함수를 선언할 떄 괄호 안에 입력하는데 여러 개가 될 수도 있으며 이 경우 쉼표로 구분한다.

특별한 옵션을 적용하는 경우가 아닌 이상 전달하는 인수와 전달받는 매개변수의 수는 같아야 하며, Default value parameters를 설정한 경우가 아닌 이상 인수가 매개변수보다 적게 들어오면 TypeError가 발생한다.

# 인수가 누락된 경우 TypeError가 발생한다.
Traceback (most recent call last):
  File "python", line 4, in <module>
TypeError: my_func2() missing 1 required positional argument: 'name2'

매개변수(인수)의 종류

위치 인수(Position Argument)

기본적인 형태로 매개변수가 2개 이상일 때 매개변수의 순서에 맞추어 인수도 순차적으로 대입되는데 이를 위치 인수(Position Argument)라고 한다. 함수 매개변수 나열 우선순위 중 첫 번째이다.

def my_func2(name1, name2):
    print("We are name is" + name1 " and" + name2)

기본 값 매개변수(Default Value Parameters)

매개변수에 Default value parameters을 미리 정의하면 인수가 누락된 경우 미리 정의한 값을 매개변수로 취한다. 위치 인수 뒤에 위치하여야 하며 매개변수 나열 우선순위 두 번째이다. 순서를 무시하는 경우 Syntex Error가 발생한다.

def hello_world(name1, my_name="Dann"):
    print(f"Hello, {name1}! My name is {my_name}.")

>>> hello_world("James")
Hello, James! My name is Dann.

가변 길이 인수(Variable Length Argument)

전달받을 인수의 개수가 유동적인 경우 인수의 숫자를 미리 정하지 않을 때 사용한다. 매개변수명 앞에 Asterisk(*)를 입력하여 가변 길이 인수임을 나타낼 수 있다. 매개변수 우선순위 세 번째이다.
가변길이 인수를 사용한 함수 결과는 괄호로 묶인 튜플(Tuple) 형태로 표시된다.

def my_func3(name1, name2, *args):
    print(name1, name2)
    print(args)

>>> my_func3('단군', '해모수', '주몽', '온조', '혁거세', )
단군, 해모수
(주몽, 온조, 혁거세)

# *args는 Arguments의 약어로 관습적으로 쓰이는 표현입니다.

참고: 가변 길이 인수는 인수가 복수라는 사실을 알려주지 몇 개인지 알려주지 않는다. 따라서 컴퓨터는 가변 길이 인수가 등장하면 이후 우선순위 인수인 키워드 인수나 가변길이 키워드 인수가 나타나기 전까지 Input 인수를 모두 가변 길이 인수로 처리한다. 그러므로 매개변수 우선순위는 반드시 준수해야 한다.

키워드 인수(Keyword Argument)

Hash처럼 어떤 매개변수에 전달할 인수인지 미리 정하는 형태의 인수이다. 키워드 인수를 사용하면 Position Argument의 기본규칙을 무시하고 배정받은 매개변수에 인수가 찾아가 대입된다. 매개변수 나열 우선순위 네 번째이다.

daf my_func4(name1, name2, name3):
    print('We are name is ' name1, name2, name3)

>>> my_func4('다니엘', name3='비탈릭', name2='리눅스')
We are name is 다니엘 리눅스 비탈릭

가변 길이 키워드 인수(Variable Length Keyword Argument)

전달받을 인수가 유동적인데 키워드 인수인 경우에 사용한다. 매개변수명 앞에 Asterisk(*)를 2개 붙여서 가변 길이 키워드 인수임을 나타낼 수 있다. 가변 길이 인수와 같이 인수의 숫자가 유동적이라는 사실만 알려주지 총 몇 개가 입력으로 들어올지는 알려주지 않기 때문에 가변 길이 키워드 인수가 등장하면 이후 모든 인수는 가변 길이 키워드 인수로 인식한다.

def func_param_with_kwargs(univ1, univ2, **kwargs):
    print("top1=",end=""), print(univ1)
    print("top2=",end=""), print(univ2)
    print("top3=",end=""), print(univ3)
    print("others=",end=""), print(kwargs)

>>> func_param_with_kwargs("서울대",
                           "연세대",
                           other1="서강대",
                           other2="성균관대",
                           other3="성균관대")

매개변수의 배열 순서

Function parameter period of function
매개변수 배열 우선순위

댓글남기기