[Python] Function arguments

^_^·2022년 6월 22일
0
post-thumbnail

default value parameter

default value parameter란 parameter에 기본값을 주는 방법이다. parameter을 따로 지정하지 않아도 함수가 실행된다.

default value parameter와 non-default value parameter

default value paramete가 non-default value parameter의 뒤에 와야 하는데 그이유는 만약 default value paramete를 앞에 사용하게 되면 전달해준 parameter값이 default parameter인지 일반 parameter인지 알 수 없기 때문이다.

position parameter와 variable length parameter

위치 인수(positional arguments) 란 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미한다.


def number(a, b, c):
	print(a, b, c)
number(3, 2, 1)

출력

3 2 1

가변 인수(variable length arguments) 란 함수에 전달되는 값의 개수가 달라질 수 있는 인수를 의미한다. 함수 호출시 인수의 개수를 다양하게 바꿔가며 사용할 수 있다는 뜻이다.


def find_sum(*args):
    sum = 0
    for i in args:
        sum += i
    print('sum: {0}'.format(sum))
    
find_sum()
find_sum(1, 2, 3)
find_sum(1, 2, 3, 4, 5)

출력
0
6
15

아래 코드를 실행하면 에러가 나온다. 첫번째 "정우성"의 경우 name parameter에 들어 가겠지만 중간에 위치해 있는 가변인수의 경우 전달하는 값이 어디까지 전달되는지 알 수 없다.


def func_param_with_var_args(name, *args, age):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul", 20)

위 에러를 해결하기 위해 가변인수를 마지막에 넣었다. 마지막에 넣게되면 "정우성" , 20은 name과 age에 전달되고 나머지 두 값은 *args에 튜플 형태로 전달되게 된다.


def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", 20, "01012341234", "seoul")

출력
name=정우성
args=('01012341234', 'seoul')
age=20

또 다른 방법은 인자의 기본값을 지정하는 방법이다.


def func_param_with_var_args(name, *args, age = 20):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args)
    print("age=",end=""), print(age)

func_param_with_var_args("정우성", "01012341234", "seoul")

출력
name=정우성
args=('01012341234', 'seoul')
age=20

가변 키워드 인수 (variable length keyword arguments)
**kwargs를 사용하면 key와 value 형태의 데이터를 인자로 전달 할 수 있다.

아래의 함수 마지막 parameter를 보면 address=0으로 기본값을 지정한 default value parameter인 동시에 키워드 인수이다. 그런데 가변 키워드 인수로 지정한 **kwargs가 앞에 와있기 때문에 key와 value로 전달된 값들이 **kwargs로 전달되어 문제가 생긴다.


def func_param_with_kwargs(name, age, **kwargs, address=0):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

default value parameter를 가변 키워드 인수 앞으로 배치해 해결할 수 있다.


def func_param_with_kwargs(name, age, address=0, **kwargs):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(address)

func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")

출력
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

다른 에러코드를 보자.


def mixed_params(name="아이유", *args, age, **kwargs, address):
    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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

뒤죽박죽이다. 위에서 확인한 내용을 토대로 parameter의 배치를 다시 해보자. 이번엔 Keyword-Only Arguments(키워드 전용 인수)가 있다. 키워드 전용인수는 파이썬 함수의 강력한 기능이다. 키워드 전용 인수는 키워드로만 넘길 수 있고 위치로는 넘길 수 없다. 함수 호출의 의도를 더 명확하게 해주고 가변인수 뒤에 사용할 수 있다.


def mixed_params(age, name="아이유", *args, address, **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, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")

0개의 댓글