Python 공부하기 4 - Function Parameters

김우식·2022년 5월 25일
0

함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유에 대해 생각해보시고 블로깅 해주세요.

위치 인수가 parameter에 할당될 때 왼쪽에서 오른쪽 순서의 방향성이 존재한다. 따라서 default value parameter를 non-default value parameter앞에 정의하고 argument를 1개만 전달하면 해당 argument는 default value parameter에 할당되므로 non-default value parameter는 할당받는 값이 없어서 오류를 발생하게 된다.

위치 인수(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)
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

예제의 함수를 실행시, 아래의 'age'에 인자가 호출되지 않았다는 오류가 발생한다. age는 keyword arguments인데 age의 값인 20에 keyword인 age를 달아주지 않아서 이다.

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

위와 같이 수정하면 정상실행 된다.

가변 키워드 인수 (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")
  File "main.py", line 1
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax

코드 실행시 SyntaxError: invalid syntax, '파이썬(Python)에서는 쓰지 않는 문법'이라는 에러가 발생한다.
**kwargs는 keyword arguments이고, keyword arguments는 다른 arguments의 뒤에 두어야 에러가 발생하지 않는다.

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

위처럼 코드를 수정해주면 정상적으로 잘 작동하게 된다.

위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치를 위치를 참고 자료를 통해 조사해서 어떤 에러가 발생 하는지 확인하고, 에러를 고쳐 정상적으로 출력되는 결과를 블로그에 정리해 주세요.

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")
  File "main.py", line 1
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax

위의 코드를 실행시켜보니 이번에도 문법에 맞지 않다는 에러가 발생한다. non-default parameter 인 age, address 를 앞으로 옮기고 default parameter 를 다음으로, 가변인수 들을 마지막에 위치 시켰다.

def mixed_params(age, address, name="아이유", *args, **kwargs):
Traceback (most recent call last):
  File "main.py", line 8, in <module>
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
TypeError: mixed_params() got multiple values for argument 'address'

이번엔 구문에러가 아닌 address argument 가 여러 값을 가진다고 나온다. 가변인수 *args 때문에 positional argument 값들이 keyword argument 값과 충돌하는 것 같다.

def mixed_params(age, name="아이유", *args, address, **kwargs):

default Keyword Arguments인 adress를 non-default Keyword Argument인 *args의 뒤로 보내면 정상실행 된다.

profile
반가워요!

0개의 댓글