파이썬에서의 *args 와 **kwargs 활용
파이썬에서 함수를 정의할 때, 여러 개의 인수를 전달받을 수 있습니다. 기본적으로 함수는 정해진 개수의 **명명된 인수(positional argument)**를 요구합니다. 하지만, *args 와 kwargs 를 사용하면 가변 개수의 인수를 처리할 수 있는 더욱 유연한 함수를 만들 수 있습니다.
*args (가변 위치 인수)
*args
는 함수 호출 시 순서대로 전달되는 인수들을 튜플로 변환하여 저장합니다.- 함수 정의 시,
*args
는 마지막 위치에 와야 합니다. *args
를 사용하면, 함수 호출 시 전달되는 인수의 개수가 미리 정해져 있지 않아도 문제 없습니다.
def add_numbers(*args):
total = 0
for number in args:
total += number
return total
result = add_numbers(1, 2, 3, 4, 5)
print(result) # 결과: 15
위 예시에서 add_numbers
함수는 *args
를 사용하여 전달된 모든 숫자를 더합니다. 함수 호출 시, 몇 개의 인수를 전달하든 상관없이 제대로 작동합니다.
**kwargs (가변 키워드 인수)
**kwargs
를 사용하면, 함수 호출 시 인수의 순서가 중요하지 않고, 생략된 인수도 처리할 수 있습니다.
def user_info(name, age, city **kwargs):
print(f"이름: {name}")
print(f"나이: {age}")
print(f"거주 도시: {city}")
if "job" in kwargs:
print(f"직업: {kwargs['job']}")
user_info("철수", 30, "서울", job="개발자")
위 예시에서 user_info
함수는 name
, age
, city
라는 세 개의 명명된 인수와, job
이라는 키워드 인수를 받습니다. 함수 호출 시, job
인수를 생략해도 오류 없이 작동하며, 추가적인 키워드 인수를 전달할 수도 있습니다.
*args 와 **kwargs 동시 사용
*args
와**kwargs
를 동시에 사용하면, 더욱 유연하고 기능적인 함수를 만들 수 있습니다.
def calculate(numbers, operation="+", **kwargs):
if operation == "+":
result = sum(numbers)
elif operation == "-":
result = numbers[0] - sum(numbers[1:])
else:
raise ValueError("지원되지 않는 연산입니다.")
if "precision" in kwargs:
result = round(result, kwargs["precision"])
return result
result1 = calculate(10, 5, 3, operation="-")
print(result1) # 결과: 2
result2 = calculate(1.5, 2.7, operation="+", precision=2)
print(result2) # 결과: 4.2
위 예시에서 calculate
함수는 numbers
리스트, operation
문자열, 그리고 precision
이라는 키워드 인수를 받습니다. 함수는 operation
에 따라 리스트의 숫자들을 더하거나 뺍니다. 또한, precision
키워드 인수가 있으면 결과값을 소수점 자리수까지 반올림합니다.
주의 사항:
*args
와**kwargs
는 함수 정의 시 반드시 마지막 위치에 와야 합니다.*args
와**kwargs
를 함께 사용할 때는, 명명된 인수가*args
앞에 와야 합니다.
*args 와 **kwargs 활용의 장점
- 코드 가독성 향상: 함수의 기능
예제 코드: 명함 만들기
다음은 *args
와 **kwargs
를 사용하여 간단한 명함 만들기 프로그램의 예제입니다.
def create_card(name, title, company, **kwargs):
"""
이름, 직책, 회사 정보를 기반으로 명함 문자열을 만드는 함수입니다.
Args:
name (str): 사용자 이름
title (str): 직책
company (str): 회사 이름
**kwargs:
phone_number (str): 전화번호
email (str): 이메일 주소
website (str): 웹사이트 주소
Returns:
str: 명함 문자열
"""
card_str = f"""
이름: {name}
직책: {title}
회사: {company}
"""
if "phone_number" in kwargs:
card_str += f"\n전화번호: {kwargs['phone_number']}"
if "email" in kwargs:
card_str += f"\n이메일: {kwargs['email']}"
if "website" in kwargs:
card_str += f"\n웹사이트: {kwargs['website']}"
return card_str
# 명함 정보 입력
name = input("이름: ")
title = input("직책: ")
company = input("회사: ")
phone_number = input("전화번호 (선택사항): ")
email = input("이메일 (선택사항): ")
website = input("웹사이트 (선택사항): ")
# 명함 만들기
card = create_card(name, title, company, phone_number=phone_number, email=email, website=website)
# 명함 출력
print(card)
설명:
create_card
함수는name
,title
,company
라는 세 개의 필수 인수와,phone_number
,email
,website
라는 세 개의 선택적 키워드 인수를 받습니다.- 함수는 전달된 정보를 사용하여 명함 문자열을 만듭니다.
*args
와**kwargs
를 사용하면, 사용자가 선택적으로 추가 정보를 제공할 수 있도록 합니다.- 프로그램 실행 시, 사용자는 명함 정보를 입력하고, 생성된 명함 문자열을 확인할 수 있습니다.
추가 예시:
- 위 코드를 기반으로, 로고 이미지 추가, 디자인 변경 등 다양한 기능을 추가할 수 있습니다.
*args
를 사용하여 명함에 추가할 정보들을 자유롭게 입력할 수 있도록 개선할 수 있습니다.
핵심:
- 이는 코드 가독성을 향상시키고, 코드 재사용성을 높이는 데 도움이 됩니다.
파이썬에서 명명된 인수, *args 및 **kwargs를 사용하는 대체 방법
함수에 인수를 전달하는 기본적인 방법은 명명된 인수를 사용하는 것입니다. 즉, 함수를 호출할 때 각 인수에 해당하는 값을 순서대로 지정합니다. 예를 들어 다음과 같습니다.
def add_numbers(a, b):
"""두 수를 더하는 함수입니다."""
return a + b
result = add_numbers(3, 4)
print(result) # 결과: 7
하지만, 더 많은 수의 인수를 전달하거나, 인수의 순서가 중요하지 않은 경우에는 가변 인수를 사용하는 것이 더 효율적입니다. 파이썬에서는 다음과 같은 두 가지 방식으로 가변 인수를 처리할 수 있습니다.
*args (가변 위치 인수)
def add_numbers(*args):
"""가변 개수의 숫자를 더하는 함수입니다."""
total = 0
for number in args:
total += number
return total
result = add_numbers(1, 2, 3, 4, 5)
print(result) # 결과: 15
**kwargs (가변 키워드 인수)
def user_info(name, age, city **kwargs):
"""사용자 정보를 출력하는 함수입니다."""
print(f"이름: {name}")
print(f"나이: {age}")
print(f"거주 도시: {city}")
if "job" in kwargs:
print(f"직업: {kwargs['job']}")
user_info("철수", 30, "서울", job="개발자")
명명된 인수 대신 *args 또는 **kwargs 사용 시 고려 사항
- 명확성: 명명된 인수를 사용하는 것이 일반적으로 함수의 용도를 더 명확하게 전달하기 때문에 선호됩니다.
- 가독성: 코드가 복잡해질 경우, *args 또는 **kwargs 를 사용하면 가독성이 떨어질 수 있습니다.
- 특수 상황: 특정 상황에서는 *args 또는 **kwargs 를 사용하는 것이 더 유연하고 효율적일 수 있습니다.
따라서, 상황에 맞게 적절한 방법을 선택하는 것이 중요합니다.
*args 와 **kwargs 동시 사용
def calculate(numbers, operation="+", **kwargs):
"""수치 연산을 수행하는 함수입니다."""
if operation == "+":
result = sum(numbers)
elif operation == "-":
result = numbers[0] - sum(numbers[1:])
else:
raise
python args keyword-argument