def 함수명(매개변수):
... code
return 결과값
위는 함수의 기본 구조이다. 함수는 parameter가 없을 수도 있고, return 값이 없을 수도 있다. 물론 parameter와 return 값 모두 없을 수도 있다. 여기서 parameter(매개변수)에 대해서 이야기 해보고자 한다.
함수는 매개변수를 받아서 매개변수 값을 return 한다. 함수의 매개변수에는 여러 형태가 있다.
인자 값이 순서대로 함수에 전해지는 경우로, 가장 기본적인 형태이다. 아래 예시는 매개변수 2개를 준 형태이다. 인자 값을 "홍길동"과 "전우치"로 선언한 순서대로 my_name 과 your_name 의 인자로 들어가서 return 된다.
def name(my_name, your_name):
return f"{my_name} 님은 {your_name} 님과 함께합니다!"
name("홍길동","전우치")
# '홍길동 님은 전우치 님과 함께합니다!'
Keyword Arguments란 함수를 호출할 때 인자 뿐만 아니라 매개변수 이름도 같이 전해주는 것을 말한다. 이 때의 장점은 함수 호출 시 인자의 순서가 바뀌어도 괜찮고, 가독성도 높아진다.
def name(my_name, your_name):
return f"{my_name} 님은 {your_name} 님과 함께합니다!"
name(your_name = "전우치", my_name = "홍길동")
# '홍길동 님은 전우치 님과 함께합니다!'
Positional Arguments와 Keyword Arguments를 같이 사용하는것도 가능하다. 단, 주의해야 할 점은 Keyword Argument는 순서가 바뀌어도 상관 없지만 Positional Arguments 부분은 순서를 꼭 지켜야한다.
예를들어, 아래 코드처럼 함수를 호출하면 error가 난다. 그 이유는 keyword argument가 positional argument 보다 더 앞으로 위치되어 함수가 호출되었기 때문이다. Positional arguments는 순서가 틀리게 되면 에러가 나게 된다.
def name(my_name, your_name):
return f"{my_name} 님은 {your_name} 님과 함께합니다!"
name(your_name = "전우치", "홍길동")
# SyntaxError: positional argument follows keyword argument
아예 매개변수에 값을 정의해 줄 수도 있다. Default 값이 정의된 매개변수는 함수가 호출될때 지정한 default 값이 return 되므로 인자 값을 남기지 않아도 괜찮다.
단, 여기에서도 default 값이 정의된 매개변수가 default 값이 정의 되지 않은 매개변수보다 먼저 위치해 있으면 syntax error가 나니 주의하자.
def name(my_name="홍길동", your_name):
return f"{my_name} 님은 {your_name} 님과 함께합니다!"
# SyntaxError: non-default argument follows default argument
아래는 가변 인자 *args
와 위치 인자가 함께 있는 함수다.
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)
# TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
아무래도 "정우성" 이후 값이 모두 args 의 인자로 선언되는 모양이다. args를 맨 앞에 넣으면 TypeError가 missing 2
로 뜨는걸 보니 가변 인자는 제일 마지막에 받아야 한다는 것을 알 수 있다.
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
# name=정우성
# args=('seoul', 20)
# age=01012341234
이번에는 가변 키워드 인자 **kwargs
와 위치인자, 디폴트 인자가 함께 있는 함수를 살펴보자.
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")
# IndentationError: unexpected indent
새로운 error가 떴다. 들여쓰기가 잘못된 경우에 나오는 에러라는데 인자의 위치를 한 번 바꿔보자. 위치 인자 > 디폴트 인자 > 가변 키워드 인자
순으로 고쳐보았다.
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
# name=정우성
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
마지막으로 앞에서 배운 모든 인자들이 섞인 함수다.
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")
# IndentationError: unexpected indent
6번 문제와 결과가 같다. 위치 인자 > 디폴트 인자 > 가변 인자 > 키워드 인자 > 가변 키워드 인자
순으로 고쳐보았다.
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
# name=정우성
# args=('01012341234', 'male')
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
인자마다 순서가 정해져 있고, 순서를 지키지 않고 사용하면 error가 발생한다는 사실을 알 수 있었다. 아래는 지금까지 알아봤던 인자들의 순서이다.
- positional arguments(위치 인자)
- default arguments(디폴트 인자)
- variable length arguments(가변 인자 *args)
- keyword arguments(키워드 인자)
- variable length keyword arguments(가변 키워드 인자 **kwargs)