함수가 받는 기본값이 없는 일반적인 파라미터
def f(a, b): print(a + b) f(1, 2) # 3
함수가 받는 파라미터가 없을 때 함수에서 자동으로 넘겨받는 기본값 파라미터
def f(a, b = 1): print(a + b) f(1) # 2
함수를 호출할 때 default value parameter보다 non-default value parameter가 먼저 오게되면 SyntaxError가 발생한다.
non-default value parameter는 파라미터를 받지 않을 경우 자동으로 넘기게 되는 기본값인데 함수 호출시 넘기는 파라미터 개수가 우선 다르니 함수는 어떤게 어느 파라미터로 넣어야 되는건지 모르기 때문에 에러를 일으킨다.
그래서 default value parameter를 앞에 써주고, non-default value parameter를 뒤쪽에 써줌으로써 파라미터의 위치를 확실히 해주는것이 좋다.def f(b = 1, a): return a + b f(10) # a에만 값을 넘기고 싶지만 넘겨받는 값의 위치를 분간하기 힘듦
함수 호출할 때 명시적으로 a에 값을 넣도록 해봤는데 non-default value parameter가 default value parameter뒤에 온다고 SyntaxError 에러가 난다.
함수 정의할 때 반드시 default value parameter가 먼저 오도록 정의해야된다.def f(b = 1, a): # 에러 발생 print(a + b) f(a = 1)
파라미터를 넣어서 함수를 정의할 때 파라미터의 위치를 잘 정해줘야한다.
파라미터중 앞에 *를 붙이게되면 가변 인수가 되는데 이는 앞에서 할당하고 남은 파라미터를 전부 받아서 튜플(tuple) 형태로 함수가 받게된다.
다음과 같이 함수를 정의하고 호출하면 TypeError 에러가 난다.
함수가 호출될 때 *args가 age에 넣을 인자도 가변 인수로 인식해서 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)
다음과 같이 age를 *args 앞으로 이동시켜서 에러를 방지해주면 된다.
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")
파라미터중 앞에 **를 붙이게되면 가변 키워드 인수가 되는데 이는 앞에서 할당하고 남은 파라미터를 전부 받아서 사전(dictionary) 형태로 함수가 받게된다.
함수를 호출할 때 key와 value값을 전달해 주면 된다.
다음과 같이 함수를 정의하고 호출하면 SyntaxError 에러가 난다.
가변 인수와 마찬가지로 **kwargs가 address위치에 들어갈 값을 가변 키워드 인수로 인식해서 에러를 일으킨다.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")
이 경우도 address를 **kwargs앞으로 옮겨줌으로써 에러를 발생시키지 않도록 하면 된다.
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")
함수가 파라미터 값을 받을 때 위치에 따라 받는 값이 정해져 있는데 이런 것을 위치 인수라고 한다.
다음과 같이 함수를 정의하고 호출하면 SyntaxError 에러가 난다.
가변 인수와 가변 키워드 인수가 다른 인수를 가져가지 않도록 위치를 설정해 주어야한다.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")
다음과 같이 *args가 name과 age 뒤에 오게 하고, **kwargs가 address 뒤에 오게 바꿔주면 된다.
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")