Python에서 유연한 함수 만들기: args 와 *kwargs 사용법

2024-05-10

파이썬에서의 *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 는 함수 호출 시 키워드와 값 쌍으로 전달되는 인수들을 딕셔너리로 변환하여 저장합니다.
  • 함수 정의 시, **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 를 활용하면, 더욱 유연하고 사용자 맞춤형 함수를 만들 수 있습니다.
  • 이는 코드 가독성을 향상시키고, 코드 재사용성을 높이는 데 도움이 됩니다.



파이썬에서 명명된 인수, *args 및 **kwargs를 사용하는 대체 방법

함수에 인수를 전달하는 기본적인 방법은 명명된 인수를 사용하는 것입니다. 즉, 함수를 호출할 때 각 인수에 해당하는 값을 순서대로 지정합니다. 예를 들어 다음과 같습니다.

def add_numbers(a, b):
  """두 수를 더하는 함수입니다."""
  return a + b

result = add_numbers(3, 4)
print(result)  # 결과: 7

하지만, 더 많은 수의 인수를 전달하거나, 인수의 순서가 중요하지 않은 경우에는 가변 인수를 사용하는 것이 더 효율적입니다. 파이썬에서는 다음과 같은 두 가지 방식으로 가변 인수를 처리할 수 있습니다.

*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 는 함수 호출 시 키워드와 값 쌍으로 전달되는 인수들을 딕셔너리로 변환하여 저장합니다.
  • 함수 정의 시, **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 를 사용하면 가독성이 떨어질 수 있습니다.
  • 특수 상황: 특정 상황에서는 *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


Python 및 SQLAlchemy에서 발생하는 DetachedInstanceError 오류: 이해하고 해결하기

오류 설명예시해결 방법이 오류를 해결하려면 다음 방법 중 하나를 사용할 수 있습니다.개체를 다시 연결합니다.속성을 직접 쿼리합니다.load_instance() 함수를 사용합니다.예방 조치이 오류를 방지하려면 다음 사항을 유의해야 합니다...


Flask에서 SQLAlchemy 결과 세트를 JSON으로 jsonify하는 방법

다음은 Flask에서 SQLAlchemy 결과 세트를 JSON으로 jsonify하는 방법에 대한 단계별 안내입니다.필요한 패키지 설치먼저 Flask와 SQLAlchemy 패키지를 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다...


Django에서 마지막 마이그레이션을 되돌리는 방법

makemigrations 명령어 사용프로젝트 폴더에서 다음 명령어를 실행합니다.여기서 <마이그레이션 이름>은 되돌리고 싶은 마이그레이션의 이름입니다. 마이그레이션 이름은 migrations 폴더에 있는 파일 이름을 참고하여 입력합니다...


Django - makemigrations - No changes detected 문제 해결 가이드

모델 변경 사항 확인:모델 파일을 저장한 후 makemigrations 명령을 실행했는지 확인합니다.모델 정의에 변경 사항이 있는지 꼼꼼하게 검토합니다.모델 필드 추가, 삭제, 변경, 이름 변경 등 모든 변경 사항을 확인합니다...


PyTorch vs. Keras: PyTorch 모델 과적합 심화 해설

PyTorch와 Keras는 딥 러닝 모델 개발을 위한 대표적인 프레임워크입니다. 두 프레임워크 모두 모델 과적합 문제를 해결하는 다양한 기능을 제공합니다.모델 과적합은 모델이 학습 데이터에 지나치게 적응하여 새로운 데이터에 대한 일반화 성능이 저하되는 현상입니다...


python args keyword argument

파이썬 매개변수 전달: (더블 스타)와 *(스타)의 비밀

함수 정의**(스타): 가변 갯수의 위치 매개변수를 받는 튜플로 변환합니다.***(더블 스타): 가변 갯수의 키워드 매개변수를 받는 딕셔너리로 변환합니다.예시:출력:함수 호출**(스타): 튜플을 펼쳐 위치 매개변수로 전달합니다


Python에서 디렉토리 및 부모 디렉토리를 생성하는 방법

해결 방법:os. makedirs() 함수 사용설명:os. makedirs() 함수는 지정된 경로에 디렉토리가 존재하지 않으면 생성합니다.부모 디렉토리가 존재하지 않더라도 모두 생성됩니다.OSError 예외를 처리하여 경로가 이미 존재하는 경우 오류를 무시하거나 처리할 수 있습니다


"Mutable Default Argument"

**"Mutable Default Argument"**는 함수 정의에서 기본값으로 변경 가능한 변수를 사용하는 것을 의미합니다. 이는 함수를 호출할 때 기본값을 변경할 수 있다는 것을 의미하며, 코드를 더욱 유연하게 만들 수 있습니다


Python에서 __str__와 __repr__의 차이점: 객체 표현 마스터하기

__str__사용자 친화적: str() 함수나 print() 함수에서 자동으로 호출됩니다.간결한 표현: 객체의 주요 정보를 간결하게 표현합니다.읽기 쉬움: 일반 사용자가 쉽게 이해할 수 있는 형식으로 표현됩니다.__repr__