Python def(default value parameter)

박상영·2020년 5월 26일
0

Python 에서 def(함수) 의 인자들의 사용방법 을 알아보려고 한다.

def func(x):
	본문n
    return value

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

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

위의 코드를 실행하면

example("wecode", "12312415", "seoul", 20)
Traceback (most recent call last):
  File "<pyshell#344>", line 1, in <module>
    example("wecode", "12312415", "seoul", 20)
TypeError: example() missing 1 required keyword-only argument: 'age'

TypeError가 발생하게 된다. 그 원인이 무엇인지 알아보면,
위에 "age"는 keyword-args가 아닌 positional-args 입니다.
이 example의 함수에 주어진 parameter를 읽을려면 컴퓨터의 읽는 순서를 알고있으면 된다.

컴퓨터가 읽게되는 순서
Regular positional args -> Default args -> Variable length positional args -> Non-default args -> Keyword-Only args with default -> Variable length kwargs**

이 순서에 따르면 age는 keyword-args가 아닌 positional-args 이기때문이다.
example의 함수를 동작시키려면 age의 위치 와 example(default)의 값의 위치를 바꾸어주면된다. 그렇게하면 age는 positional-args의 위치에 있어서 20 이라는 숫자를 입력받을수 있게된다.

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

이렇게 바꾸어서 동작을 한번해보면

example("wecode", 20, "12312415", "seoul")

name=wecode
agrs=('12312415', 'seoul')
age=20

이제 정상적인 동작을 하는 모습을 볼수있다.
물론 age를 keyword인자로 바꿔서 출력또한 할수있다.

def example(name, *args, age=20):
    print("name=", end=""), print(name)
    print("agrs=", end=""), print(args)
    print("age=", end=""), print(age)
example("wecode", "12312415", "seoul")

name=wecode
agrs=
('12312415', 'seoul')
age=20

하지만 "args"의 출력이 이상하게 보인다. 위에서 end=""의 의미는 다음줄의 값을 한줄에 같이 출력한다는 의미를 가지고있다. 그렇게되면

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

이러한 형식이란걸 알수있다. 하지만, 실제로 해보면

SyntaxError: invalid syntax

Error가 발생하는걸 볼수있다. 가변위치인수 뒤에 오는 keyword인 age의 출력순서를 바꿔서 출력해보았다.

def example(name, *args, age=20):
	print("name=", end="")
	print(name)
	print("age=", end="")
	print(age)
	print("args=", end="")
	print(args)
    
example("wecode", "12313", "51323")
name=wecode
age=20
args=('12313', '51323')

이렇게 "age"의 출력순서를 바꿔서 작성을 하니 "args"에 쓰였던 end=""가 정상작동 하는것을 알수있다.

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

이번엔 positional args, Keyword-only args with defaults 와 variable length kwargs를 사용해보았다.

def variable_keyword(name, age, **kwargs, address=0):

하지만 이 함수는 print로 넘어가기도 전에 SyntaxError가 발생할것이다.
함수의 parameter 순서가 알맞지않기때문이다. 가변 키워드 인수(**kwargs)는 제일 마지막에 읽어들이기 때문에 Keyword-only args with defaults인 address가 앞서 나와야 정상적이게 된다. 순서대로 작성을 하면

def variable_keyword(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)
    
variable_keyword("wecode", "20", mobile="01234567", address="seoul")
name=wecode  # 출력값
age=20
kwargs={'mobile': '0123456'}
address=seoul

정상작동 하는것을 볼수있다. 또한 address에 값이 주어지지않아도 된다.

def variable_keyword(name, age, address, **kwargs):

이렇게 작성을 해도

variable_keyword("wecode", "20", mobile="0123456", address="seoul")

"address"에 keyword의 default값을 주기 때문에 정상작동 한다.

def mix_parameter(name="wecode", *args, age, **kwargs, address):

이번 함수에 주어진 parameter 값이 위에 보았던것보다 많이 섞여있는것을 볼수있다. 먼저 순서만 제대로 된다면 kwargs with default인 "name"의 parameter가 먼저 주어져도 되지만, 뒤에 positional args 가 있기때문에 잘못된 함수이다.
이를 순서대로 고쳐보자면

def mix_parameter(age, *args, name="wecode", **kwargs, address):

가 된다 하지만 단순히 positional args만 고쳤다고해서 되지 않는다. "kwargs"는 가변 키워드 인수 이기때문에 제일 마지막으로 가야한다.

def mix_parameter(age, *args, name="wecode", address, **kwargs):

이렇게 다 바꿔서 코드를 작성해보았다.

def mix_parameter(age, *args, address, name="wecode", **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)
    
mix_paramter(25, "wecode", "01010234", "male", mobile="01049193208", address="seoul")
#출력
name=wecode   
args=('wecode', '0101010101', 'male')
age=25
kwargs={'mobile': '01049193208'}
address=seoul

정상적으로 입력하고싶은 값이 제대로 들어간것을 확인할수있다.
"address"의 위치를 "name"과 바꾼이유는 정상작동을 하지만, 가독성을 위해 바꿔보았다.

profile
backend

0개의 댓글