단순 합을 구하는 함수가 있다고 치자.
2개, 3개 까지 구하는건 전혀 어렵지 않다.
def add(x, y): //두가지를 더하는 경우
return x+y
print(add(2,3))
/// 5
def add(x, y, z): //세가지를 더하는 경우
return x+y+z
print(add(2, 3, 5))
/// 10
근데 만약에 다시 두가지만 더하고 싶다면?
def add(x, y, z):
return x+y+z
print(add(2, 3))
/// TypeError: add() missing 1 required positional argument: 'z'
3가지를 넣어야 하는데 2가지만 넣었기 때문에 에러가 난다.
⇒ 이러한 상황에서 *args
를 사용한다.
def add(*args):
print(args, type(args))
add(2, 3)
/// (2, 3) <class 'tuple'>
*args
안으로 넣어진 변수는tuple
로 만들어진다.
다시 최종적으로 *args
를 사용해서 함수를 만들어보자.
def add(*args):
total = 0
for i in args:
total += i
return total
print(add(2, 3)) /// 5
print(add(2, 3, 5)) /// 10
print(add(2, 3, 5, 7)) /// 17
print(add(2, 3, 5, 7, 9)) /// 26
*args
와 named variables 같이 사용 가능하다.
def arg_printer(a, b, *args):
print(f'a is {a}') /// a is 3
print(f'b is {b}') /// b is 4
print(f'args are {args}') /// args are (5, 8, 3)
arg_printer(3, 4, 5, 8, 3)
⤷ a 와 b 에는 원래대로 변수를 넣어주었고, 그 다음에는 몇개가 올지 모르기 때문에 *args
를 사용해주었다.
def total_fruits(**kwargs):
print(kwargs, type(kwargs))
total_fruits(banana=5, mango=7, apple=8)
/// {'banana': 5, 'mango': 7, 'apple': 8} <class 'dict'>
*kwargs
안으로 넣어진 변수는dict
로 만들어진다.
argument의 이름은 kwargs
가 아니라 아래 예시처럼 fruits
여도 되지만 일반적으로 kwargs가 관례처럼 사용된다.
def total_fruits(**fruits):
total = 0
for amount in fruits.values():
total += amount
return total
print(total_fruits(banana=5, mango=7, apple=8)) /// 20
print(total_fruits(banana=5, mango=7, apple=8, oranges=10)) /// 30
print(total_fruits(banana=5, mango=7)) /// 12
Args는 Tuple로 만들어지고,
Kwargs는 Dictionary로 만들어진다.
Args는 Positional Argument 이고,
Kwargs는 Keyword Argument이다. Name, Default value 두개를 갖는다.
🚨 하지만 Keyword Argument는 항상 Positional Argument 뒤에 와야 한다. 만약 Keyword Argument가 먼저 오면 에러가 난다.
arg_printer(a=4, 2, 4, 5)
SyntaxError: positional argument follows keyword argument
⇒ *args
가 *kwargs
보다 항상 먼저 와야 한다.
def arg_printer(a, b, *args, option=True, **kwargs):
print(a, b) /// 1 4
print(args) /// (6, 5) tuple
print(option) /// True
print(kwargs) /// {'param1': 5, 'param2': 6}
arg_printer(1, 4, 6, 5, param1=5, param2=6)
✔️ 당연히 Keyword Argument에 default value를 넣어서 사용할 수도 있다.
def addition(a, b, *args, option=True):
result = 0
if option:
for i in args:
result += i
return a + b + result
else:
return result
print(addition(1,4,5,6,7)) // 23
print(addition(1,4,5,6,7, option=False)) // 0
이 예시에서는 항상 option이 False로 바뀌지 않는 이상 함수가 if쪽으로 항상 실행되는걸 볼 수 있다.
참고 자료:
https://www.freecodecamp.org/news/args-and-kwargs-in-python/
https://towardsdatascience.com/10-examples-to-master-args-and-kwargs-in-python-6f1e8cc30749