[TIL] Python: Function parameters

Jene Hojin Choi·2021년 1월 13일
0

Python

목록 보기
2/6
post-thumbnail

1. Arguments (인수)

1-1. Positional arguments (위치 인수)

Positional arguments (위치 인수)는 함수에 인수를 순서대로 넣는 방식이다.

1-2. Keyword arguments (키워드 인수)

Keyword arguments (키워드 인수)는 파이썬이 인수의 순서와 용도를 매번 기억하지 않아도 되도록 도와주는 방식이다.

1-3. Variable length arguments (가변 인수)

variable length arguments (가변 인수)는 위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 사용된다.
위치인자와 키워드인자 모두 가변인자로 사용할 수 있다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것이다.

  1. *args
    args는 keyword 되지 않은 형태의 정해지지 않은 수의 argument 이다.
    정해지지 않았으니 변수 개수와 상관없이 다 받아들일 수 있다.
  1. **kwargs
    kwargs는 keyword가 있는 형태의 정해지지 않은 수의 argument 이다.
    args와 기능은 동일하다.

2. Arguments의 순서

Python에서 함수가 선언될때 parameters의 순서는 다음과 같다:

  1. Regular positional arguments
  2. Default arguments
  3. Variable length positional arguments (*)
  4. Keyword-only arguments
  5. Variable length keyword arguments (**)

위의 순서를 지키지 않으면 syntaxError가 뜬다.

2-1. non-default & default parameters 의 위치

non-default parameter보다 default parameter 가 먼저 오면 파이썬 interpreter는 이를 인식하고 syntaxError를 내보낸다.
그리하여 반드시 default parameter는 non-default parameter 뒤에 위치해야한다.

non-default parameter -> default parameter

2-2. *args 의 위치

아래의 코드를 돌렸을 때 왜 에러가 나는 것인지 살펴보도록 하자.

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)

에러 메세지:

   func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

솔루션:

variable length positional argument 인 *args 가 positional argument 인 age 앞에 위치해있다.

아래와 같이 *args가 제일 마지막에 오도록 함수를 고치면 아래와 같은 결과를 얻을 수 있다. age가 20살이 되도록 함수를 부를때의 input 위치도 바꾸어주었다.

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

결과:

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

2-3. **kwargs의 위치

다음 코드에서의 에러가 왜 일어나는 것인지 알아보자.

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

에러 메세지:

    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax

솔루션:

default argument 인 address가 variable length keyword argument 인 **kwargs보다 뒤에 위치해있다. 이 둘의 순서를 고쳐주어야한다.

default값이 있는 address는 positional arguments 인 age, name 보다 뒤에 위치해야한다.

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

2-4.

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

에러 메세지:

def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax

솔루션:

위의 문제들과 마찬가지로 argument들의 순서가 잘못되었다.

  1. Positional argument (age)
  2. Default argument (name="아이유")
  3. Variable length positional argument (*args)
  4. Non-default keyword-only argument (address)
  5. Variable length keyword argument (**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" ,mobile="01012341234", address="seoul"

결과:

name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

References

0개의 댓글