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 를 사용하면, 함수 호출 시 인수의 순서가 중요하지 않고, 생략된 인수도 처리할 수 있습니다.
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**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

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

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
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 를 사용하는 것이 더 유연하고 효율적일 수 있습니다.

따라서, 상황에 맞게 적절한 방법을 선택하는 것이 중요합니다.

def calculate(numbers, operation="+", **kwargs):
  """수치 연산을 수행하는 함수입니다."""
  if operation == "+":
    result = sum(numbers)
  elif operation == "-":
    result = numbers[0] - sum(numbers[1:])
  else:
    raise

python args keyword-argument


{{ article.title }}

이 문서에서는 Python, Django 및 파싱 기술을 사용하여 URL에서 매개변수를 검색하는 방법을 설명합니다. 웹 개발에서 URL 매개변수는 다양한 용도로 사용됩니다. 예를 들어, 특정 페이지에 대한 데이터를 전달하거나 사용자 입력을 처리하는 데 사용할 수 있습니다...


SQLAlchemy, Flask를 사용한 첫 번째 행 가져오기 예제 코드

필요한 라이브러리 설치:데이터베이스 연결:SQLAlchemy 세션 만들기:모델 정의 (선택 사항):데이터베이스 테이블과 객체를 매핑하려면 모델을 정의해야 합니다.쿼리 작성:결과 처리:Flask에서 사용:참고:LIMIT 1 을 사용하여 SQL 쿼리에서 첫 번째 행만 선택할 수도 있습니다...


데이터 분석 필수! Pandas GroupBy로 그룹별 비율 계산하기

Pandas에서 GroupBy와 함께 전체 비율을 계산하려면 다음 단계를 따릅니다.데이터 준비: 먼저 분석 대상 데이터프레임을 준비합니다. 예시 코드를 통해 데이터프레임을 만들어 보겠습니다.GroupBy 적용: 분석 대상 열을 기준으로 데이터프레임을 그룹화합니다...


PyTorch에서 CUDA 메모리를 효과적으로 관리하는 방법

torch. cuda. empty_cache() 함수는 사용하지 않는 모든 CUDA 메모리를 비웁니다. 이는 메모리 누수를 방지하는 데 도움이 됩니다.del 사용더 이상 사용하지 않는 텐서는 del 키워드를 사용하여 삭제할 수 있습니다...


Python에서 xlrd 라이브러리를 사용하여 Excel 파일을 읽을 때 발생하는 "xlrd.biffh.XLRDError: Excel xlsx file; not supported" 오류 해결

Python에서 xlrd 라이브러리를 사용하여 Excel 파일을 읽으려고 할 때 다음과 같은 오류가 발생합니다.원인:xlrd 라이브러리는 기본적으로 . xls 형식의 Excel 파일만 지원합니다. .xlsx 형식의 Excel 파일을 읽으려면 openpyxl 라이브러리를 사용해야 합니다...


python args keyword argument

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

함수 정의**(스타): 가변 갯수의 위치 매개변수를 받는 튜플로 변환합니다.예시:출력:함수 호출**(스타): 튜플을 펼쳐 위치 매개변수로 전달합니다.주의 사항:***(스타)와 ****(더블 스타)를 함께 사용할 수 있습니다


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

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


"Mutable Default Argument"

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


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

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