TIL34 - Python - Function Parameters & Arguments

Peter D Lee·2020년 9월 18일
0

Python

목록 보기
1/2
post-thumbnail

오늘은 Python function에 입력할 수 있는 parameter와 arguments에 어떤 종류가 있는지, 그리고 각 종류를 어떤 순서로 function definition 및 function call에 입력해야 하는지 알아보자~


먼저 Python function 기본에 대해 recap 해봅시다.

Function Definition

def new_funtion(param1, param2):
  code block
  • Function definition 단계에서 입력하는 변수들을 parameters 라 한다
  • 위 예시에는 2개의 parameter가 있음 - param1 & param2

Function Call

new_function('first arg', 'second arg')
  • function call 단계에선 definition에 설정한 parameters 에 대한 값을 입력하는데, 이때 입력하는 값들을 arguments 라 한다
  • 위 예시에는 2개의 arguments가 있음 - 'first arg' & 'second arg'

Function Parameters & Arguments

Python에서 function argument의 종류는 다음과 같다:

  • positional arguments
  • keyword arguments
  • arbitrary positional arguments (*args)
  • arbitrary keyword arguments (**kwargs)

1. Positional Arguments

Positional argument는 "position"이 정해진, 즉 순서가 정해진 argument이다. 때문에 해당되는 parameter의 순서에 맞게 입력해야 한다.

def new_function(param1, param2):
  code block
new_function('first arg', 'second arg')
  • 'first arg'와 'second arg'는 둘다 positional arguments이며, 'first arg'는 첫 인자로, 'second arg'는 두번째 인자로 각각 입력해야만 한다

2. Keyword Arguments

Keyword argument는 argument값을 "keyword"로 지정해서 입력한다는 개념으로, 해당되는 parameter의 순서와는 다른 곳에 입력해도 되는 argument 이다

def new_function*(param1, param2):
  code block
new_function(param2='second arg', param1='first arg')
  • 위 처럼 그냥 argument 값만 입력하지 않고 해당되는 "parameter이름 = argument" 형식으로 입력하므로써 parameter 순서와는 다르게 입력해도 되는 것이다

!(Argument 순서)!
keyword argument는 순서를 바꿔서 입력해도 되지만, positional argument는 순서가 바뀌면 안되기 때문에 keyword argument는 positional argument 보다 먼저 입력되면 안된다!

틀린 경우 예시:

def new_function(param1, param2):
new_function(param2='second arg', 'first arg')
  • param2='second arg'는 keyword argument이기 때문에 positional argument인 'first arg' 뒤에 입력돼야 한다

Default Parameters

Argument를 입력 안해도 미리 설정한 default 값으로 function이 실행되게 하려는 경우, parameter에 default value를 지정하는데, 이 형식도 keyword argument다.

def new_function(param1, param2=0):
  code block
new_function('first arg')
  • 위 처럼 param2의 default value를 0으로 지정하면 function call에서 param2 argument를 입력하면 입력한 값으로, 입력 안하면 default 값인 0으로 입력 돼서 function이 실행된다

!(Argument 순서)!
Default parameter 또한 keyword argument이기 때문에 positional argument인 (default value가 지정 안된) parameter들 보다 뒤에 와야 한다.

틀린 예시

def new_function(param1=0, param2):
  code block
new_function('second arg')
  • keyword argument인 param1은 positional argument인 param2 뒤로 가야한다

3. Arbitrary Positional Arguments (*args)

사전에 몇개의 argument가 입력될 지 불분명 할 때는 arbitary argument를 사용할 수 있는데, positional argument를 갯수 제한 없이 입력 할 수 있게 하려는 경우 arbitrary positional argument를 쓸 수 있다. 이때 parameter를 *args로 입력한다.

*args는 function에 입력된 지정되지 않은 모든 positional arguments를 tuple 형식으로 arg parameter에 정리한 것이다.

def new_function(param1, param2, *args):
  print('param1: ' + param1)
  print('param2: ' + param2)
  for arg in *args:
    print('this is an arbitrary arg: ' + arg)
new_function('first arg', 'second arg', 'arg1', 'arg2')
# result:
param1: first arg
param2: second arg
this is an arbitrary arg: arg1
this is an arbitrary arg: arg2

!(Argument 순서)!
*args 도 positional argument에 해당하기 때문에 다른 keyword arguments 보다 순서가 먼저다.

4. Arbitrary Keyword Arguments (**kwargs)

*args와 같이 arguments 갯수에 제한을 두지 않으면서 positional arguments가 아닌 keyword arguments에 해당하는 경우, arbitrary keyword argument를 활용하며, 이때 parameter를 **kwargs로 한다.

**kwargs는 function에 입력된 지정되지 않은 모든 keyword arguments를 dictionary 형식으로 kwarg parameter에 정리한 것이다.

def new_function(param1, param2, **kwargs):
  print('param1: ' + param1)
  print('param2: ' + param2)
  print('kwargs: ', end=''), print(kwargs)
new_function('first arg', 'second arg', kwarg1='first kwarg', kwarg3='third kwarg', kwarg2='second kwarg')
# result:
param1: first arg
param2: second arg
kwargs: {'kwarg1': 'first kwarg', 'kwarg3': 'third kwarg', 'kwarg2': 'second kwarg'}

!(Argument 순서)!
**kwargs 도 keyword argument에 해당하기 때문에 다른 positional arguments 보다 순서가 뒤로 가야한다.

Mixing it all together!!!

이제 모든 argument 종류를 전부 동시에 사용할 경우 순서 rule을 정리해보자:

  1. positional arguments
  2. arbitrary positional arguments(*args)
  3. keyword arguments (default parameters 포함)
  4. arbitrary keyword arguments(**kwargs)
def mixed_params(age, address, *args, name="라이언", **kwargs):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)
mixed_params(20, "Seoul", "01012345678", "male", name="어피치", mobile="01012345678")
# result
name=어피치
args=('01012345678', 'male')
age=20
kwargs={'mobile': '01012345678'}
address=Seoul

Special Note on default parameters
위 예시에서 볼 수 있듯, default parameter를 arbitary arguments와 함께 사용할 경우, function call argument도 keyword argument로 입력 해줘야 한다.

  • default parameter가 keyword argument기 때문에 parameter 순서가 *args**kwargs 사이에 위치하는데, kwarg앞에 keyword 없이 argument값만 입력 할 경우 이는 arg 로 인식되고, kwarg 뒤에는 kwarg가 이미 keyword argument기 때문에 keyword 없이 입력할 수 없기 때문
  • keyword argument로 입력할 경우, default parameter에 대한 argument는 kwarg 앞으로 올 수도 있고 뒤로 갈 수도 있다. 둘다 keyword argument이기 때문

0개의 댓글