[TIL] Python: Function parameters
1. Arguments (인수)
1-1. Positional arguments (위치 인수)
Positional arguments (위치 인수)는 함수에 인수를 순서대로 넣는 방식이다.
1-2. Keyword arguments (키워드 인수)
Keyword arguments (키워드 인수)는 파이썬이 인수의 순서와 용도를 매번 기억하지 않아도 되도록 도와주는 방식이다.
1-3. Variable length arguments (가변 인수)
variable length arguments (가변 인수)는 위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 사용된다.
위치인자와 키워드인자 모두 가변인자로 사용할 수 있다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것이다.
- *args
args는 keyword 되지 않은 형태의 정해지지 않은 수의 argument 이다.
정해지지 않았으니 변수 개수와 상관없이 다 받아들일 수 있다.
- **kwargs
kwargs는 keyword가 있는 형태의 정해지지 않은 수의 argument 이다.
args와 기능은 동일하다.
2. Arguments의 순서
Python에서 함수가 선언될때 parameters의 순서는 다음과 같다:
- Regular positional arguments
- Default arguments
- Variable length positional arguments (*)
- Keyword-only arguments
- 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들의 순서가 잘못되었다.
- Positional argument (age)
- Default argument (name="아이유")
- Variable length positional argument (*args)
- Non-default keyword-only argument (address)
- 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
- image from: https://getkt.com/wp-content/uploads/2019/02/python-function-definition-arguments-kind-and-order.jpg
- https://docs.python.org/3/reference/expressions.html#calls
Author And Source
이 문제에 관하여([TIL] Python: Function parameters), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hojin11choi/TIL-Python-Function-parameters저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)