이번에 알아볼 *args, **kwards는그냥 보이게도 보기에 매우 낯설어 보인다.
그러나 *args, **kwards는 매개변수의 연장선인 개념이다.
매개변수의 변형이라고 생각해도 좋다.
*args, **kwards는 용도와 사용법만 알면 함수를 더욱 쉽게, 깊게 만들 수 있다.
전혀 어렵지 않다.
우선 *args부터 알아보겠다.
정식 명칭은 positional argument이다.
여기서 args는 arguments의 약자로 인수들이라는 뜻이고 중요한 것은 *(asterisk)기호 이다.
함수 선언에서 매개변수 앞에 *를 붙이는데 positional argument는 넘어오는 모든 인수의 데이터를 tuple로 받는다.
tuple로 받으니 원소 수정을 불가능하지만 인덱스를 사용할 수 있다.
아래의 예제를 통해 알아보겠다.
해당 예제에서는 enumerate을 사용해 args의 인덱스와 값을 출력했다.
실행결과에선 인덱스의 존재 유무와 값을 확인할 수 있다.
또한 함수의 호출문에서 주어지는 모든 인수는 tuple의 원소로 취급된다는 것을 알 수 있다.
몇개의 인수가 넘어올 지 모르는 상황에서 *args를 사용하면 조금 더 포괄적으로 상황을 대비할 수 있다.
다음으로 **kwargs에 대해 알아보겠다.
keyword argument라고 한다.
kwargs는 keyword arguments의 약자이고 여기서도 중요한건 **(double asterisk)이다.
용도를 쉽게 설명하자면 *args와 같이 모든 인수를 컬렉션의 원소로 취급한다는건 같은데
*args가 tuple로 받는다면 **kwargs는 dictionary로 받는다.
아래의 예제를 통해 확인하겠다.
해당 예제의 kwarguments는 **kwargs를 통해 인수를 받는다.
15번에서 함수 호출과 동시에 3개의 인수를 key=value 형식으로 넘겨준다.
실행 결과를 보면 kwargs는 dictionary의 자료형이며
원소들을 key : value의 형태로 출력한 것을 볼 수 있다.
추가적으로 매개변수, *args, **kwargs 혼용시 주의해야하는 선언순서에 대해 알아보겠다.
매개변수 - *args - **kwargs순으로 선언해야 한다.
아래의 예제를 통해 설명하겠다.
만약 해당 예제에서 매개변수 - *args - **kwargs의 선언순서를 지키지 않았다면 프로그램은 오류를 띄울 것이다.
그래서 해당 예제에서는 인수들이 어디로 넘어갔는지를 확인하면 된다.
위의 순서를 기준으로 인자들을 나누어서 가져가기 때문이다.
정리해보자면 *args는 인자들을 tuple로 받을거야
**kwargs는 인자들을 dictionary로 받을거야 이고
혼용사용시 선언순서가 있다는 것이다.
이번 포스트의 *args와 **kwargs는 여러모로 C++을 상기시키는데
전체적으로 생긴거만 보면 C++의 포인터와 더블포인터 그리고 변수 초기화 위치의 자율성을 생각나게한다.
그러나 이렇게 살벌하게 생긴것 과는 달리 파이썬에서는 보다 쉬운 개념이다.
'Python > Python 기초' 카테고리의 다른 글
[Python] Class (Class 기본, 객체) (0) | 2022.03.15 |
---|---|
[Python] 함수 4 (lambda, 삼항연산자, 활용 ) (0) | 2022.03.11 |
[Python] 함수 2 (디폴트 매개변수) (0) | 2022.03.09 |
[Python] 함수(함수기본, 매개변수, 리턴값) (0) | 2022.03.08 |
[Python] 반복문 2 (for, in, range) (0) | 2022.03.03 |