지난번 포스팅에서는 파이썬의 사용자 정의 함수를 사용하면 좋은 점, 함수를 정의하고 호출하는 기본 문법과 예제를 다루었습니다. 


이번 포스팅에서는 파이썬 함수의 입력(input) 값을 받아서 함수가 정의된 작업을 할 수 있도록 해주는 매개변수(Arguments)에 대해서 알아보겠습니다. 


함수를 호출하는데 사용하는 파이썬의 매개변수에는 아래의 4가지 유형이 있습니다. 

  • 위치 매개변수 (Positional Arguments)
  • 키워드 매개변수 (Keyword Arguments)
  • 기본값 매개변수 (Default Arguments)
  • 가변 매개변수 (Arbitrary Arguments)




이중에서 위치, 키워드, 기본값 매개변수까지만 이번 포스팅에서 소개하고, 가변 매개변수는 다음번 포스팅에서 소개하겠습니다. 



  위치 매개변수 (Positional Arguments)


위치 매개변수(Positional Arguments)는 함수 내 매개변수의 위치별 순서와 데이터 타입에 맞게 정확하게 입력을 해주어야만 하는 매개변수를 말합니다.  아래에 '2개'의 숫자를 매개변수로 받아서 평균을 계산해주는 my_avg() 라는 함수가 있다고 했을 때, 입력 매개변수로 '1개'의 숫자만을 입력받게 되었을 때 'TypeError: my_avg() takes exactly 2 arguments (1 given)' 이라는 에러 메시시가 떴습니다. 



In [1]: def my_avg(x1, x2):

   ...: avg_val = (x1 + x2)/ 2

   ...: return avg_val


In [2]: my_avg(2, 4)

Out[2]: 3


In [3]: my_avg(2) # TypeError

Traceback (most recent call last):


File "<ipython-input-3-69b7a0a22718>", line 1, in <module>

my_avg(2)


TypeError: my_avg() takes exactly 2 arguments (1 given)

 




  키워드 매개변수 (Keyword Arguments)


키워드 매개변수는 함수 호출과 관련이 있는데요, 키워드 매개변수를 이용하여 프로그래머는 함수를 호출할 때 매개변수의 이름(parameter name)으로 매개변수를 지정합니다. 


키워드 매개변수를 이용하면 함수를 정의할 때 썼던 매개변수의 입력 순서를 바꾸어서 함수를 호출할 수도 있으며, 코드 가독성도 높아지는 좋은 점이 있습니다. 


아래에 회사명(company)과 임직원 이름(name)을 출력하는 함수로 예를 들어보았습니다. 두번째 호출 예시에서 매개변수 순서를 바꾸어서 입력했음에도 불구하고 출력은 함수에서 정의했던 순서대로 출력되었음을 알 수 있습니다. 



# Keyword Arguments : The caller identifies the arguments by the parameter name

In [4]: def print_me(company, name):

   ...: print("Company : ", company)

   ...: print("Name : ", name)


In [5]: print_me(company="ABCD Co.", name="Mr.Jack")

('Company : ', 'ABCD Co.')

('Name : ', 'Mr.Jack')


# The order of parameters does not matter

In [6]: print_me(name="Mr.Jack", company="ABC Co.")

('Company : ', 'ABC Co.')

('Name : ', 'Mr.Jack')

 



만약 키워드 매개변수를 이용하지 않는 다면 입력 순서와 데이터 타입을 꼭 함수에서 정의한 순서와 맞추어 주어야 합니다. 아래의 2번째 예에서 보면 함수를 호출할 때 매개변수의 입력 순서가 바뀌면 함수를 정의할 때와의 의도와는 다르게 엉뚱한 순서로 값이 출력되었습니다. 



In [7]: print_me("ABCD Co.", "Mr.Jack")

('Company : ', 'ABCD Co.')

('Name : ', 'Mr.Jack')


# Without parameter name, the order matters

In [8]: print_me("Mr.Jack", "ABCD Co.")

('Company : ', 'Mr.Jack')

('Name : ', 'ABCD Co.')

 




  기본값 매개변수 (Default Arguments)


기본값 매개변수는 함수를 호출할 때 매개변수 입력이 없을 경우에 함수를 정의할 때 입력한 기본값(default value)을 사용할 수 있게 해줍니다.  함수를 정의할 때 기본값 설정이 안되어 있는 상태에서 함수 호출 시 매개변수 값 입력을 빼먹으면 TypeError가 나는데요, 기본값 매개변수를 사용하면 TypeError 없이 사용할 수 있게 됩니다. 대신, 기본값 설정을 잘 지정해주어야 겠지요. 


아래의 예에서는 name 매개변수에 "Who?"라는 기본값(default value)을 지정해서 함수를 print_me2 라는 함수를 정의를 했구요, 함수 호출 시 name 매개변수 값을 입력하지 않았더니 => 기본값이 "Who?"가 출력되었네요. 



# Default Argument Value

In [9]: def print_me2(company, name="Who?"):

   ...: print("Company : ", company)

   ...: print("Name : ", name)


In [10]: print_me2(company="ABC Co.") # No TypeError

('Company : ', 'ABC Co.')

('Name : ', 'Who?')

 



단, 기본값 매개변수는 매개변수의 첫번째에는 사용할 수 없습니다. 만약 첫번째 매개변수에 기본값을 지정하려고 하면 아래처럼 'SyntaxError: non-default argument follows default argument)' 라는 에러가 발생합니다. 



# SyntaxError: non-default argument follows default argument

In [11]: def print_me2(company="ABCD Co.", name):

    ...: print("Company : ", company)

    ...: print("Name : ", name)

    ...:

    ...:

File "<ipython-input-11-c9e7590bf632>", line 1

def print_me2(company="ABCD Co.", name):

SyntaxError: non-default argument follows default argument

 



마지막으로, 매개변수는 숫자로 시작할 수 없습니다. 아래처럼 '3_company' 처럼 숫자 '3'으로 매개변수 이름을 시작했더니 'SyntaxError: invalid syntax'라는 에러가 떴습니다. 



In [12]: def print_me3(3_company, name):

    ...: print("Company : ", company)

    ...: print("Name : ", name)

    ...:

    ...:

File "<ipython-input-12-46388f3578d8>", line 1

def print_me3(3_company, name):

^

SyntaxError: invalid syntax

 



다음번 포스팅에서는 가변 매개변수(arbitrary arguments)에 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 


Posted by R Friend R_Friend