파이썬에서 ** (더블 스타)와 * (스타)가 매개변수에 미치는 영향
개요
파이썬 함수에서 *
와 **
는 가변 인자를 처리하는 데 사용되는 특별한 문법 요소입니다. 이를 통해 함수에 전달되는 인자의 개수를 미리 정하지 않고 유연하게 함수를 정의할 수 있습니다.
* (스타): 가변 위치 인자
*
가 붙은 매개변수는 임의의 개수의 위치 인자를 받아서 튜플(tuple) 형태로 저장합니다.- 함수 호출 시,
*
가 붙은 매개변수 앞에 나열된 인자들은 일반 위치 인자로 처리되고,*
이후에 나열된 인자들은 모두 튜플에 담겨*
가 붙은 매개변수에 전달됩니다.
예시:
def my_sum(*args):
result = 0
for num in args:
result += num
return result
print(my_sum(1, 2, 3)) # 출력: 6
위 예시에서 args
는 튜플이며, 1
, 2
, 3
이라는 값들이 담깁니다.
** (더블 스타): 가변 키워드 인자
def my_print(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
my_print(name="Alice", age=30, city="Seoul")
위 예시에서 kwargs
는 딕셔너리이며, name
, age
, city
라는 키와 해당 값들이 저장됩니다.
요약
*args
: 임의의 개수의 위치 인자를 튜플로 받음
활용 예시
- 가변적인 개수의 인자를 받는 함수:
print()
함수처럼 다양한 개수의 값을 출력하는 함수max()
,min()
함수처럼 여러 개의 값 중 최댓값, 최솟값을 구하는 함수
- 함수에 추가적인 인자를 전달:
- 기본적인 인자 외에 필요에 따라 추가적인 인자를 전달하는 경우
- 데코레이터:
주의 사항
*
와**
를 동시에 사용할 수 있습니다. 이 경우*args
는**kwargs
앞에 위치해야 합니다.*
와**
는 함수 정의 시에 한 번만 사용할 수 있습니다.
결론
*
와 **
는 파이썬 함수의 유연성을 높여주는 강력한 기능입니다. 이를 잘 활용하면 다양한 상황에 맞는 함수를 정의할 수 있습니다.
핵심 키워드: 파이썬, 가변 인자, *args, **kwargs, 매개변수 전달, 함수 정의
파이썬 *args와 **kwargs를 활용한 샘플 코드
가변 위치 인자 (*args)
def print_items(*args):
for item in args:
print(item)
# 다양한 개수의 인자 전달
print_items(10, 20, 30, "hello")
- 설명:
print_items
함수는*args
를 통해 임의의 개수의 인자를 받아 각각 출력합니다.- 함수 호출 시 전달되는 모든 인자는
args
라는 튜플에 담겨 함수 내에서 사용됩니다.
가변 키워드 인자 (**kwargs)
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 키워드 인자 전달
print_info(name="Alice", age=30, city="Seoul")
*args와 **kwargs 함께 사용
def my_function(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
# 두 가지 형태의 인자 모두 전달
my_function(1, 2, 3, name="Bob", age=25)
- 설명:
*args
는 위치 인자를,**kwargs
는 키워드 인자를 받아 각각 튜플과 딕셔너리로 처리합니다.- 함수 호출 시 위치 인자는
args
에, 키워드 인자는kwargs
에 저장됩니다.
기본 인자와 함께 사용
def greet(greeting="Hello", *names):
for name in names:
print(f"{greeting}, {name}!")
# 기본 인자와 가변 위치 인자 함께 사용
greet("Hi", "Alice", "Bob", "Charlie")
- 설명:
- 기본 인자
greeting
과 가변 위치 인자names
를 함께 사용할 수 있습니다. - 함수 호출 시
names
에 해당하는 인자가 없으면 기본값Hello
가 사용됩니다.
- 기본 인자
다른 함수에 전달
def my_sum(*args):
return sum(args)
def my_print(*args, **kwargs):
print(*args, **kwargs)
# 다른 함수에 가변 인자 전달
result = my_sum(1, 2, 3)
my_print(result, sep=", ")
- 설명:
my_sum
함수에서 계산된 결과를my_print
함수에 가변 위치 인자로 전달합니다.my_print
함수는*args
를 사용하여 전달받은 값들을 출력합니다.
주의 사항
*args
는 위치 인자를,**kwargs
는 키워드 인자를 받습니다.*args
와**kwargs
는 함수 정의에서 한 번씩만 사용할 수 있습니다.*args
는**kwargs
앞에 위치해야 합니다.*args
와**kwargs
는 각각 튜플과 딕셔너리 형태로 처리됩니다.
- 특정 상황에서 어떤 함수를 사용해야 할지 고민될 때
- *args와 **kwargs를 활용한 더 복잡한 예시를 보고 싶을 때
- 다른 프로그래밍 언어와의 비교를 원할 때
파이썬 *args와 **kwargs의 대체 방법
*args와 **kwargs는 파이썬에서 가변적인 개수의 인자를 처리하는 데 매우 유용한 기능입니다. 하지만 모든 경우에 이 두 가지 방법만 사용해야 하는 것은 아닙니다. 상황에 따라 다른 방법을 사용할 수도 있습니다.
리스트나 튜플을 직접 인자로 받기
- 장점: 코드가 간단하고 직관적입니다.
- 단점: 함수 호출 시 매번 리스트나 튜플을 생성해야 합니다.
def my_function(numbers):
for num in numbers:
print(num)
my_function([1, 2, 3]) # 리스트 전달
dict를 직접 인자로 받기
- 장점: 키워드 인자를 직접 사용할 수 있습니다.
- 단점: 모든 인자를 딕셔너리 형태로 만들어야 합니다.
def print_info(person):
print(f"Name: {person['name']}")
print(f"Age: {person['age']}")
person_data = {'name': 'Alice', 'age': 30}
print_info(person_data)
클래스를 사용하여 객체를 전달하기
- 장점: 데이터를 객체로 관리하고, 메서드를 통해 다양한 기능을 수행할 수 있습니다.
- 단점: 클래스를 정의해야 하는 추가적인 작업이 필요합니다.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def print_person_info(person):
print(f"Name: {person.name}")
print(f"Age: {person.age}")
person = Person("Bob", 25)
print_person_info(person)
언제 어떤 방법을 사용해야 할까요?
- 간단한 데이터 전달: 리스트나 튜플을 직접 사용하면 됩니다.
- 키워드 인자를 사용해야 할 때: 딕셔너리를 사용하면 됩니다.
- 복잡한 데이터 구조나 동작이 필요할 때: 클래스를 사용하면 됩니다.
***args와 kwargs를 사용해야 하는 경우:
- 함수에 전달되는 인자의 개수가 미리 정해지지 않을 때
- 다양한 형태의 인자를 유연하게 처리해야 할 때
다른 방법을 사용해야 하는 경우:
- 코드 가독성을 높이고 싶을 때
- 데이터를 더 명확하게 관리하고 싶을 때
- 객체 지향 프로그래밍의 장점을 활용하고 싶을 때
python syntax parameter-passing