저번 1편에 다뤘던 위치 인수와 가변 인수의 차이점을 잠시 살펴보고 가자. 그리고 default(or non-default) value parameter도 개념을 보고 가자.
위치 인자(positional arguments)
: 함수 호출 시 전달되는 값이 매개변수에 순서대로 전달되는 인자. 가장 일반적으로 사용하는 argument다.가변 인자(variable length arguments)
: 개수가 변할 수 있는 인자, 즉 함수 호출 시 인수의 개수를 다양하게 바꾸며 전달할 수 있다.default value parameter
: 함수를 선언 시 미리 값이 정해지게 되는 매개변수non-default value parameter
: 함수 선언 시 미리 값이 정해져 있지 않은 매개변수
이제 실제로 어떻게 코드로 구현되는지 살펴 보자.
*
와 뒤에 이름을 붙여 쓴다*args
의 형태로 쓰인다.
**
와 뒤에 이름을 붙여 쓴다**args
의 형태로 쓰인다.def saveInfo(name, age, address):
print('이름: ', name)
print('나이: ', age)
print('주소: ', address)
saveInfo('홍길동', 20, '서울 종로구 사직로 161')
이름: 세종
나이: 20
주소: 서울 종로구 사직로 161
- 위치 인자 (non-default)
- 위치 인자 (default)
- / (위치 인자들 어딘가에 존재한다)
- 위치 가변 인자 (*args)
- 키워드 전용 인자 (기본값 유무는 상관 없다)
- 키워드 전용 가변 인자 (**kwargs)
배운 내용을 토대로 아래 3문제를 풀어 보자.
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
*args
가 age
보다 앞에 와 버리는 바람에 남은 인자 age
를 찾지 못해 에러가 발생했다.
Traceback (most recent call last):
File "<string>", line 6, in <module>
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
>
해당 parameter *args
, age
의 위치와 호출하는 함수의 argument "seoul"
, 20
의 위치를 바꾸면 해결!
def func_param_with_var_args(name, age, *args):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("args=",end=""), print(args)
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
name=정우성
age=20
args=('01012341234', 'seoul')
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
이번에는 키워드 전용 가변 인자 **kwargs
의 위치가 address
앞에 위치해서 에러가 발생하였다.
File "<string>", line 1
def func_param_with_kwargs(name, age, **kwargs, address=0):
^
SyntaxError: invalid syntax
해당 parameter **args
, address
의 위치와 호출하는 함수의 argument mobile="01012341234"
, address="seoul"
의 위치를 바꾸면 해결!
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
args=('01012341234', '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
위치 인자 age
를 맨 첫 번째로, 키워드 가변 인자 **kwargs
맨 뒤로 보내면 해결! 물론 각각에 해당하는 함수의 인자의 순서도 바꿔야 한다. address=0
은 키워드 전용 인자이기에, 가변 인자와 키워드 전용 가변 인자 사이에 위치한다.
File "<string>", line 1
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
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
(GeeksforGeeks) *args and **kwargs in Python
(tistory, 불타는 키보드) [python]함수의 인자 형태와 순서 / (non)default value parameter, *args, **kwargs
(suasue.log) Python | 가변인자(*args)와 키워드 가변인자(**kwargs)
(intrepidgeeks) 위치인수와 가변인수