사전에 정확히 필요한 parameter수와 구조를 알 수 없는 경우
(자꾸 옵션이 추가되는 경우. ex)자동차 옵션)
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 라는 기능이있다.
이름 그대로 keyword arguments인데 수가 정해지지 않고 유동적으로 변할 수 있는 것 .
선언하기 위해서는 parameter이름앞에 **
를 위치시킨다.
일반적으로 이름을 **kwargs
라고 정한다 .
keyword를 사용하지 않고 순서대로 값을 전달하는 방식도 가능하다.=variable arguments
선언방법은 별 2개 대신 별 1개!
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는 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"