Python ... value parameter

Mun Lee·2020년 6월 24일
0

1.non-default value parameter가 default value parameter 앞에 있어야 하는 이유

default은 초기화값이다. 예를 들어 2개의 인자를 받을때 하나는 계속 똑같고 , 하나만 바꾸고 싶을떄 default값을 설정해주면 코드의 가독성이 올라갈 것이다.

함수 parameter에 default값을 미리 선언해줄수도 있다.

def multiply(a,b=5):
    print(f'{a} * {b}')
def plus(a=5,b):
    print(a+b)

이렇게 하였을때, a값은 5로 고정이 된다. 물론 a에 다른 값을 주어도 괜찮다. 이로인해 문제가 발생하게된다.

def multiply(a=5,b):
    print(f'{a} * {b}')

이렇게 선언하게 되면
SyntaxError: non-default argument follows default argument

이런 오류를 얻게 되는데 이는 multiply(6)을 하면 (1)에는 a=6으로 전달되서 오류가 뜨지 않지만 (2)에는 이 6이 a인지 b인지 알수가 없다. 그래서 default 값은 뒤에 있어야 한다.

2.위치 인수(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)

가변인수는 1개부터 여러개의 인자값을 얻을 수 있다.Packing은 묶는 것을 의미하고 Unpacking은 그 반대를 의미한다. *args을 통해서 여러가지를 저장할수 있게 되고 출력할떄 묶어놓은것을 풀어놓으므로 Unpacking이라고 할 수 있다.

def plus(a,*args):
    sum = a
    for i in args:
        sum = sum + i
    return sum

plus(3,4,5)를 하면 12라는 출력값을 얻게 된다.

함수에 입력해줄떄 args는 Packing ,값을 출력할떄의 args는 Unpacking

func_param_with_var_args("정우성", "01012341234", "seoul", 20)
에서 나타나는 오류? *args는 가변인자로 1개뿐만 아니라 여러개의 인자를 얻을 수 있게 된다. 그렇지만 가변인자의 위치는 맨 뒤로 제한적인데 이유는 가변인자의 범위가 어디까지인지를 알 수가 없기 때문이다. 1개인지 2개인지 앞에 선언되어 있으면 그 코딩을 짠 사람만 알 수 있을것이다.

그래서 저 코딩에서 가변인자가 중간에 있기 때문에 오류가 난 것이고

def func_param_with_var_args(name, age, *args):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("args=",end=""), print(args)
 이렇게 짠다면
 name=정우성
age=20
args=('01012341234', 'seoul') 

이렇게 하면 에러가 없어진다.

3.가변 키워드 인수 (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)

kwargs또한 가변인자인데 args와 차이점은 args은 튜플의 형태로 받는다면 kwargs는 딕셔너리 형태로 받는다는 것이다. 여기서 나오는 에러는 가변인자가 앞에 있기 때문이다.여기서 그냥 address만 입력받았다면 튜플의 형태이기 때문에 오류가 발생하지 않았을것이다.

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

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

이렇게 코드를 바꿔서 수정하는 방법이 있다.
address="seoul"도 딕셔너리와 같은 방식이 선언방식이기 때문에 어디까지가 kwargs인지 알수가 없기떄문에 일어난 오류다.

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

address값을 주고 하는것도 방법이다.

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

def mixed_params(name="wecode", *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)

여기서도 에러가 발생하게 되는데

def mixed_params(age,address,name="wecode",*args, **kwargs):
   print("age=",end=""), print(age)
   print("address=",end=""), print(address)
   print("name=",end=""), print(name)
   print("args=",end=""), print(args)
   print("kwargs=",end=""), print(kwargs)

이렇게 수정하면 에러는 사라지게된다. args는 튜플의 형태 kwargs는 딕셔너리의 형태로 받는다는걸 잊어서는 안된다.kwargs는 key값도 같이 저장하는 점에서 args와의 차이점을 보인다고 할 수 있다.
mixed_params(20,"seoul", "정우성", "01012341234", "male" ,mobile="01012341234")
->address=seoul
age=20
name=정우성
args=('01012341234', 'male')
kwargs={'mobile': '01012341234'}

profile
개발자가 되고자 하는 30살

0개의 댓글