[TIL_Python]52.More Complex Function Parameters

HYEYOON·2021년 1월 19일
0
post-thumbnail

52. More Complex Function Parameters

사전에 정확히 필요한 parameter수와 구조를 알 수 없는 경우
(자꾸 옵션이 추가되는 경우. ex)자동차 옵션)

1. dictionary를 parameter로 받는 방법.

def buy_A_car(options):
    print(f"다음 사양의 자동차를 구입하십니다:")


    for option in options:
        print(f"{option} : {options[option]}")


options = {"seat" : "가죽", "blackbox" : "최신"}


buy_A_car(options)


> 다음 사양의 자동차를 구입하십니다:
seat : 가죽
blackbox : 최신

원하는 옵션만 간단하게 설정 할 수 있다는 장점은 있지만 옵션을 dictionary로 받아야만 한다는 제약사항이 있다. 만일 옵션을 하나도 추가 안하고 기본사양으로 사는 경우에도 비어있는 dictionary를 넘겨줘야 한다. 게다가 dictionary가 아닌 다른 타입의 값 (예를 들어 string)을 넘겨주는 오류가 생길 확률도 있다.
따라서 파이썬에는 Keyworded variable length of arguments 라는 기능이있다.

Keyworded variable length of arguments

이름 그대로 keyword arguments인데 수가 정해지지 않고 유동적으로 변할 수 있는 것 .
선언하기 위해서는 parameter이름앞에 **를 위치시킨다.

일반 Keyword arguments와의 차이점

  • Argument 수를 0부터 N까지 유동적으로 넘겨줄 수 있다.
  • Keyword가 미리 정해져 있지 않기때문에 원하는 keyword를 유동적으로 사용할 수 있다.
  • Keyworded variable length of arguments는 dictionary 형태로 지정된다.

일반적으로 이름을 **kwargs라고 정한다 .

Non-keyworded variable length of arguments

keyword를 사용하지 않고 순서대로 값을 전달하는 방식도 가능하다.=variable arguments
선언방법은 별 2개 대신 별 1개!

Mixing args and kwargs

Variable arguments와 keyworded variable arguments 둘다 사용

def do_something(*args, **kwargs):
     ## some code here...
     ....

둘다 사용하면 어떠한 형태와 수의 argument도 허용가능한 함수가 된다.
굉장히 유동적인 함수가 된다.

do_something(1, 2, 3, name="정우성", age=45)
do_something(1, 2, 3, 4, 5, "hello", {"주소" : "서울", "국가" : "한국"})
do_something(name="정우성", gender="남", height="187")
do_something(1)
do_something()

문제

함수 2개를 구현해주세요. 함수의 이름은 다음과 같아야 합니다.

  • sum_of_numbers
  • what_is_my_full_name

함수 sum_of_numbers는 arugment로 주어지는 모든 수를 합한 값을 리턴해야 합니다.

예를 들어, sum_of_numbers(1, 2, 3, 4, 5) 는 15를 리턴해야 하고 sum_of_numbers(1,2)는 3을 리턴해야 합니다.

만일 parameter가 주어지지 않으면 0을 리턴해야 합니다.

what_is_my_full_name 함수는 주어진 parameter중 first_name 과 last_name 이라는 parameter를 조합하여 full name을 리턴해주어야 합니다.

예를 들어, first_name이 "우성" 이고 last_name 이 "정" 이면 "정 우성" 라고 리턴하면 됩니다.

Last name과 first name 사이에 space(빈칸)이 들어가 있어야 합니다.

만일 last_name이 없거나 first_name이 없으면 둘 중하나만 리턴하면 됩니다.

예를 들어, last_name이 없으면 "우성" 이라고 이름만 리턴하면 됩니다,

마지막으로, last_name과 first_name 둘다 없으면 "Nobody" 라고 리턴하면 됩니다.

나의 답:

def sum_of_numbers(*arg):
  total =0
  if len(arg) == 0:
    return total
  else:
    for i in arg:
      total += i
    return total
def what_is_my_full_name(**kwargs):

  if "first_name" in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]} {kwargs["first_name"]}"""
  elif "first_name" not in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]}"""
  elif "first_name" in kwargs and "last_name" not in kwargs:
    return f"""{kwargs["first_name"]}"""
  else:
    return "Nobody"
profile
Back-End Developer🌱

0개의 댓글