TIL[48]. Python_ More Complex Function Parameters

jake.log·2020년 8월 23일
1

Python

목록 보기
30/39

30.More Complex Function Parameters

1.Handling unknown number of arguments

사전에 정확히 필요한 parameter 수와 구조를 알수 없는 경우는 어떻게 해야할까?

가장 간단한 방법은 다음처럼 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)을 넘겨주는 오류가 생길 확률도 있다.

2.Keyworded variable length of arguments

그래서 파이썬에서는 keyworded variable length of arguments 라는 기능이 있다.

Keyworded variable length of arguments는 이름 그대로 keyword arguments 인데
그 수가 정해지지 않고 유동적으로 변할 수 있는 keyword arguments 입니다.

Keyworded variable length of arguments를 선언 하기 위해서는 parameter 이름앞에 두개의 별표 (**) 로 시작해야 합니다.

예시)
**options

그리고 함수를 호출할때 일반적인 keyword arguments 처럼 사용하면 된다.
일반적인 keyword arugments와의 차이점은

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

Keyworded variable length of arguments를 사용할때 일반적으로 argument 이름을 kwargs 라고 짓는다. 그래서 대부분 **kwargs 라고 parameter 이름을 정한다.

앞서 keyworded variable length of arguments는 dictionary 형태로 지정된다고 배웠다.

예시)

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

    for option in kwargs:
        print(f"{option} : {kwargs[option]}")
#호출을 할때 다음 처럼 호출 할 수 있다

buy_A_car(seat="가죽", blackbox="최신", tint="yes")

#그러면 kwargs 파라미터는 다음과 같은 dictionary로 함수에 전해지게 된다:

{'seat': '가죽', 'blackbox': '최신', 'tint': 'yes'}
#그러므로 함수 body 안에서는 dictionary를 사용하듯이 kwargs를 사용하면 된다.

3.Non-keyworded variable length of arguments

Keyworded variable length of arguments와 동일하지만 keyword 를 사용하지 않고 순서대로 값을 전달하는 방식도 가능하다.

그건 Non-keyworded variable length of arguments 혹은 그냥 variable length of arguments 라고 한다.

더 간단하게 variable arguments 라고 하기도 한다.

Variable arguments를 선언하는 방법은 별표 2개 대신에 1개를 사용해서 선언합니다.
그리고 variable arguments는 tuple로 변환되어 함수에 전달된다.

4.Mixing args and kwargs

Variable arguments와 keyworded variable arguments 둘다 사용하여 함수를 정의할 수 도 있다.

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

그렇다면 왜 둘다 사용할까?
둘다 사용하면 어떠한 형태와 수의 argument도 허용 가능한 함수가 ehls다.
parameter에 있어서 굉장히 유동적인 함수가 된다.

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

Assignment

함수 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" 라고 리턴하면 됩니다.

My solution

def sum_of_numbers(*args):
    sum = 0
    if args == 0:
      return 0
    for i in args:
      sum += i
    return sum
   
   
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" in kwargs and "last_name" not in kwargs:
    return f"""{kwargs["first_name"]}"""
  elif "first_name" not in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]}"""
  else:
    return "Nobody"

Model_solution

def sum_of_numbers(*numbers):
  return sum(numbers)
 
def what_is_my_full_name(**kwargs):
  print(kwargs.keys())
  if "first_name" in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]} {kwargs["first_name"]}"""
  elif "first_name" in kwargs and "last_name" not in kwargs:
    return f"""{kwargs["first_name"]}"""
  elif "first_name" not in kwargs and "last_name" in kwargs:
    return f"""{kwargs["last_name"]}"""
  else:
    return "Nobody"
   
print(what_is_my_full_name(first_name="우성", last_name="정"))
profile
꾸준히!

0개의 댓글