전편
☞
파이썬 *args, **kwargs란?
파이썬 코드를 보다보면 함수 정의의 파라미터 부분에서 *args, **kwargs를 쓰는 것을 볼 수 있다. 또 해당 함수를 호출 할 때는 아규먼트에 *, ** 연산자를 쓰는 것도 자주 볼 수 있다. 이번 포스팅에서는 *args, **kwargs가 도대체 무엇인지 알아보자.
1. *args
함수 파라미터에 *args를 쓰면 임의의 개수의 파라미터를 넘겨받을 수 있다. 즉, 아래와 같은 코드가 가능하다.
def func(*args):
for arg in args:
print(arg)
# 함수 호출
func('인자1', '인자2', 1, 2)
여기서 유의할 점은 함수가 임의의 개수의 파라미터를 받을 수 있게 해주는 연산자는 *이고, 뒤에 args는 그냥 파라미터 이름이다. 따라서 args는 아래 예시처럼 원하는 이름으로 바꿔도 된다. 하지만 보통은 *args를 쓰는 것이 관습이다.
def func(*params):
for param in params:
print(param)
*args에 대해서는 이정도로만 알고가도 실제로 함수를 작성하는데는 문제가 없다. 하지만 가끔 이해가지 않는 코드가 생길 것이다. 아래 코드를 보자. 아래 함수의 출력은 무엇일까?
def func(*args):
print(*args)
# 함수 호출
func('인자1', '인자2', 1, 2)
사실 * 연산자는 함수의 파라미터 부분에서 쓰면 packing을 하고 아규먼트 부분(함수 호출)에서 쓰면 unpacking을 해주는 연산자다. 위의 코드에서 func()를 부를 때 세개의 문자열 인자가 * 연산자에 의해 args라는 파라미터로 packing된다. 따라서 위의 코드에서 args==['인자1', '인자2', 1, 2]다.
또한 print() 함수의 호출 부분에서는 *에 의해 args의 내용물이 unpacking된다. 즉, 위의 코드에서 print(*args)는 print('인자1', '인자2', 1, 2)와 같다.
# args == ['인자1', '인자2', 1, 2]
def func(*args):
#print('인자1', '인자2', 1, 2)
print(*args)
# 함수 호출
func('인자1', '인자2', 1, 2)
2. **kwargs
**kwargs는 mapping 데이터를 다룬다는 것 외에는 *args랑 동일하다. Mapping 데이터는 쉽게 말해서 딕셔너리 같이 key-value 페어로 된 데이터라고 생각하면 된다. 아래 코드 예시가 있다.
def func(**kwargs):
if len(kwargs) == 1:
print(kwargs['first_arg'])
else:
print(kwargs['first_arg'])
print(kwargs['second_arg'])
# 함수 호출
func({'first_arg': 1, 'second_arg': 2})
3. *args, **kwargs 활용: Wrapper 함수
*args와 **kwargs를 활용하는 대표적 예시는 wrapper 함수다. wrapper 함수는 함수의 내부에서 다른 함수를 호출한다. 이때 함수를 호출하며 아규먼트를 전달하기 위해 *args와 **kwargs가 사용된다. 아래 예시코드는 전달받은 문자열을 모두 소문자로 바꾼 후에 출력하는 함수이다.
def printLower(*args, **kwargs):
args = list(args)
for i, value in enumerate(args):
args[i] = str(value).lower()
return print(*args, **kwargs)
printLower('Hello,', 'Cindy')
>> hello, cindy
printLower('DOG', 'CAT', 'MOOSE', sep=', ')
>> dog, cat, moose
'Data Engineering > 파이썬' 카테고리의 다른 글
파이썬 String 합치기, String concatenation, join 함수 (파이썬 클린 코드 #3) (0) | 2022.10.12 |
---|---|
파이썬 올바른 딕셔너리 사용법: get, setdefault, defaultdict (파이썬 클린 코드 #2) (0) | 2022.10.10 |
파이썬 enumerate, with, is, R-String, F-String (파이썬 클린 코드 #1) (0) | 2022.10.07 |
환경변수란? 환경변수 설정(윈도우, 맥OS, 리눅스) (0) | 2022.10.06 |
파이썬 코딩 컨벤션 - 네이밍 컨벤션 (0) | 2022.09.22 |
댓글