TIL - Python - parameter&arguments

김영훈·2021년 3월 20일
0

Python

목록 보기
11/14

# 함수의 parameter 입력 순서

  • Python에서 함수를 생성할 때 parameter(매개변수)를 사용하면, 함수를 실행하는 데 필요한 arguments(인수)를 입력받을 수 있다. 주의할 점은 parameter와 arguments의 사용이 기본적인 문법에 맞게 이뤄져야 한다는 사실이다. 여기서 문법이란 입력 순서를 의미하는 것이며, 만일 순서에 어긋나게 parameter 혹은 arguments를 입력하는 경우 error(SyntaxError)가 발생한다.
    def love_you(my_name = "정우성", your_name): 
        print(f"{my_name} loves {your_name}") 
        
   # 결괏값
   > Traceback (most recent call last):   
       File "python", line 1 
   SyntaxError: non-default argument follows default argument
  • 위 함수의 error 발생 원인은 parameter의 입력 순서가 문법에 어긋났기 때문이다. parameter는 default 값이 정의됐는지의 여부에 따라 default value parameternon-default value parameter로 구분되는데, default값이 없는 paramter는 default 값이 정의된 paramter보다 먼저 입력돼야 한다. 위 함수를 문법에 맞게 고쳐본다면, non-default value parameter인 your_name의 순서가 default value parameter인 my_name = "정우성"보다 앞서야 한다.
    def love_you(your_name, my_name = "정우성"): 
        print(f"{my_name} loves {your_name}") 
  • 그렇다면... 함수를 정의할 때 default value parameter를 non-default value parameter보다 앞서 정의하면 안 되는 이유는 뭘까? 한 가지 예시를 떠올려보자. 만약 위 함수에서 my_name의 값으로 새로운 값을 지정하는 대신, default 값을 그대로 사용하기로 했다고 가정해보자. 이 경우 함수의 인수로 my_name에 대한 인수 값은 생략한 채, your_name에 대한 인수 값만 넘겨주면 된다. 아래의 예시처럼 말이다.
    def love_you(your_name, my_name = "정우성"): 
        print(f"{my_name} loves {your_name}") 

    love_you('브브걸')  # 결괏값: 정우성 loves 브브걸
  • 하지만... 만약 parameter 순서가 뒤바뀐 상황이라면 어떤 일이 벌어질까? your_name의 인수로 입력한 '브브걸'my_name의 인수로 인식되는 난감한 상황이 연출될 것이다. 이처럼 인수와 parameter가 정확한 짝을 이루도록 하기 위해 default value parameter와 non-default value parameter의 입력 순서를 반드시 지켜야 한다.

# 위치 인수와 가변 인수의 입력 순서

    def func_param_with_var_args(name, *args, age):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
 
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
    
    # 결괏값: TypeError: func_param_with_var_args() missing 1 required keyword-only argument: age'
  • 위 함수가 실행되도록 문제를 해결해보자. error가 발생한 이유는 parameter인 age짝을 이루는 인수 값이 없기 때문이다. 해결 방법엔 두 가지가 있다.
  • 첫 번째 해결 방법은 위치 인수(positional arguments) 20과 가변 인수 "01012341234", "seoul"의 순서를 바꿔주는 것이다. 우선 위치 인수와 가변 인수의 개념을 살펴보면 다음과 같다.

    • 위치 인수: 함수를 호출할 때 전달되는 값이 매개변수에 순서대로 전달되는 인수를 의미하며, 가장 자주 사용되는 방식입니다.

    • 가변 인수: 가변 인수란 인수의 개수가 변할 수 있다는 의미이며, 가변 인수를 전달받는 함수란 함수를 호출할 때, 인수의 개수를 다양하게 바꿔가며 사용할 수 있는 함수를 의미합니다.

  • 위치 인수의 입력 순서가 가변 인수보다 앞서야, parameter와 arguments가 정확하게 짝을 이룰 수 있어서 두 인수의 순서를 바꿔주도록 한다. 더불어 바뀐 인수의 순서와 일치할 수 있도록, parmeter의 순서도 함께 조정해준다.

    def func_param_with_var_args(name,  age, *args):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
 
    func_param_with_var_args("정우성", 20, "01012341234", "seoul")
    
    # 결괏값: 
    # name=정우성
    # args=('01012341234', 'seoul')
    # age=20
  • 두 번째 해결 방법은 인수 age키워드 인수로 표현해주는 것이다. 키워드 인수의 순서는 가변 인수 뒤에 위치하기 때문에, 순서를 바꿀 필요 없이 인수의 표현 형식만 바꿔주면 문제 해결이 가능하다.
    def func_param_with_var_args(name, *args, age):

        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)

    func_param_with_var_args("정우성", "01012341234", "seoul", age=20)

# 가변 키워드 인수의 순서

  • 가변 키워드 인수: 키워드 인수를 가변 개수로 전달하는 인수를 의미
  • 가변 키워드 인수는 모든 인수 중에서 가장 마지막 순서로 입력된다는 점을 기억하자. 다음 함수를 살펴보자.
    def func_param_with_kwargs(name, age, **kwargs, address=0):
        print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
 
    func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
    
# 결괏값: SyntaxError: invalid syntax
    
  • 함수는 SyntaxError를 반환하고 있다. error의 원인은 가변 키워드 인수와 관련 있다. 함수 호출 코드 func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")를 살펴보면, 가변 키워드 인수 mobile="01012341234"가 키워드 인수address="seoul"보다 앞서 위치해 있다. 우선 두 인수의 순서를 바꿔줘야 한다.

  • 문제의 또 다른 원인은 parameter에 있다. 키워드 가변 인수가 짝을 이루려면, parameter의 입력 순서도 인수와 일치시켜야 한다.

    def func_param_with_kwargs(name, age, address=0, **kwargs):
        print("name=",end=""), print(name)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
 
    func_param_with_kwargs("정우성", "20", address="seoul", mobile="01012341234")
    
    # 결괎값
    # name=정우성
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul
    

# 위치 인수, 키워드 인수, 가변 키워드 인수의 순서

  • 이번엔 위치 인수, 키워드 인수, 가변 키워드 인수의 순서에 대해 정리해보자. 아래의 함수를 보고 문제점을 파악해보자.
    def mixed_params(name="아이유", *args, age, **kwargs, address):
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
 
    mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
    
    결괏값: SyntaxError: invalid syntax
  • 우선, default value parameternon-default value parameter의 순서를 맞춰보도록 하자. default 값이 정의되지 않은 parameter agename(default 값이 정의된 parameter)보다 앞서야 하므로, age를 name 앞으로 옮겨 순서를 맞춘다.
  • 다음으로 키워드 인수의 순서를 맞춘다. 키워드 인수는 가변 인수 바로 뒤에 위치해야 하므로, 키워드 인수 address="seoul"을 가변인수 "01012341234", "male" 뒤로 옮겨준다. 당연히 parameter의 순서도 인수와 동일해야 하므로 address*args 뒤로 옮겨 준다.
    def mixed_params(age, name="아이유", *args, address, **kwargs ):
    
        print("name=",end=""), print(name)
        print("args=",end=""), print(args)
        print("age=",end=""), print(age)
        print("kwargs=",end=""), print(kwargs)
        print("address=",end=""), print(address)
   
    mixed_params(20, "정우성", "01012341234", "male",address="seoul" ,mobile="01012341234")
    
    # 결괏값: 
    # name=정우성
    # args=('01012341234', 'male')    
    # age=20
    # kwargs={'mobile': '01012341234'}
    # address=seoul 
     
profile
Difference & Repetition

0개의 댓글