함수 선언 시, 2개의 인자를 받을 때,
default value parameter 가 앞에 오면 안된다.def test(people = "이수현", nonpeople)
이렇게 입력을 하면 non-default argument follows default argument 에러가 뜬다.
왜?!🤷♂️
함수 정의할 때 꼭 넘겨야 하는 인수를 먼저 쓰고, 그 다음에 선택적으로 넘겨야 하는 인수를 써야한다! 즉,
def test(nonpeople, people = "이수현")
이렇게 하면 됩니다. 🎈
위치 인수 : 값이 매개변수에 순서대로 전달되는 인수이며, 가장 많이 사용한다.
def print_number (a,b,c): print(a,b,c) print(7,8,9)
789가 abc에 순서대로 들어간다.
가변 인수 : 인수의 개수가 변할 수 있다는 의미이다.
def function_name(*args): sum = 0 for i in args: sum += i print(1,2,3,4,5)
가변인수의 위치는 항상 위치인수 뒤에 와야한다. 왜냐하면 가변인수가 앞에 오게 되면 뒤에 오는 위치인수의 의미가 사실상 없어지기 때문이다
- 예제_수정전
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) >>>>> 가변인수가 위치인수보다 앞에 왔다. 수정해보자
- 예제_ 수정후
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, r"01012341234", "seoul")
키워드 인수를 가변인수를 사용해 하나의 매개변수로 받는 것
** 를 앞에 붙이면 된다.
이때, 값이 튜플로 전달되는 것이 아닌, 키워드와 값을 쌍으로 보내기 때문에 사전(dict)으로 전달 된다.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")
이 함수는 오류가 난다.
🤷♂️ 왜?!
- default 는 맨 앞에 두면 안된다고 했다.
- 가변인수 *args 가 위치인수 age 보다 앞에 있다.
- 키워드 가변인수 **kwargs가 address 보다 앞에 있다.
여기서 잠깐!! kwargs 와 args의 명칭은 다른 명칭으로 써도 상관없으나 통상적으로 위의 키워드를 쓴다. 특별한 경우가 아니면 수정하지 않기로,,
그럼 위의 내용 기반으로 코드를 수정해보자.def mixed_params(age, name="아이유", *args, address, **kwargs): print("age=", end=""), print(age) print("address=",end=""), print(address) print("name=",end=""), print(name) print("args=",end=""), print(args) print("kwargs=",end=""), print(kwargs) mixed_params(20, "정우성", "01012341234", "male" ,address="seoul", mobile="01012341234")
여기서 이상한 점!!
가변인수가 위치인수보다 뒤에 와야한다고 했으나, 위의 경우 *args뒤에 address가 왔다(꼭 기억하자!!)
address 의 경우 인자가 지정되어 있다.
- 이러한 변수를 keyword-Only Arguments 라고 부르며, *args뒤에 위치한다.
🔍 아래 그림을 같이 참고하면 좋을 것 같다.
_출처 : https://getkt.com/blog/python-keyword-only-arguments/