╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Python/Python 기초

[Python] 함수 3 (*args, **kwargs)

재안안 2022. 3. 10. 16:22

이번에 알아볼 *args, **kwards는그냥 보이게도  보기에 매우 낯설어 보인다.

그러나 *args, **kwards는 매개변수의 연장선인 개념이다.

매개변수의 변형이라고 생각해도 좋다.

 

*args, **kwards는 용도와 사용법만 알면 함수를 더욱 쉽게, 깊게 만들 수 있다.

전혀 어렵지 않다.

 

우선 *args부터 알아보겠다.

정식 명칭은 positional argument이다.

여기서 args는 arguments의 약자로 인수들이라는 뜻이고 중요한 것은 *(asterisk)기호 이다.

 

함수 선언에서 매개변수 앞에 *를 붙이는데 positional argument는 넘어오는 모든 인수의 데이터를  tuple로 받는다.

tuple로 받으니 원소 수정을 불가능하지만 인덱스를 사용할 수 있다.

 

아래의 예제를 통해 알아보겠다.

 

*args 사용 예제
실행 결과

 

해당 예제에서는 enumerate을 사용해 args의 인덱스을 출력했다.

실행결과에선 인덱스의 존재 유무와 값을 확인할 수 있다.

또한 함수의 호출문에서 주어지는 모든 인수는 tuple의 원소로 취급된다는 것을 알 수 있다.

 

몇개의 인수가 넘어올 지 모르는 상황에서 *args를 사용하면 조금 더 포괄적으로 상황을 대비할 수 있다.

 

 

다음으로 **kwargs에 대해 알아보겠다.

keyword argument라고 한다.

kwargs는 keyword arguments의 약자이고 여기서도 중요한건 **(double asterisk)이다.

 

용도를 쉽게 설명하자면 *args와 같이 모든 인수를 컬렉션의 원소로 취급한다는건 같은데

*args가 tuple로 받는다면 **kwargs는 dictionary로 받는다.

 

아래의 예제를 통해 확인하겠다.

 

**kwargs 사용 예제
실행 결과

 

해당 예제의 kwarguments는 **kwargs를 통해 인수를 받는다.

15번에서 함수 호출과 동시에 3개의 인수를 key=value 형식으로 넘겨준다.

실행 결과를 보면 kwargs는 dictionary의 자료형이며 

원소들을 key : value의 형태로 출력한 것을 볼 수 있다.

 

 

추가적으로 매개변수, *args, **kwargs 혼용시 주의해야하는 선언순서에 대해 알아보겠다.

 

매개변수 - *args - **kwargs순으로 선언해야 한다.

 

아래의 예제를 통해 설명하겠다.

 

선언순서 예제와 실행 결과

 

만약 해당 예제에서 매개변수 - *args - **kwargs의 선언순서를 지키지 않았다면 프로그램은 오류를 띄울 것이다.

그래서 해당 예제에서는 인수들이 어디로 넘어갔는지를 확인하면 된다.

위의 순서를 기준으로 인자들을 나누어서 가져가기 때문이다.

 

 

정리해보자면 *args는 인자들을 tuple로 받을거야

**kwargs는 인자들을 dictionary로 받을거야 이고

혼용사용시 선언순서가 있다는 것이다.

 

이번 포스트의 *args와 **kwargs는 여러모로 C++을 상기시키는데

전체적으로 생긴거만 보면 C++의 포인터와 더블포인터 그리고 변수 초기화 위치의 자율성을 생각나게한다.

그러나 이렇게 살벌하게 생긴것 과는 달리 파이썬에서는 보다 쉬운 개념이다.