[Python] Function Parameters

바울·2022년 6월 23일
0

Parameters, Arguments에 간단한 오류에 대해 알아보고자 한다.

함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유?

def love_you(my_name = "정우성", your_name): 
    print(f"{my_name} loves {your_name}") 
   
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

여기서 변수명을 같이 입력하지 않은것이 non-default value parameter 이고 변수명과 함께 입력된 것이 default value parameter이다. default value parameter를 non-default 앞에 정의하게되면 SyntaxError 에러가 뜨게된다. 내가 생각해본 이유는 함수에 있는 고정값을 non-default에 할당시켜야 하는데 앞에있는 default에 먼저 할당시켜서 non-default에 할당시킬 값이 없어서 오류가 뜨는 것 같다.
non-default - default - non-default 순으로 출력을 해보았지만 역시 똑같은 에러가 뜬 것 으로보아 non-default에 할당시킬 값이 default에 할당시켜서 오류가 나는 것 같다.

위치 인수(positional arguments)와 가변 인수(variable length arguments)

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)

우선 위에 코드를 출력하면 TypeError가 뜨게된다. 위치 인수랑 가변 인수에 오류가 있어서 그러는 거 같다.

위치인수?

위치 인수란 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미하며, 가장 자주 사용되는 방식입니다.

가변인수?

가변 인수란 인수의 개수가 변할 수 있다는 의미이며, 가변 인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미합니다.

위치인수랑 가변인수에 에러를 확인해보고 코드를 수정해 보았다.

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("정우성", "01012341234", "seoul", 20)

args의 위치를 끝으로 옮겼는데 정상 출력이 된다 이유는 args 가변인수를 매개변수 사이에 위치하게되면 1~10까지 숫자가 있으면 1은 name에 할당 되겠지만 나머지 값이 args에 할당되어 age에 할당되는 값이 없어서 에러가 발생하는 것이다. 가변인수는 맨 마지막에 입력해서 함수를 만들도록하자.

가변 키워드 인수 (variable length keyword arguments)

가변 키워드 인수?

가변 인수와 더불어 함수에서 입력값이 몇 개가 될지 모를 때 사용할 수 있는 또 다른 방법으로 가변 키워드 인수를 사용하는 방법이 있다. 가변 키워드 인수는 가변 인수랑 다르게 앞에 **을 두개붙여 사용한다. 가변 인수랑 다르게 튜플이 아닌 딕셔너리 형태로 할당된다.

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")

위에 코드는 SyntaxError가 뜬다. 이유는 가변인수가 에러가 생긴 이유를 생각해보면 된다. 가변인수나 가변 키워드 인수는 맨뒤에 와야한다.(예외도있음) 그러므로 **kwargs랑 address=0 위치를 서로 바꿔주면 에러는 해결된다.

위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)

def mixed_params(age, name="아이유", address, *args, **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")

가변인수랑 가변 키워드랑 동일하게 args, kwargs를 맨뒤로 보낸 후 작동을 해봤지만 에러가 나왔다. 검색해보니 eyword-Only arguments라고 부르는 특수 인자값으로 이는 *args보다는 뒤에 위치해야 한다고 한다.

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개의 댓글