Python: Function Parameters

BY Jung·2021년 12월 4일
0
post-custom-banner

함수의 변수와 인수는 다음 이미지 한 장으로 요약된다

1. Default value parameter 가 non-default value parameter 앞에 위치하면 안되는 이유

def print_n_times(value, n=2):
  for i in range(n):
    print(value)
  #함수를 호출
print_n_times("안녕하세요")

쉽게 말해 위의 코드에서 매개변수(parameter)의 순서가

def print_n_times(n=2, value)

이와 같이 바뀌면 어떻게 되는가? 인데....

SyntaxError: non-default argument follows default argument

구문 오류가 뜬다

이유는 간단하다. 여러 매개변수가 들어가는 함수는 왼쪽부터 오른쪽 순서대로 매개변수가 대입되는데, "안녕하세요"가 정확히 몇 번째 매개변수에 할당되어야하는지 컴퓨터 입장에선 확실하게 알 수 없기 때문이다.

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)

위 함수를 호출하면 아래와 같은 에러가 뜬다
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

이유는 위치가 1번째로 고정되어 있는 위치 인수 name에는 "정우성"이 할당되지만, 그 뒤에 위치한 개수가 고정되어 있지 않은 가변 인수 *args에 "01012341234", "seoul", 20이 모조리 할당되었기 때문이다.
컴퓨터는 어디서부터 어디까지가 가변인수인지 특정해내지 못하므로

name, age, *args

순으로 수정하는 것이 옳다.

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

위 함수를 실행하면 invalid syntax 구문오류가 뜬다
2번과 유사한 이유로 생겨나는 문제이므로, 본 함수의 의도대로 가변 키워드 mobile의 순서가 가장 뒤로 이동하여야 한다
따라서 아래와 같이 수정한다

def func_param_with_kwargs(name, age, address=0. **kwargs):
.
. 이하 생략
.
func_param_with_kwargs("정우성", "20", address="seoul", mobile="01012341234",)

4. 위치 인수와 키워드 가변 키워드 인수 (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")

2번과 3번의 문제가 복합적으로 나타난 형태이다
*args와 **kwargs의 순서를 뒤로 이동하고 함수의 매개변수와 대응되는 인수를 대조하여 일치시켜야한다.

def mixed_params(name="아이유", age, address *args, **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, address="seoul", "01012341234", "male" , mobile="01012341234", )
profile
Slow and steady wins the race
post-custom-banner

0개의 댓글