Python * 문법 완벽 가이드: 함수 인자, 언패킹, 가변 인자까지

Python에서 *는 다양한 용도로 사용되어, 각각의 의미와 쓰임을 알면 코드를 더욱 유연하고 효율적으로 작성할 수 있습니다. 이번 글에서는 *의 역할과 사용 예제를 통해 Python의 * 문법을 확실히 이해할 수 있도록 도와드리겠습니다.


1. *로 가변 인자 (*args) 받기

가장 흔하게 사용하는 *의 용도는 함수의 가변 인자를 받는 것입니다. *args를 사용하면 함수가 임의의 개수의 인자를 받을 수 있게 되어, 코드의 유연성이 높아집니다.

def print_all(*args):
    for arg in args:
        print(arg)

# 실행 예시
print_all(1, 2, 3)
print_all("apple", "banana", "cherry")

설명

  • *args튜플 형태로 전달되며, 함수에서 여러 개의 인자를 하나의 변수로 받아 처리할 수 있게 합니다.
  • 인자의 개수가 정해지지 않았거나 동적으로 처리해야 할 때 유용합니다.

2. *로 리스트나 튜플 언패킹하기

*리스트나 튜플을 언패킹하여 각각의 요소를 별도의 값으로 전달할 때도 사용됩니다. 이 문법을 통해 리스트나 튜플의 각 요소를 개별 인자로 분리하여 함수에 전달할 수 있습니다.

def add(a, b, c):
    return a + b + c

numbers = [1, 2, 3]
result = add(*numbers)  # 리스트를 언패킹하여 각각의 요소를 인자로 전달
print(result)

설명

  • *numbers는 리스트 [1, 2, 3]언패킹하여 각각의 요소를 함수 add에 인자로 전달합니다.
  • 리스트나 튜플의 요소 개수와 함수의 인자 개수가 일치해야 합니다. 일치하지 않으면 오류가 발생합니다.

3. 함수에서 *로 위치 기반 인자와 키워드 인자 구분하기

함수 정의 시 *를 사용해 위치 기반 인자와 키워드 인자 사이를 구분할 수 있습니다. 위치 인자와 키워드 인자를 명확하게 구분하여 함수 호출 시 오류를 방지하고 가독성을 높입니다.

def order_items(main, *sides, drink):
    print(f"Main dish: {main}")
    print("Side dishes:", sides)
    print(f"Drink: {drink}")

# 실행 예시
order_items("Burger", "Fries", "Salad", drink="Cola")

설명

  • *sides가변 위치 인자를 받아 튜플 형태로 저장합니다.
  • drink키워드 인자로만 전달할 수 있습니다. 즉, drink="Cola"처럼 키워드로 명시해야 합니다.
  • 이 방식을 사용하면 특정 인자를 명시적으로 키워드 인자로만 전달하게 할 수 있어, 코드의 가독성과 유지보수성이 높아집니다.

4. *로 리스트나 튜플 결합하기

Python의 * 문법은 리스트나 튜플을 결합할 때도 사용할 수 있습니다. 여러 리스트를 결합하거나, 리스트에 요소를 추가할 때 유용하게 사용할 수 있습니다.

list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined_list = [*list1, *list2]  # 리스트 결합

print(combined_list)

설명

  • [ *list1, *list2 ]list1list2를 각각 언패킹하여 하나의 리스트로 결합합니다.
  • 같은 방식으로 튜플을 결합할 수 있으며, 코드가 간결해지고 가독성이 높아집니다.

5. *로 여러 개의 값을 한 변수에 묶기

반대로, *를 사용하여 여러 개의 값을 한 변수에 묶어 저장할 수도 있습니다. 함수의 매개변수에서 일부 값을 개별 변수로 할당하고, 나머지 값을 리스트로 묶어 관리할 때 유용합니다.

def split_elements(first, *rest):
    print("First element:", first)
    print("Remaining elements:", rest)

# 실행 예시
split_elements(1, 2, 3, 4, 5)

설명

  • 첫 번째 인자는 first에 저장되고, 나머지 인자는 *rest묶여서 튜플 형태로 저장됩니다.
  • 이러한 방식은 함수 인자 중 특정 인자만 분리하고 나머지를 한꺼번에 관리할 때 유용하게 사용됩니다.

6. 딕셔너리 언패킹으로 ** 대신 * 사용하기

*딕셔너리를 언패킹하는 데도 사용할 수 있지만, 값만 가져오며 키는 무시됩니다. 딕셔너리에서 모든 값만 필요할 때 유용합니다.

data = {'a': 1, 'b': 2, 'c': 3}
print(*data)  # 'a', 'b', 'c' 키만 가져옴
print(*data.values())  # 값들만 출력: 1 2 3

설명

  • *data는 딕셔너리의 키만 출력하고, *data.values()는 딕셔너리의 값을 개별 인자로 언패킹합니다.
  • 딕셔너리의 키나 값만 가져올 때 * 문법을 활용하면 반복문 없이도 값에 쉽게 접근할 수 있습니다.

요약: Python에서 * 문법 정리

Python의 *는 다음과 같이 여러 방식으로 사용됩니다.

  1. 함수에서 가변 인자를 받을 때 (*args)
  2. 리스트나 튜플을 언패킹하여 함수에 인자로 전달할 때
  3. 함수 정의에서 위치 인자와 키워드 인자를 구분할 때
  4. 여러 리스트나 튜플을 결합할 때
  5. 함수 매개변수에서 여러 값을 한 변수에 묶을 때
  6. 딕셔너리의 값만 언패킹할 때

이처럼 *는 다양한 상황에서 유용하게 활용되므로, 각 용법을 이해하고 코드를 더욱 효율적이고 간결하게 작성해보세요!

+ Recent posts