파이썬의 함수 파라미터에는 Positional Arguments와 Keyword Arguments 두 가지 방식이 있습니다.
Positional Arguments는 가장 기본적인 함수의 파라미터 형태로, 말 그대로 위치에 따라 인자가 함수 내부식에 대입됩니다.
def student_info(name, sex, age) :
print(f"""
이름 : {name}
성별 : {sex}
나이 : {age}
""")
>>> student_info("고길동", "남자", 50)
이름 : 고길동
성별 : 남자
나이 : 50
# 단점 : 순서를 잘못 알면 원하는 결과 값이 나오지 않음
>>> student_info("고길동", 50, "남자")
이름 : 고길동
성별 : 50
나이 : 남자
위와 같이 student_info
함수의 인자로 들어간 name
, sex
, age
순서대로 결과 값이 반영됩니다. 인자의 수가 적을 때는 문제가 없지만, 만약 수가 많아져서 각 위치에 들어갈 값을 잘못 입력하게 되면, 두 번째 예시와 같이 원하지 않는 결과가 나올 수 있습니다. 이런 경우를 방지하기 위해서 다음에 설명할 Keyword Arguments 형태를 사용할 수 있습니다.
Keyword Arguments는 순서가 아니라 각 인자에 대입된 값을 함수 내에 전달해 줍니다. 순서를 기억할 필요가 없는거죠. 다음 예시처럼 함수를 호출할 때 키워드 인자를 넣어주면, 아까와 같이 원하는 결과를 불러올 수 있습니다.
>>> student_info(age = 50, name = "고길동", sex = "남자")
이름 : 고길동
성별 : 남자
나이 : 50
두 가지 형태의 인자를 한 함수에 혼합해서 사용할 수도 있습니다. 아래 예시를 보면 첫 번째 인자에는 위치 인자, 두 번째, 세 번째에는 키워드 인자를 사용해 함수를 호출했고, 성공했습니다.
>>> student_info("고길동", age = 50, sex = "남자")
이름 : 고길동
성별 : 남자
나이 : 50
한 가지 주의할 점은 위치 인자를 입력하는 부분에서는 순서를 지켜줘야한다는 점 입니다. 왜냐하면 키워드 인자가 나오는 순간부터 순서를 알 수 없게 되기 때문입니다. 그래서 위치 인자가 키워드 인자 앞에 나와야하고, 이 위치 인자들의 순서는 지켜져야합니다. 만약 순서를 지키지 않으면 아래와 같은 에러 메시지가 노출됩니다.
>>> student_info(age = 50, "고길동", sex = "남자")
SyntaxError: positional argument follows keyword argument
함수를 정의할 때 각 파라미터의 default 값(기본 값)을 지정해 놓을 수도 있습니다. 해당 인자에 넣을 값을 모르거나 넣을 값이 없을 경우, 함수가 반환될 때 기존에 설정한 default 값이 대신 노출되게 하는 기능입니다.
아래 예시와 같이 기존에 함수를 정의할 때 넣어둔 매개변수의 수 만큼 인자를 입력하지 않으면, 인자가 더 필요하다는 에러 메시지가 나타납니다.
>>> student_info("고길동", age = 50)
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
student_info("고길동", age = 50)
TypeError: student_info() missing 1 required positional argument: 'sex'
반면에 함수를 아래와 같이 age
에 default 값을 주고 재정의한 후, age
인자 없이 함수를 호출하면 기존에 설정한 default 값이 노출되는 것을 확인할 수 있습니다.
def student_info(name, sex, age="모름") :
print(f"""
이름 : {name}
성별 : {sex}
나이 : {age}
""")
>>> student_info("고길동", sex = "남자")
이름 : 고길동
성별 : 남자
나이 : 모름 # default 값 노출
이렇게 끝이면 좋겠는데 default 값을 활용할 때도 주의할 점이 있습니다. 함수를 정의할 때 default 값 파라미터를 non-default 값 파라미터 앞에 선언하면 안된다는 점 입니다. 아래와 같이 default 값 파라미터를 앞에 선언하면, SyntaxError가 뜨면서 함수가 선언되지 않습니다.
def student_info(name = "무명", sex, age) :
print(f"""
이름 : {name}
성별 : {sex}
나이 : {age}
""")
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
왜냐하면 default 값 파라미터가 앞에 선언되어버리면, 이후에 함수를 호출할 때 입력한 특정 인자가 어떤 파라미터에 대입되는지 알 수 없기 때문입니다. default 값 파라미터 자체가 입력이 될 수도, 안될 수도 있는 값이기 때문에, 정확히 원하는 값을 반환하는데 어려움이 있습니다.