TIL DAY.12-1 Function Parameters Assignment

kyman19940214·2020년 8월 20일
0
  1. 이번 과제는 programming 과제가 아니라 개념을 이해하고 설명하는 과제 입니다.
    함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다.
    왜 안돼야만 하는지 생각해보시고 블로깅 하여 채널에 공유해 주세요.

Answer
def example(arg1, arg2, arg=none, arg="value", arg=[], *arg, **arg)

  1. positional parameter (arg1, arg2)

  2. optional parameter (arg=none)

  3. keyword parameter (arg="value")

  4. list parameter (arg=[])

  5. keyword-only (*arg)

  6. var-keyword parameter (**arg)

위와 같이 파이썬 함수에서는 arguments들을 처리하는 순서가 미리 정해 있습니다. 그렇기 때문에 아래와 같이 default value parameter를 non-default value parameter 앞에 정의하게 되면 syntaxError가 납니다. 예를 들어 love_you 함수 호출 시 position arg를 먼저 받아오는 과정에서 이미 my_name에 default 값으로 정의 되어 있는 "정우성" 때문에 갈 자리를 잃고 error가 나는 것입니다.

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

문제 해결방법

이 코드를 실행하면 일단 name = 정우성 까지는 정상적으로 작동이 됩니다 하지만 두번째 parameter에 있는 *args인 가변 인수 위치 때문에 에러가 나게 됩니다. variable length arguments는 가변의 길이를 받는 인자임으로 번호,도시까지만 받도록 코딩하였지만 자연스럽게 숫자 20까지 함께 들어가게 되어 age값을 정의할 수 없게 되면서 오류가 나는 것입니다.

이를 해결하기 위해서 age 값을 age =20로 keyword를 정의해줘야 합니다. 아래는 해결 후 호출 된 결과 값 입니다.

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)

name=정우성
args=('01012341234', 'seoul')
age=20

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

문제해결방법

현재 arguments의 순서를 보면
1. non-default posit
2. non-default posit
3. var-keyword parameter
4. default keyword
이다 그렇기 때문에 3번과 4번의 위치를 바꾸면 함수가 인수를 호출 하는 순서를 맞추며 결과가 정상적으로 출력되는 것을 볼 수 있습니다.

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

name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

  1. 위치 인수와 키워드 가변 키워드 인수 (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")

문제해결방법
https://getkt.com/wp-content/uploads/2019/02/python-function-definition-arguments-kind-and-order.jpg

위의 그림을 보면 age는 position argument, name=아이유는 defalut argument, *args는 variable length positional arguments, address는 keyword-only arguments 마지막으로 **kwargs는 variable length keyword agruments입니다. 그래서 parameter의 호출 순서에 맞게 정렬 한다음 keyword들의 자리도 적절하게 변경해주면 아래와 같은 답이 출력 됩니다.

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"  ,address="seoul",mobile="01012341234")

name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

profile
행복한 프론트엔드 개발자

0개의 댓글