Different types of function parameters (*args, **kwargs, keyword-only arguments)

김하성·2021년 1월 17일
0
post-thumbnail

Function Parameters

Keyworded variable length of arguments (kwargs)

kwargs in a function allow for an unlimited number of keyword-argument pairs. kwargs stores these key-value pairs in a dictionary

def example(**kwargs):
    print(kwargs)


example(mark="kobe", hello="world", age=24)
{'mark': 'kobe', 'hello': 'world', 'age': 24}

Non-keyworded variable length of arguments (args)

args in a function allow for an unlimited number of non-keyword arguments. args stores non-keyword arguments in a tuple

def example(*args):
    print(args)


example(1, 2, 3, "mark", "wecode", [1, 2, 3])
(1, 2, 3, 'mark', 'wecode', [1, 2, 3])

kwargs and args function exercise

What_is_my_full_name함수를 구현해주세요. 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" 라고 리턴하면 됩니다.

Solution:

def what_is_my_full_name(**kwargs):
    if "first_name" in kwargs.keys() and "last_name" in kwargs.keys():
        return f"{kwargs['last_name']} {kwargs['first_name']}"
    elif "first_name" in kwargs.keys() and "last_name" not in kwargs.keys():
        return f"{kwargs['first_name']}"
    elif "first_name" not in kwargs.keys() and "last_name" in kwargs.keys():
        return f"{kwargs['last_name']}"
    else:
        return "Nobody"


print(what_is_my_full_name(last_name="kim", first_name="mark"))
kim mark

Other questions to consider...

1. 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다. 왜 안될까요 (Why can't you place non-default value parameters after default-value parameters in a function)?

Parameters that have default values must be placed after positional arguments, since it would be impossible to know which parameters should be assigned to which arguments given in a function call. For example, in the below function:

def kobe(name="kobe", sport="basketball", age, height):
    return hello
    
kobe(24)

Should 24 be assigned to "name", "sport", "age", or "height"? It is impossible to know whether 24 was given as an argument for any one of the parameters. Since computers don't make assumptions for us, a SyntaxError (SyntaxError: non-default argument follows default argument) is raised.

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)

TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

To correct error, make sure there is an "age" keyword in function call (age=20):

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

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

TypeError: func_param_with_kwargs() got an unexpected keyword argument 'mobile'
SyntaxError: invalid syntax

To correct error, make sure "kwargs" has two stars in front and is placed after "address=0"


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

name=정우성
age=20
kwargs={'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")
TypeError: mixed_params() missing 1 required keyword-only argument: 'age'

Refined code and result:

def mixed_params(age, *args, name="아이유",  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")
             name=아이유
args=('정우성', '01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

KEY POINTS:

  • keyword-only arguments must be passed AFTER regular positional arguments and variable length positional args (*args)
  • **kwargs must come last
profile
#mambamentality 🐍

0개의 댓글