-
[PYTHON] 위치인수와 가변인수, 키워드 가변인수DEV/🐍 PYTHON 2021. 8. 9. 11:18
1. Positional argument와 Variable length argument란 무엇일까?
위치인수(Positional argument)란 함수를 호출할때 매개변수에 순서대로 전달되는 인수
데이터의 위치가 매개변수의 순서인 인수인것이다.
그러나 가변인수는 인수의 개수가 변할 수 있다는 의미이다.
- 이때, 가변인수를 전달받은 함수란 함수를 호출할때 인수의 개수가 다양하게 바뀌어 가면 사용할 수 있는 함수를 말한다. 쉽게 말해 데이터갯수에 제한이 없어지는 유동적인 함수가 되는 것이다.
def hello(a, *args): print(args) return a + sum(args) >hello(1,2,3,4,5)
우선 딱봐도 hello 함수의 개수가 이상한걸 볼 수 있다. 2개밖에 안들어가야하는데 5개나 들어가있다.
하지만 이상한게 아니다. *args가 있어 2개 이상으로 데이터를 받을 수 있는 함수가 된 것이다.
이제 함수 내부에서의 데이터 흐름을 보자
a=1 *args=2 -> print(2) return 1+2 = 3
args =3 -> print(3) return 3 + 3 = 6
args =4 -> print(4) return 6 + 4 = 10
args= 5 -> print(5) return 10 + 5 = 15
> (2,3,4,5) > 15
첫번째 1의 값이 a에 위치하게 되고, 나머지 4개의 값은 튜플값으로 args 할당하게된다.
다른예를 들어보자.
여기서 만약에 *args가 name과 age 매개변수 사이에 위치하고 있으면 에러가 발생하게 된다.
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)
이때 에러가 나는 위치는 "seoul" 데이터와 age의 20 데이터이다.
둘다 세번째 위치에 데이터가 할당되어 있어 정작 age 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")
2. 가변 키워드 인수 (variable length keyword arguments)
임의의 개수의 키워드 인자도 받을 수 있게 함수를 만들 수 있다. **kwargs
def hello(a, **kwargs): print(kwargs) print(a) hello(1, flag = True, mode = 'fast', 'header' = 'debug') > {'flag': True, 'mode': 'fast', 'header': 'debug'} > 1
1 이 defalut argument로 데이터가 할당되고 이후 kwargs에 딕셔너리 형태로 데이터가 할당되는 것을 확인할 수 있다.
만약에 이 **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) > SyntaxError: invalid syntax
당연히 에러가 뜬다. kwargs에 데이터가 2개 이상 들어가게 될 경우 address 데이터 할당공간이 없어지기 때문이다.
따라서 **kwargs와 address=0 의 위치를 바꿔주자.
3. 위치인수와 키워드 가변 인수의 혼용
위치인수 가변변수인수 , 키워드 가변변수 인수 모두 같이 사용할 수 있다.
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은 default argument로 위치가 할당되어있다. 이후 가변인수로 *args값이 나오게 되고
이는 튜플로 묶이게 되어 하나의 데이터로 취급된다.
그 다음 위치변수가 세번째자리에 age 데이터를 넣으라는 것이다.
근데 다음으로 나오는 kwargs라는 키워드 가변변수가 나오게 되면서 address 데이터의 자리가 공석이 될 가능성이 높다.
따라서 mixed_params데이터 순서에 맞게 바꿔주고 address와 **kwargs의 순서를 바꾸게 되면 에러는 해결된다.
(가독성을 위해 end = ""를 추가해서 줄바꿔서 보자)
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")
'코딩 > 🐍 PYTHON' 카테고리의 다른 글
[PYTHON] Class (0) 2021.08.10 [PYTHON] Dictionary와 Set, List와 Tuple (0) 2021.08.09 [PYTHON] Function Parameters (0) 2021.08.09 [PYTHON] Source Lake (0) 2021.08.06 [PYTHON] 가변객체와 불변객체는 무슨 말일까? (0) 2021.07.07