만약,
한정적인 인자가 아닌 그이상의 정해지지 않은 인자를 받고싶을때, 수많은 인자를 선언하기도 번거롭고 수가 정해지지 않았을때 같은형태로는 처리가 불가능하다. 이떄 사용하는 것이 **가변인자 (Variable Argument)이고,
position arguments와 keyword arguemnts 모두 사용할 수 있으며, 밑에서 자세히 다뤄보겠다.
▶ positional arguments만 받을 때
더보기
Code
def save_foods(*args):
print(args)
save_foods('떡볶이', '카레', '한우', '라면', '아이스크림')
Result
('떡볶이', '카레', '한우', '라면', '아이스크림')
▶ keyword arguments 만 받을 때
더보기
Code
def save_number(**kwargs):
print(kwargs)
save_number(one='일', two='이', three='삼')
Result
{'one': '일', 'two': '이', 'three': '삼'}
▶ positional arguments와 keyword arguments를 모두 받을 때
더보기
Code
def save_foods(*args, **kwargs):
print(args)
print(kwargs)
save_foods('라면', '떡볶이', '한우', one='일', two='이')
Result
('라면', '떡볶이', '한우')
{'one': '일', 'two': '이'}
- *args는 임의의 갯수의 positional arguments를 받음을 의미하며, **kwargs는 임의의 갯수의 keyword arguments를 받음을 의미한다. 이 때 *args, **kwargs 형태로 가변인자를 받는걸 packing이라고 한다.
- 위에 예시를 보면, 임의의 갯수와 임의의 키값을 갖는 인자들을 전달하고 있다. positional 형태로 전달되는 인자들은 args라는 tuple에 저장되며, keyword 형태로 전달되는 인자들은 kwargs라는 dict에 저장된다.
- 보통 오픈소스의 경우 코드의 일관성을 위해 *args이나 **kwargs와 같이 관례적으로 사용되는 인자명을 사용하지만, *required나 **optional과 같이 인자명은 일반 변수와 같이 원하는대로 지정이 가능하다. (단, 만약 오픈소스 프로젝트를 하고 있고, 인자에 특별한 의미가 있지 않은 일반적인 가변인자라면 *args와 **kwargs와 같이 관례를 따르는게 좋다.)
Arguments 예제
더보기
첫번째
Code
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("wecode", "01012341234", "seoul", 20)
Error
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
After fixing
Code
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("wecode", 20, "01012341234", "seoul")
#함수 파라미터중 position arguments인 age 위치에맞게 함수 호출 인자 '20'을 옮겼다.
Result
name=wecode
args=('01012341234', 'seoul')
age=20
더보기
두번째
Code
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("wecode", "20", mobile="01012341234", address="seoul")
Error
SyntaxError: invalid syntax
# keyword는 positional보다 앞에 선언할 수 없기 때문에 error가 발생
After fixing
Code
def func_param_with_kwargs(name, age, address=0, **kwargs): #keyword arguments인 **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("wecode", "20", mobile="01012341234", address="seoul")
Result
name=wecode
age=20
kwargs={'mobile': '01012341234'}
address=seoul
더보기
세번째
Code
def mixed_params(name="wecode", *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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
Error
# position arguments 과 keyword arguments 들의 위치가 알맞지않다.
After fixing
Code
def mixed_params(name="wecode", *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, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
# 위치만 바꿔서 오류를 수정해보았다.
or
def mixed_params(age, address, name="wecode", *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, "seoul", "wecode", "01012341234", "male", mobile="01012341234")
'''
위치를 바꾸고, 함수호출부분의 파라미터 address부분을 keyword가아닌 position arguments로 바꿔서
에러를 고쳤다.
'''
Result
name=wecode
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'Python' 카테고리의 다른 글
Modules and Package (Feature) (0) | 2020.06.03 |
---|---|
Modules and Package (0) | 2020.06.02 |
Class (0) | 2020.06.01 |
List : 추가 와 변경 (0) | 2020.05.28 |
Python Theory (0) | 2020.05.27 |