IT/Python

Python 함수 파라미터 순서 완벽 가이드: self, *args, **kwargs 이해하기

파파대니 2024. 12. 11. 12:53

목차

    반응형

    Python 함수 파라미터 순서 완벽 가이드: self, *args, **kwargs 이해하기

    안녕하세요. 파파대니입니다.

    이 글을 쓰게 된 이유는 Python에서 함수 파라미터의 순서를 이해하는 것이 매우 중요하기 때문입니다.

    함수나 메서드를 정의할 때 파라미터의 순서를 잘못 지정하면 문법 오류가 발생하거나 예상치 못한 결과를 초래할 수 있습니다.

    또한, Python에서는 다양한 유형의 파라미터를 사용할 수 있는데, 각 파라미터의 특성과 올바른 사용법을 이해하는 것이 코드를 작성하는 데 큰 도움이 됩니다.

     

    함수 파라미터의 순서

    Python에서 함수나 메서드를 정의할 때, 파라미터는 반드시 정해진 순서대로 배치해야 합니다.

    올바르지 않은 순서로 파라미터를 정의하면 SyntaxError가 발생할 수 있습니다.

    함수 파라미터의 올바른 순서는 다음과 같습니다:

    1. self: 클래스 메서드에서 첫 번째로 위치해야 하는 인자입니다. 이 인자는 인스턴스 자신을 참조합니다. self는 메서드 정의에서 필수로 사용되며, 클래스 인스턴스에서 메서드를 호출할 때 자동으로 전달됩니다.
    2. 위치 인자 (Position argument): 주로 우리가 사용하는 기본 파라미터로, 순서대로 값을 입력받습니다.
    3. 기본값 인자 (Default value argument): 기본값이 있는 인자로, 함수 호출 시 인자가 입력되지 않으면 기본값을 사용합니다.
    4. 가변 인자 (*args): 개수가 정해지지 않은 여러 인자를 받을 때 사용하며, 튜플 형태로 받습니다.
    5. 키워드 전용 인자 (Keyword-only argument): 함수 호출 시 파라미터 이름을 명시적으로 지정해야 하는 인자입니다.
    6. **가변 키워드 인수 (kwargs): 이름과 값을 모두 받을 수 있는 인자로, 딕셔너리 형태로 받습니다.

    이 순서를 지키지 않으면 문법 오류나 예상치 못한 결과가 발생할 수 있습니다. 각 인자의 순서 문제와 예시를 통해 살펴보겠습니다.


    1. self: 인스턴스 자신을 참조

    self는 Python에서 클래스 내 메서드를 정의할 때 항상 첫 번째 인자로 사용됩니다.

    self는 인스턴스 자신을 참조하는 역할을 하며, 인스턴스 변수나 메서드에 접근할 때 필요합니다.

    사실 self는 Python의 예약어가 아니며, 개발자가 임의로 이름을 변경할 수 있지만, 일반적으로 self라는 이름을 사용하는 것이 관례입니다.

     

    예시:

     
    class Car:
        def __init__(self, brand, model):
            self.brand = brand  # 인스턴스 변수
            self.model = model
    
        def display_info(self):
            print(f"브랜드: {self.brand}, 모델: {self.model}")
    
    # 인스턴스 생성
    my_car = Car("현대", "소나타")
    my_car.display_info()  # 출력: 브랜드: 현대, 모델: 소나타

     

    위 예시에서 __init__ 메서드와 display_info 메서드의 첫 번째 인자 self는 모두 인스턴스를 참조하는 데 사용됩니다.


    2. 위치 인자 (Position argument)

    위치 인자(Position argument)는 함수나 메서드에 전달되는 값들이 선언된 순서대로 대응되는 인자입니다.

    함수 호출 시 각 값은 함수 정의에서 지정된 위치에 따라 할당됩니다.

    위치 인자는 기본적으로 필수 인자입니다.

     

    예시:

    def greet(name, age):
        print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
    
    greet("홍길동", 30)
    # 출력: 안녕하세요, 홍길동님! 나이는 30입니다.

     

    위치 인자는 순서대로 값을 전달해야 하며, 이를 지키지 않으면 TypeError가 발생할 수 있습니다.


    3. 기본값 인자 (Default value argument)

    기본값 인자는 함수나 메서드를 호출할 때 값을 전달하지 않으면 자동으로 사용되는 기본값을 지정할 수 있는 인자입니다.

    기본값 인자는 함수 정의에서 = 기호를 사용하여 값을 설정합니다.

    기본값 인자는 위치 인자 뒤에 와야 하며, 기본값이 없는 인자보다 뒤에 위치해야 합니다.

     

    예시:

    def greet(name, age=20):
        print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
    
    greet("홍길동")
    # 출력: 안녕하세요, 홍길동님! 나이는 20입니다.
    
    greet("김철수", 25)
    # 출력: 안녕하세요, 김철수님! 나이는 25입니다.

     

    위 예시에서 age는 기본값을 가지고 있기 때문에, 값을 전달하지 않으면 기본값인 20이 사용됩니다.


    4. 키워드 전용 인자 (Keyword-only argument)

    키워드 전용 인자(Keyword-only argument)는 함수나 메서드 호출 시, 해당 인자의 이름을 명시적으로 지정해야만 값을 전달할 수 있도록 하는 인자입니다.

    이는 함수 정의에서 *를 사용하여 구분하며, * 뒤에 오는 인자는 모두 키워드 전용 인자로 간주됩니다.

     

    예시:

    def greet(name, *, age):
        print(f"안녕하세요, {name}님! 나이는 {age}입니다.")
    
    greet("홍길동", age=30)
    # 출력: 안녕하세요, 홍길동님! 나이는 30입니다.
    
    # greet("홍길동", 30)  # 오류 발생: 'age'는 키워드 전용 인자이므로 값이 키워드로 지정되어야 합니다.

    5. *args: 가변 인자 (튜플 형태)

    *args는 함수나 메서드에서 인자의 개수가 정해져 있지 않은 경우에 사용됩니다.

    *args를 사용하면 호출할 때 넘겨주는 인자의 개수에 관계없이 모두 튜플 형태로 받을 수 있습니다.

    즉, 인자의 개수가 일정하지 않거나 여러 개의 값을 받을 때 유용합니다.

     

    예시:

    def add_numbers(*args):
        return sum(args)
    
    # 여러 개의 인자를 전달
    result = add_numbers(1, 2, 3, 4)
    print(result)  # 출력: 10
    
    # 인자가 하나인 경우
    result = add_numbers(5)
    print(result)  # 출력: 5

    6. **kwargs: 키워드 인자 (딕셔너리 형태)

    **kwargs는 키워드 인자를 받을 때 사용됩니다.

    함수나 메서드에 넘겨지는 인자들을 키-값 쌍의 형태로 딕셔너리로 받을 수 있게 해 줍니다.

    **kwargs는 함수나 메서드를 호출할 때 명시적으로 이름을 지정해서 전달된 인자를 처리하는 데 유용합니다.

     

    예시:

    def print_info(**kwargs):
        for key, value in kwargs.items():
            print(f"{key}: {value}")
    
    # 키워드 인자로 전달
    print_info(name="John", age=25, city="서울")
    # 출력:
    # name: John
    # age: 25
    # city: 서울

    self, *args, **kwargs를 함께 사용하기

    클래스 내에서 self, *args, **kwargs를 함께 사용하는 경우도 많습니다.

    특히 메서드에서 다양한 수의 인자를 받을 때 유용합니다.

    이를 활용하면 클래스를 더욱 유연하게 만들 수 있습니다.

     

    예시:

    class Person:
        def __init__(self, name, age, *args, **kwargs):
            self.name = name
            self.age = age
            self.additional_info = args
            self.extra_data = kwargs
    
        def display_info(self):
            print(f"이름: {self.name}, 나이: {self.age}")
            print(f"추가 정보: {self.additional_info}")
            print(f"추가 데이터: {self.extra_data}")
    
    # 인스턴스 생성
    person = Person("Alice", 30, "Engineer", "Loves coding", city="Seoul", hobby="Reading")
    person.display_info()
    # 출력:
    # 이름: Alice, 나이: 30
    # 추가 정보: ('Engineer', 'Loves coding')
    # 추가 데이터: {'city': 'Seoul', 'hobby': 'Reading'}

    아규먼트 순서에 따른 문제 예시

    1) 가변 인자 순서에 대한 오류

    *args는 항상 위치 인자 뒤에 와야 하며, 고정된 인자 뒤에 올 수 없습니다.

    *args를 고정된 인자들 뒤에 두는 것은 문법 오류를 발생시킵니다.

     

    잘못된 예시:

    def greet(name, *args, age):  # 오류 발생
        print(f"Hello, {name}! Your age is {age}.")
        print("Additional names:", args)
    
    greet("John", "Jim", "Dim", 32)
     
     
     

    올바른 예시:

    def greet(name, age, *args):  # 올바른 순서
        print(f"Hello, {name}! Your age is {age}.")
        print("Additional names:", args)
    
    greet("John", 32, "Jim", "Dim")

     

    2) *args와 **kwargs의 순서

    *args는 **kwargs보다 앞에 와야 합니다.

    **kwargs가 *args보다 앞에 위치하면 문법 오류가 발생합니다.

     

    잘못된 예시:

    def example(**kwargs, *args):  # 오류 발생
        print(kwargs)
        print(args)
    
    example(name="Alice", age=30)
     

    올바른 예시:

    def example(*args, **kwargs):
        print(kwargs)
        print(args)
    
    example(name="Alice", age=30)  # 출력: {'name': 'Alice', 'age': 30} , ()

    Python에서 함수 파라미터의 순서를 정확히 지키는 것은 코드의 오류를 방지하고 의도한 대로 함수가 작동하도록 하는 데 매우 중요합니다.

    self, 위치 인자, 기본값 인자, *args, **kwargs는 각기 다른 용도와 순서 규칙을 가지고 있으며, 이를 이해하고 올바르게 적용하는 것이 좋은 코딩 습관을 기르는 첫걸음입니다.

     

     

    ⬇️ 참고하면 좋은 글 ⬇️

     

    파이썬 고급 문법 완벽 가이드: 데코레이터, 제너레이터, 메타프로그래밍 등

     

    파이썬 고급 문법 완벽 가이드: 데코레이터, 제너레이터, 메타프로그래밍 등

    파이썬 고급 문법 완벽 가이드: 데코레이터, 제너레이터, 메타프로그래밍 등 안녕하세요. 파파대니입니다.파이썬 개발 시 고급 문법과 고급 기술은 코드의 효율성, 가독성, 확장성을 높여주는

    papa-danny.tistory.com

     

    Python에서 self, this, me 차이 한 번에 정리하기

     

    Python에서 self, this, me 차이 한 번에 정리하기

    Python self 완벽 이해: 초보자를 위한 간단한 설명과 예제안녕하세요. 파파대니입니다.Python의 객체 지향 프로그래밍(OOP)에서 클래스 내부에서 사용되는 self는 매우 중요한 역할을 합니다. 그

    papa-danny.tistory.com

     

    Python에서 한글 처리 시 인코딩 문제 해결하기 (UTF-8 vs ANSI)

     

    Python에서 한글 처리 시 인코딩 문제 해결하기 (UTF-8 vs ANSI)

    Python에서 한글 처리 시 인코딩 문제 해결하기 (UTF-8 vs ANSI)안녕하세요. 파파대니입니다.Python을 사용할 때, 코드 파일에 한글이 들어가면 인코딩을 제대로 설정하지 않으면 오류가 발생할

    papa-danny.tistory.com

     

     

     

    반응형