가변인수 & 위치인수

jun17114·2020년 12월 16일
1

🐚 Keyword Arguments

기존에 공부했던 함수는, 함수가 정의되었을 때의 parameter 순서대로 parameter를 넘겨야했습니다. 하지만 keyword arguments를 사용하면 더 편하고 명확하게 코드를 읽을수 있습니다.

예시

def name_and_age(my_name, my_age):
	print(f"{my_name} is {my_age} years old")
    
name_and_age(my_name="Jang", my_age=25)
#	"Jang is 25 years old"

Mixing positional arguments

순서대로 넣는 것은 positional arguments라고 합니다. 함수를 호출할 때 positoinal argumentskeyword arguments를 혼용할 수 있습니다.

def name_and_age(my_name, my_age):
	print(f"{my_name} is {my_age} years old")
    
name_and_age("Jang", my_age=25)
#	"Jang is 25 years old"

하지만 Positional arguments는 순서를 지켜주어야 합니다. keyword arguments는 순서가 달라져도 상관없지만 만약 호출을 아래와 같이하게되면,

name_and_age(my_age=25,"Jang")

SyntaxError가 발생 할 것입니다.

Parameter Default Value

Parameterdefault 값도 미리 정의해 줄 수 있습니다. 아래의 코드와 같이 정의해주면 호출할때 parameter값을 정의하지 않아도 자동으로 채워지게 됩니다.

def name_and_age(my_name, my_age=25):
	print(f"{my_name} is {my_age} years old")
    
name_and_age("Jang")
#	"Jang is 25 years old"

🙋🏼 예상 질문

1

Q. 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안된다고 배웠습니다. 왜 안돼야만 한다고 생각합니까?

A. default value parameter가 앞에 존재하면 함수를 호출할때 default값이 있는 parameter도 호출해야 하기 때문에 비효율적이기 때문이라고 생각합니다.


2

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)

위의 코드는 *argsname 뒤의 모든parameter들을 가져오는데, 그러면 age에 들어갈 parameter가 남지 않게 됩니다. 오류를 고치기 위해서,

def func_param_with_var_args(name, *args):
    print("name=",end=""), print(name)
    print("args=",end=""), print(args[0:2])
    print("age=",end=""), print(args[2])

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

위의 코드와 같이 작성하면 될것 같습니다.


3

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

위의 코드는 **kwargs가 뒤에 나오는 모든 key arguments를 저장하는데 그렇게 되면 address도 이미 **kwargs에 들어가게 됩니다. 아래와 같이 코드를 변화시키면 오류가 해결될 것 같습니다.

def func_param_with_kwargs(name, age, **kwargs,):
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("kwargs=",end=""), print(kwargs)
    print("address=",end=""), print(list(kwargs.items())[1][1])

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

4

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

위의 코드는 첫번째로 age가 호출될때 첫번째 parameter로 들어가게 되는데 함수에서 정의된 순서는 세번째에 들어가있어서 가장 앞으로 꺼내주었습니다. 다른 방법으로는 20의 순서를 뒤로 보내고 age``parameter를 제거하고 *args에서 꺼내오는 방법도 가능할 것 같습니다.

또한 **kwargsaddress도 이전 문제와 같이 잘못되어있어 같은 방식으로 해결했습니다.


def mixed_params(age, name="아이유",*args,**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(list(kwargs.items())[1][1])

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

0개의 댓글