Function Parameters 문제

chaerin·2021년 1월 14일
0

PYTHON

목록 보기
13/17

🔆🔆 머리를 '탁'치게 만드는 요약짤

1. 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다. 왜 안될까?

ex1)
def love_you(my_name, your_name): 
   print(f"{my_name} loves {your_name}") 
     
love_you("아이유", "정우성")
실행결과
아이유 loves 정우성

🔸 ex1은 모두 defualt value parameter 이므로 인자 입력 순서대로 결과값을 출력한다.

ex2)
def love_you(my_name, your_name="아이유"): 
   print(f"{my_name} loves {your_name}") 
     
love_you("정우성")
실행결과
정우성 loves 아이유

🔸 ex2는 your_name="아이유"라는 non-default value parameter를 선언하였고 인수는 "정우성"만을 할당하여 위와 같은 결과를 출력하였다.

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

🔸 하지만 위와 같이 non-default value parameter를 default value parameter보다 앞에 선언하게 되면 아래와 같은 에러 메시지가 뜬다.

SyntaxError: non-default argument follows default argument

🔸 love_you 함수 호출 시, position arguement 로직에 따라 인자로 받은 값 "정우성"을 "my_name"에 대입을 하려고 하는데, "my_name"에는 이미 "아이유"라는 default value가 있기 때문에 충돌이 발생하게 된다.
따라서 SyntaxError에서 non-default argument가 default argument의 뒤에 나왔다라는 에러 메시지가 뜨게 되는 것이다.

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)

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

위와 같은 에러가 뜬다. 위 함수에서 리스트 가변 매개 변수 *args가 일반 매개 변수인 age의 앞에 위치해 있음으로서 생긴 에러이다.

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

따라서 위와 같이 함수를 수정한 뒤 호출하면 원하는 출력을 확인할 수 있다.

🔸*args(리스트 가변 매개 변수)가 고정 매개변수보다 앞쪽에 오면 안된다. 매개변수 순서 상 *args는 반드시 가장 뒤쪽에 와야 한다.


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)

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

🔸 여기에는 mobile="01012341234"address="seoul" 두 키워드 인수가 있다. 키워드가 없는 인수 "정우성", "20" 은 매개 변수 순서대로 값을 배정하게 되고 키워드 인수는 그에 맞는 매개변수에 값을 배정하게 된다.

🔸 따라서 함수를 통해 출력하고자 하는 값들을 보면 name, age, kwargs, address=0에 각각 "정우성", "20", mobile="01012341234", address="seoul"이 할당되어야 할 것이다.

🔸 키워드 인수를 사용하는 가변 인수 함수는 매개변수 앞에 **를 붙여야 하기 때문에 kwargs 앞에 **을 붙여서 가변 인수 함수로 만들어 준다.

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


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

매개 변수 순서에 대한 중요성을 다시 한 번 깨달은 문제였다.......

  1. Regular Positional Arguments age
  2. Default Arguments name="아이유"
  3. Variable Length Positional Arguments *args
  4. Keyword-Only Arguments
    4-1. Non-Default Keyword-Only Arguments address
    4-2. Keyword-Only Arguments With Defualts
  5. Variable Lenth Keyword Arguments **kwargs

위 순서에 맞춰 매개변수들을 아래와 같이 재배열하면 원하는 출력값을 얻을 수 있다.

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

참고자료 https://getkt.com/blog/python-keyword-only-arguments/

0개의 댓글