함수를 정의할 때 파라미터를 넣어줄 수 있고, 파라미터의 종류는 다양하다. 종류의 특징에 따라 파라미터 순서를 정해주어야 한다.
함수 파라미터의 순서
1. Position argument 위치 인수name
우리가 주로 사용하는 기본 파라미터에 들어가는 값
2. Default value argument 기본값 인수name = "python"
기본값을 넣어준 파라미터이다. 함수 호출 시 인자값을 입력하지 않으면 기본값을 불러와 출력해준다.
3. Variable length argument 가변 인수*args
파라미터 값의 길이가 변화한다. 파라미터 앞에*
를 붙여 가변 인자를 정의할 수 있다.args
는 argument의 약자로 관례적으로 사용한다. 다른 이름을 붙여줘도 무관하다.
4. Keword only argument 키워드 인수imFunction(... age=20)
다른 인자들은 함수를 정의할 때 어떤 인자를 불러올 것인지 알 수 있다. 이와 다르게 키워드 인자는 함수를 호출할 때 구분할 수 있다. 인자와 함께 파라미터 이름을 같이 넣어주도록 한다. 파라미터 입력 우선 순위를 지킨다면 키워드 인자를 파라미터 순서와 다르게 입력하는 것도 가능하다.
5. Variable length keyword argument 가변 키워드 인수**kwargs
가변 키워드 인자도 가변 인자와 마찬가지로 파라미터 키워드와 값의 길이가 변화한다. 따라서 그 개수가 정해지지 않는다.**
를 붙이고 관례적으로 파라미터 이름을kwargs
로 붙인다.
A. 기본값 파라미터는 일반 파라미터 뒤에 입력해야 한다. 기본값 파라미터 - 일반 파라미터 순으로 정의하면 함수 호출 시 인수 개수가 파라미터와 같지 않을 때 에러가 발생된다.
def sum(num1=10, num2):
return num1 + num2
sum(2) #num1= 2
위 함수는 num1과 num2, 2개의 파라미터를 설정하였고 num1의 기본값은 10으로 설정했다. sum 함수 호출 시 우리는 num2에 2를 인수로 넣어주었지만, 프로그램은 인수를 순서대로 받아오기 때문에 num1의 인수를 2로 넣어준다. 따라서 기본값 파라미터는 일반 파라미터 뒤에 입력해주어야 한다.
<변경 전> TypeError
가 발생한다.
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 파라미터에 들어갈 값이 없어진다.
<변경 후>
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("정우성", 20, "01012341234", "seoul")
가변 인수 *args
를 위치 인수 뒤에 입력하면 아래와 같이 정상 출력된다.
<출력 결과>
name=정우성
args=('01012341234', 'seoul')
age=20
<변경 전> SyntaxError
가 발생한다.
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")
함수 호출도 하기 전에 정의할 때 이미 구문 오류가 발생한 것이다. 가변 키워드 인수는 파라미터 입력 순서 중 가장 마지막에 위치해야 한다. 위 코드는 기본값 인수보다 앞에 있다. 아래와 같이 맨 뒤로 옮겨주도록 한다.
<변경 후>
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")
<출력 결과>
name=정우성
age=20
kwargs={'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")
3번과 마찬가지로 함수 정의 시 이미 구문 오류가 발생한다. 파라미터를 순서에 맞게 작성하여야 한다.
<변경 후>
def mixed_params(age, name="아이유", *args, address=0, **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=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul