[Python] Function Parameters 2

김가람휘·2022년 1월 28일
1

Python

목록 보기
4/14
post-custom-banner

함수 정의 시 파라미터 순서

  1. 일반 positional 인수
  2. default value가 설정된 인수
  3. 가변 인수 (*args)
  4. non-default인 Keyword-Only 인수 (키워드 인수로 값을 전달할 때)
  5. default가 설정된 Keyword-Only 인수
  6. 가변 키워드 인수 (**kwargs)
  • 단, 4번 5번은 번갈아가며 위치가능

case 1) default value parameter를 non-default value parameter 앞에 정의 할 수 없는 이유

default value parameter가 non-default value parameter 앞에 정의되면 인수를 받았을 때 그 값이 default에 들어가야 하는지 non-default에 들어가야 하는지 인터프리터가 구별하지 못해서 에러가 발생합니다.

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

case 2) 위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치

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)


> Traceback (most recent call last):
  File "test.py", line 8, in <module>
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

파이썬 인터프리터가 age에 전달되는 함수가 무엇인지 모르고 있다.
가변 인수인 args가 위치 인수 age보다 앞에 쓰여 어디까지가 args인지를 알 수 없기 때문이다.

해결 방안 1

*args를 모든 위치 인수 뒤에 정의

def func_param_with_var_args(name, age, *args):  # *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

해결방안 2

age에 값을 전달할 때 키워드 인수로 전달

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)  # 키워드 인수를 통해 age에 전달될 값을 명확히 해준다.


>  name=정우성
args=('01012341234', 'seoul')
age=20 

case 3) 가변 키워드 인수(variable length keyword arguments)의 위치

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")


> File "test.py", line 1
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax

가변 키워드 인수도 가변 인수와 마찬가지로 정해지지 않은 개수의 인자값을 받을 때 사용된다. 따라서 모든 위치 인수 뒤에 정의되어야 한다.

해결 방안

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", mobile="01012341234", address="seoul")


> name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

case 4) 위치 인수(positional arguments)와 가변 키워드 인수(variable length keyword arguments)의 위치

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")


> File "test.py", line 2
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                             ^
SyntaxError: invalid syntax

일반 위치 인수 age가 default value가 설정된 name 인수보다 먼저 정의되어야하고 non-default인 Keyword-Only 인수 address는 가변 인수 *args와 가변 키워드 인수 **kwargs 사이에 들어가야 한다.

해결 방안

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
post-custom-banner

0개의 댓글