용어가 헷갈려서 정의하자면 parameter는 함수가 받는 변수를 의미하고, Argument는 함수가 실제로 사용하는 값이라고 할 수 있습니다.
#Parameter
def add(num1, num2)
return num1 + num2
#Argument
add(5,7)
위의 함수에서 num1, num2를 parameter / 5,7을 argument라고 할 수 있습니다.
함수의 parameter에는 여러가지 형태가 있는데 가장 기본적인 형태는 순서대로 값이 parameter로 함수에 전해지는 경우입니다.
이렇게 순서대로 할당되는 argument를 positional argument
라고 합니다.
순서로 값을 전해주는 대신 이름으로 맞추어서 값을 전해줄 수 있는데, 이를 keyword argument
라고 합니다.
위의 사진처럼 순서가 바뀌어도 parameter 이름에 맞추어 값을 함수에 넘기기 때문에 실수로 값이 바뀔 확률이 적고 가독성 또한 높아지는 장점이 있습니다.
positional argument와 keyword arguments를 혼용하여 사용하는 것도 가능합니다.
여기서 주의해야 할 점은 keyword argument는 순서가 바뀌어도 상관 없지만 positional argument는 순서를 지켜줘야 한다는 점입니다. 예를 들어,
def love_you(my_name, your_name):
print(f'{my_name} loves {your_name})
love_you(your_name = "아이유", "정우성")
위의 코드처럼 함수를 호출할 경우 다음과 같은 error가 나타납니다.
>Traceback (most recent call last):
File "python", line 1
SyntaxError: positional argument follows keyword argument
이런 error가 나타나는 이유는 keyword argument가 positional argument보다 더 앞으로 위치하여 호출되었기 때문입니다.
함수의 parameter에 default값을 정의하는 것도 가능합니다. 이를 Parametr Default Value
라고 합니다. 이러한 경우 defulat로 정의된 parameter는 함수가 호출될 때 값이 넘겨지지 않아도 괜찮습니다. 값이 넘겨지지 않는 경우에는 정의한 default값이 자동으로 넘겨지게 됩니다.
조심해야 할 점은 default값이 정의된 parameter가 default값이 정의되지 않은 parameter 보다 먼저 위치해 있으면 안된다는 점입니다.
그럼 왜 default value parameter를 non-default value parameter 앞에 정의하면 안되는 걸까요?
positional argument가 parameter에 할당될 때는 왼쪽에서 오른쪽 순서의 방향성이 존재합니다.
따라서 default value parameter를 non-default parameter 앞에 정의하고 argument를 1개만 전달할 경우
def love_you(my_name = "정우성", your_name):
print(f"{my_name} loves {your_name}")
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
해당 argument는 default value parameter에 할당되므로 non-default value parameter는 할당받는 값이 없어서 오류가 발생하게 됩니다.
1.Positional Arguments
2.Default Argument
3.Variable Length Positional Arguments
4.Non-Default Keyword-Only Arguments
5.Keyword-only Argument With Defaults
6Variable Lenth Keyword Arguments
1.위치인수와 가변인수
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)
#error
Traceback (most recent call last):
File "/Users/itaeyeon/Desktop/pythonWorkspace/practice.py", line 16, in <module>
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
Variable Length Positional Arguments가 Positional Arguments 앞에 있어서 발생한 error이므로 age와 *args의 위치를 바꿔 함수를 호출하면 정상적으로 호출됩니다.
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")
#output
name=정우성
args=('01012341234', 'seoul')
age=20
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")
#error
SyntaxError: invalid syntax
Default Arguments가 Variable Length Keyword Arguments보다 뒤에와서 발생한 error이므로 **kwargs와 address=0의 순서를 바꿔주면 정상적으로 함수가 호출됩니다.
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")
#output
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
3.위치인수와 가변키워드 인수
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")
#error
SyntaxError: invalid syntax
Argument의 우선순위를 지켜 작성하면 함수가 정상적으로 호출됩니다.
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")
#output
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul