입력값을 가지고, 특정 작업을 수행한 다음에 결과물을 내어 놓는 것이 함수입니다. 프로그래밍을 하다 보면 동일한 내용을 반복해서 작성하는 경우가 있습니다. 이렇게 '특정한 목적의 작업을 수행하며 재사용성이 큰 부분'을 묶어 함수로서 작성할 수 있습니다. 예로 두 수의 합이나, 두 수의 몫과 나머지를 구하는 것 등을 함수로 정의할 수 있습니다.

함수 정의하기

간단하게, 두 수를 입력받아 합을 리턴하는 함수를 작성하겠습니다.

Python에서는 함수를 정의하기 위해 def라는 키워드를 사용하며, 각 함수에는 이름0개 이상의 인자를 명시해야 합니다. def [func_name](params) 형태이며, 이를 함수의 signature라고 합니다. 위 함수의 이름은 sum이며, 입력 인수는 a와 b로 2개이고, 리턴 값은 a + b입니다. 따라서 sum(1, 5)의 결과값은 6이 됩니다.

위의 sum(1, 5)와 같은 구문을 함수 호출이라고 부릅니다. 함수의 이름 뒤에 소괄호를 붙이고, 인자를 필요로 하는 경우에는 콤마(,)로 구분하여 전달합니다. 함수를 호출하게 되면 도로에서 차선을 이동하듯 제어가 넘어가고, 함수가 종료되면 다시 제어가 되돌아옵니다.

Python의 함수는 0개 이상의 인자를 받고, 0개 이상의 값을 리턴할 수 있습니다. 그러므로 함수의 리턴은 있을 수도 있고 없을 수도 있으며, 여러 개의 값을 리턴할 수도 있습니다.

리턴이 없는 함수

위의 say_hello 함수는 아무 인자도 받지 않고, 'hello'를 출력하며 리턴이 없습니다. 그러나 함수의 리턴 값은 None으로 처리됩니다. 함수에 리턴이 없다면, 자동으로 return None 처리가 되는 것입니다.

여러 개의 값을 리턴하는 함수

위의 divmod 함수는 두 개의 인자를 받고, floor div의 결과값(몫)나머지를 리턴합니다. Python은 함수에서 2개 이상의 값을 리턴할 경우 Tuple 타입으로 처리되며, 따라서 위의 예처럼 함수의 리턴 값을 unpacking할 수 있습니다.

함수 인자의 기본값

함수의 인자에 기본값을 설정할 수 있습니다.

함수 호출 시, 위처럼 기본값이 설정된 인자(a, b)에 별도로 값을 전달하지 않으면 기본값으로 처리됩니다. 인자를 전달하든 전달하지 않든 상관 없으므로, 기본값이 설정된 인자를 선택 인자라고 부릅니다. 위 함수의 경우 a와 b 모두 기본값이 0으로 설정되어 있고, 따라서 sum()처럼 별도의 인자 전달 없이 호출하면 a와 b 모두 기본값인 0을 갖습니다.

함수 인자의 종류

위에선 함수 호출 시 모든 인자를 순차적으로 전달했고, 이를 위치 인자로 부릅니다. 인자를 키워드와 함께 명시적으로 전달할 수도 있으며, 이를 키워드 인자라고 부릅니다.

만약 전달된 모든 문자열을 이어붙여 리턴하는 함수를 작성하려면, 인자의 갯수가 동적이어야 합니다. 이를 위해 가변 인자(variable argument)를 사용합니다.

변수 앞에 asterisk(*) 기호를 붙이면, 해당 변수는 가변 인자로 관리되며 전달된 인자들은 Tuple로 처리됩니다. 따라서 위 함수는 인자의 갯수가 자유롭습니다. 위치 인자를 가변적으로 받으며 이를 튜플로 처리하므로, 이를 가변 위치 인자 튜플이라고 부릅니다. 키워드 인자도 가변으로 정의할 수 있는데, 아래처럼 변수 앞에 asterisk(*)를 두 개 이어붙이면 됩니다.

해당 변수는 가변 인자로서 관리되며 전달된 인자들은 Dictionary로 처리됩니다. 따라서, 함수의 인자는 아래 4종류가 있습니다.

  • 필수 인자
  • 선택 인자
  • 가변 위치 인자 Tuple
  • 가변 키워드 인자 Dictionary

함수에 이 4종류의 인자를 모두 사용하는 경우, 위치 인자 - 키워드 인자 - 가변 위치 인자 튜플 - 가변 키워드 인자 딕셔너리 순으로 정의해야 합니다. 이 순서를 지키지 않을 경우, 인자 할당에 애매함이 생기므로 가변 인자는 맨 뒤쪽에 정의해야 문제가 생기지 않습니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] 값으로서의 함수와 lambda  (0) 2018.06.27
[Python] docstring  (0) 2018.06.26
[Python] pass statement  (0) 2018.06.24
[Python] 반복문 - while  (0) 2018.06.23
[Python] 반복문 - for  (0) 2018.06.22

+ Recent posts