인자를 전달할때 인자가 가변으로 전달하고 싶을때가 있습니다.
고전 언어들은 없던 기능이라 새로운 개념일 수 있는데 예를 들어보겠습니다.
complex()라는 함수가 있습니다. 여기에는 2개의 인자를 요구하는데 실수와 허수른 넘겨주면 복소수를 표현해주는 함수가 있습니다.
아래와 같은 형태가 됩니다.
print(complex(real=1, imag=2))
# (1+2j)
print(complex(imag=2))
# 2j
print(complex(real=1))
# (1+0j)
만약 데이터가 많아서 반복문을 쓰고 싶을때는 아래와 같이 표현하게 될것입니다.
com_data = [[1, 2], [0, 2], [1, 0]]
for one in com_data:
print(complex(one[0], one[1]))
[1, 2] 이런식으로 표현하면서 약속을 하게 되는 것이죠.
다시 해보면 아래와 같은 dictionary 형태로 표현이 가능합니다.
com_data = [{"real": 1, "imag": 2}, {"real": 0, "imag": 2}, {"real": 1, "imag": 0}]
for one in com_data:
print(complex(one.get("real"), one.get("imag")))
여기에는 치명적인 단점이 있습니다.
최초 예에서는 real 인자나 imag 인자가 없는 경우가 있었습니다. 그러나 여기에서는 0이라고 가정하고 모두 값을 넘겼습니다. complex() 라는 함수인 경우는 이러한 방법이 통했지만 항상 이런 함수만 있는것이 아닙니다.
그럼 어떻게 하면 될까요?
해답은 dict 타입을 인자 그대로 전달하는 python argument 전달 규칙이 있습니다.
이것을 키워드 인자라고 표현을 하고 아래와 같이 '**' 로 표현 가능합니다.
키워드 인자 (keyword argument): 함수 호출 때 식별자가 앞에 붙은 인자 (예를 들어,
name=
) 또는**
를 앞에 붙인 딕셔너리로 전달되는 인자. 예를 들어, 다음과 같은complex()
호출에서3
과5
는 모두 키워드 인자입니다:
https://docs.python.org/ko/3/glossary.html#term-argument
최종적으로 구현한 예제입니다.
com_data = [{"real": 1, "imag": 2}, {"imag": 2}, {"real": 1}]
for one in com_data:
print(complex(**one))
댓글 없음:
댓글 쓰기