소개
Python은 전 세계에서 가장 인기 있는 프로그래밍 언어 중 하나입니다. Python에서 매개변수(parameter)는 함수 정의의 일부입니다. 이를 통해 함수의 특정 인자(argument)를 지정할 수 있습니다. 인자는 함수에 의해 전달되고 적용될 수 있습니다.
하지만 코딩하는 시점에는 여러분의 코드로 어떤 정확한 사용 사례가 구현될지 알 수 없습니다. 따라서 미래의 프로그래머와 프로그램 사용자를 위해 함수에 가변적인 개수의 인자를 전달하는 것이 좋습니다. 이를 위해 특별한 매개변수를 사용해야 합니다. 바로 *args 및 **kwargs입니다. 이 튜토리얼에서는 Python의 *args 및 **kwargs 매개변수에 대해 모두 알아볼 것입니다. 또한 인자의 순서를 정하는 방법과 이를 함수 호출에 적용하는 방법도 배울 것입니다.
사전 요구 사항
이 튜토리얼의 단계를 따라 하려면 몇 가지 사전 요구 사항을 준비해야 합니다. 먼저, 서버에 프로그래밍 환경이 설정되고 Python 3가 설치되어 있어야 합니다. 또한 특정 운영 체제용 프로그램이 설치되어 있어야 합니다 (Ubuntu, CentOS, Debian 등).
*args란 무엇이며 어떻게 작동하나요?
먼저 *args가 어떻게 작동하는지 이해하는 것부터 시작해 보겠습니다. 별표(asterisk)가 하나 있는 이 매개변수는 키워드가 없는 가변 길이 인자 목록을 함수로 전달하는 데 사용됩니다. 별표가 해당 매개변수에서 가장 중요한 요소라는 점을 기억하세요.
더 잘 이해하기 위해 예를 들어 보겠습니다. 다음은 두 개의 인자를 사용하는, 코드에서 흔히 볼 수 있는 일반적인 함수입니다.
|
1 2 |
def multiply(x, y): print (x * y) |
보시다시피 위 함수의 인자는 x 및 y입니다. 함수를 호출할 때 x 및 y에 해당하는 숫자를 사용하게 됩니다. 예를 들어 정수 5 및 4를 각각 x 및 y에 전달한다고 가정해 보겠습니다:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
이제 코드를 실행할 수 있습니다:
|
1 |
python lets_multiply.py |
출력 결과는 다음과 같습니다:
|
1 2 3 |
출력: 20 |
출력 결과는 정수 5와 4가 곱해졌음을 보여줍니다. 이는 multiply(x, y) 함수가 잘 작동했음을 의미합니다.
이제 두 개가 아닌 세 개의 숫자를 곱하고 싶다고 가정해 보겠습니다. 아쉽게도 위의 함수에 숫자를 하나 더 추가하면 다음과 같은 오류가 발생합니다:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
출력: TypeError: multiply() takes 2 positional arguments but 3 were given |
따라서 나중에 더 많은 인자를 추가해야 할 수도 있다는 생각이 든다면, 편의를 위해 *args 매개변수를 적용해 보세요. 다음과 같이 사용할 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
우리는 단순히 x 및 y 함수 매개변수를 *args로 대체했습니다. 이 코드를 실행하면 다음과 같이 모든 단일 함수 호출에 대한 곱을 얻을 수 있습니다:
|
1 2 3 4 5 6 |
출력: 20 90 24 900 |
따라서 *args는 함수에 가변 길이 인자 목록을 전달하고자 할 때 사용하기에 이상적입니다. 이 기능 덕분에 함수 호출 시 원하는 만큼 많은 인자를 전달할 수 있습니다. 이처럼 이 매개변수를 사용하면 키워드가 없는 다양한 가변 인자를 함수로 받아들일 수 있는 더 유연한 코드를 작성할 수 있습니다.
**kwargs란 무엇이며 어떻게 작동하나요?
다음으로, 별표가 두 개 있는 버전의 매개변수인 **kwargs가 있습니다. 이전 형태와 달리, 이 매개변수를 사용하면 키워드가 있는 가변 길이 인자 딕셔너리를 함수에 전달할 수 있습니다. *args와 유사하게, 이중 별표는 매개변수에서 가장 중요한 요소입니다.
이전 섹션에서 했던 것처럼 원하는 만큼 인수를 추가할 수 있습니다. 차이점은 키워드를 지정해야 한다는 것입니다. 더 잘 이해하기 위해 다음 예를 살펴보겠습니다. 여기서는 먼저 함수에 전달하려는 **kwargs 인수를 출력하는 것부터 시작하겠습니다:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
이제 함수를 호출해 보겠습니다. 보시다시피 키워드 인수를 추가했습니다:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
이 시점에서 프로그램을 실행하면 다음과 같은 출력이 표시됩니다:
|
1 |
python print_kwargs.py |
|
1 2 3 |
Output: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
하지만 딕셔너리 데이터 타입의 순서가 보장되지 않을 가능성이 있습니다. 이는 주로 사용하는 Python 3 버전에 따라 다릅니다. 예를 들어, Python 3.6 이후 버전은 키-값 쌍을 순서대로 제공합니다. 그 이전 버전은 출력을 무작위 순서로 표시합니다. 생성하는 딕셔너리는 kwargs(이)라고 불립니다. 시스템의 다른 딕셔너리와 마찬가지로 이를 사용하고 조작할 수 있습니다. 이제 **kwargs 매개변수를 더 유용하게 활용하고 적용하는 방법을 살펴보겠습니다.
다음 예제에서는 이름이 포함된 딕셔너리를 맞이하는 새 함수를 만들어 보겠습니다. 샘플 딕셔너리에는 두 개의 이름이 있습니다:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
프로그램을 실행하면 다음과 같은 출력이 표시됩니다:
|
1 |
python print_values.py |
|
1 2 3 4 |
Output: The value of your_name is Casey The value of my_name is Sammy |
이전 예제와 마찬가지로 딕셔너리는 순서가 지정되지 않은 것처럼 보일 수 있습니다. 따라서 일부 경우에는 Casey와 Sammy라는 이름의 순서가 뒤바뀔 수 있습니다.
다음으로 함수에 추가 인수를 전달하겠습니다. 이를 통해 **kwargs 가 원하는 수의 인수를 수락하도록 만들 수 있음을 증명할 것입니다:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
프로그램을 실행하면 다음과 같은 출력이 표시됩니다:
|
1 2 3 4 5 6 7 8 |
Output: The value of name_2 is Gray The value of name_6 is Val The value of name_4 is Phoenix The value of name_5 is Remy The value of name_3 is Harper The value of name_1 is Alex |
이 출력 역시 순서가 보장되지 않을 수 있습니다. 그럼에도 불구하고, 이 예제들은 **kwargs 가 프로그램에 여러 키워드 인수를 사용할 수 있는 유연성을 제공한다는 것을 보여줍니다.
인수 순서를 정하는 방법
함수 또는 함수 호출에서 인수의 순서를 정할 때는 정해진 순서를 염두에 두는 것이 중요합니다. 순서는 다음과 같습니다:
-
형식 위치 인수
-
*args
-
키워드 인수
-
**kwargs
만약 *args 및 **kwargs 을 명시적 위치 매개변수와 함께 사용한다고 가정해 보겠습니다. 이는 함수가 다음과 같은 형태가 됨을 의미합니다:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
반면에, 이러한 매개변수를 키워드 매개변수라는 이름과 함께 사용하면 함수의 일반적인 구조는 다음과 같습니다:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
설정된 순서를 따르지 않으면 코드를 실행할 때 구문 오류(syntax error)가 발생합니다. 따라서 처음부터 이러한 실수를 피하는 것이 가장 좋습니다.
함수 호출에서 *args 및 **kwargs를 사용하는 방법
마지막으로, 두 매개변수를 모두 사용하여 함수에 인수를 전달하는 방법을 보여드리겠습니다. 먼저 다음을 보여주는 예시로 시작해 보겠습니다. *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
이 함수에는 세 개의 매개변수가 있습니다: arg_1, arg_2, 그리고 arg_3. 변수를 생성하고 이를 반복 가능한 객체(iterable)로 설정해야 합니다. 이 경우에는 tuple이 됩니다. 그런 다음 별표(asterisk) 구문을 사용하여 변수를 함수에 전달할 수 있습니다.
다음 명령을 사용하여 프로그램을 실행할 때의 출력을 확인해 보세요. python some_args.py 명령어:
|
1 2 3 4 5 |
출력: arg_1: Sammy arg_2: Casey arg_3: Alex |
프로그램을 반복 가능한 리스트 데이터 타입으로 변경하고 다른 변수 이름을 사용할 수도 있습니다. 다음 코드는 *args 을 이름이 있는 매개변수와 결합합니다:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
프로그램을 실행하면 출력은 다음과 같습니다:
|
1 2 3 4 5 |
출력: arg_1: 1 arg_2: 2 arg_3: 3 |
반면에, 키워드 인수를 **kwargs와 함께 적용할 수 있습니다. 딕셔너리와 동일한 변수를 생성해야 합니다. 이 딕셔너리는 2개의 키-값 쌍을 가져야 합니다. 다음은 3개의 인수를 가진 함수에 변수를 전달하는 방법입니다:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
다시 한번 python some_kwargs.py 명령어를 사용하여 프로그램을 실행합니다:
|
1 2 3 4 5 |
출력: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
결론
이 튜토리얼을 마칠 때쯤이면 여러분은 *args 및 **kwargs가 무엇이고 어떻게 작동하는지 잘 이해하게 될 것입니다. 이제 이러한 매개변수를 자체 코드에 적용하여 향후 사용자를 위해 프로그램을 유연하게 만들 수 있습니다. 이는 얼마나 많은 인수가 사용될지 알 수 없는 상황에 이상적입니다. 다만 함수의 중요한 요소와 매개변수에 주의를 기울이시기 바랍니다.
마지막으로, 저희 블로그에서 제공하는, Python을 성공적으로 사용하는 데 도움이 될 더 많은 리소스들입니다:
- txt 파일 형식: Python 3에서 일반 텍스트 파일 작업하기
- Python 3의 루프: Break, Continue 및 Pass 문 사용하기
- Python 3에서 모듈 가져오기: 종합 가이드
- Python 3 문자열 포맷터 사용하기
- Python 3 프로그래밍: 클래스 구성 및 객체 정의 방법
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.