Python | Function Arguments: args & kwargs

celeste·2022년 4월 2일
0

Replit) Python Basic

목록 보기
5/10
post-thumbnail

Args를 사용하는 이유

단순 합을 구하는 함수가 있다고 치자.
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와 기본 매개변수 같이 쓰기

*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를 사용해주었다.

Kwargs 사용하기

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와 Kwargs의 차이

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

0개의 댓글