default value parameter vs non-default value parameter

김현우·2020년 7월 21일
0

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


default value parameter는 함수가 호출될때 파라미터에 인자를 받아 넘겨준다.

non-default value parameter는 함수가 호출될때 파라미터에 인자를 받아 넘겨줄 수 도 있고, 인자를 넘겨주지 않아도 keywordname-value 형식으로 선언하여 지정된 value를 넘겨줄 수 있다.

def love_you(my_name = "정우성", your_name): 
    print(f"{my_name} loves {your_name}") 

코드를 실행하게 되면,

위와 같은 에러가 발생한다.
그 이유는 무엇일까?😅
살펴보도록 하자.

파이썬에서 파라미터를 받는 순서는 다음과 같으며 이 순서를 지키지 않으면 오류가 발생한다.

def example(a,b,c=None, r="w",d=[],*ae,**ab)

a,b : positional parameter
c=none : optional parameter
r="w" : keyword parameter
d = [] : list parameter
*ae : keyword-only
**ab : var-keyword parameter

파라미터를 정의하는 순서 없이 무작위로 생성 시 함수는 어떤 파라미터에 어떤 값을 받아야 될지 정할 수 없기 떄문.

참고자료

args와 kwargs에 대해 알아보자!

args는 정해지지 않은 수의 튜플 자료형 (일반)파라미터를 받는다.
( Variable Length Positional Arguments)

kwargs는 정해지지 않은 수의 딕셔너리 자료형 키워드파라미터를 받는다.
(Variable Length Keyword Arguments)


문제1 )

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)

다음 코드를 실행하여보면

에러가 발생한다.

에러가 발생한 이유는 파라미터의 순서에 있다.
position인수가 먼저오고 그 다음에 variable length가 와야한다.

Regular positional args -> Default args -> Variable length positional args -> Non-default args -> Keyword-Only args with default -> Variable length kwargs**

순서로 컴퓨터가 읽어들이기 때문이다.

Solution1 )

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

결과1 )

Solution2 )

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", age=20)

또는 Non-Default Keyword-Only Argumentage 에 값을 할당해서 함수를 호출해도 된다.

결과2 )


문제2 )

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

다음 코드를 실행하여보면

에러가 발생한다.

에러가 발생한 이유는 함수의 위치 순서가 잘못되었기 때문이다.
1. position인자nameage
2. Keyword-Only Argumentsaddress=0
3. Variable Length Keyword Arguments인자 **kwargs
순으로 되야한다.

Solution )

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

결과 )


문제3 )

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

다음 코드를 실행하여보면

에러가 발생한다.

에러가 발생한 이유는 인자들이 서로 위치를 찾지 못하기 때문!

  1. Keyword-Only Argumentaddress가 올바른 위치를 찾지 못함.
    (Keyword-Only Argument는 Variable Length Keyword Arguments 앞에와야함)
  2. position인자인 age가 앞으로 이동되야함.

Solution )

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

결과는 다음과 같이 나온다.

profile
코딩을 잘하는 개발자가 되자!

0개의 댓글