함수는 input parameter
를 받아서 return
값을 output으로 리턴합니다.
그리고 함수를 호출할때 parameter
를 함수에 건내주어서(pass) 호출 합니다.
본 포스팅에서는 함수의 parameter
에 여러 형태에 대해서 정리하였습니다.
순서대로 값을 넣는 방식 입니다.
기본 적인 함수 인수를 생각하시면 됩니다.
ex)
def set_info(name, age):
....
# 호출 시
set_name("철수", 25)
순서 대신에 parameter 이름으로 맞추어서 값을 전해주는 방법을 키워드 인수라고 합니다.
ex)
def set_info(name, age):
....
# 호출 시
set_name(age=25, name="철수")
키워드 인수처럼 이름을 명시해야되는데, 무조건
명시해야 됩니다.
*
를 인수로 정의하면 다음 인수부터 키워드 전용 인수임. (*
가 나오면 위치 인수
가 끝났다고 볼 수 있음)ex1) * 뒤에 오는 인수들은 키워드 전용 인수
def set_info(name, *, age):
....
# 호출 시
set_info("영희", age=20) #ok
set_info("철수", 25) #error
TypeError: set_info() takes 1 positional argument but 2 were given
ex2) 가변인수 뒤에 오는 인수들은 키워드 전용 인수
def set_info(name, *etc, age):
....
# 호출 시
set_info("영희", age=20) #ok
set_info("철수", 25) #error
TypeError: set_info() missing 1 required keyword-only argument: 'age'
함수의 parameter
에 default
값을 정의하는 방식
Default 값이 정의된 paramter
는 함수가 호출될때 값이 넘겨지 않아도 괜찮습니다.
ex)
def set_info(name, age, hobby="없음"):
....
# 호출 시
set_name(age=25, name="철수", "코딩하기")
set_name(age=30, name="철이") # hobby가 자동으로 "없음"으로 설정됨.
인수의 개수가 정해지지 않고 받을 수 있음 즉 안 넣을 수 도 있고, 여러개를 넣을 수도 있습니다.
*
를 붙임ex)
def set_names(*names):
....
# 호출 시
set_name("철수", "영희", "덕구")
set_name("태식")
set_name()
인수의 개수가 정해지지 않고 받을 수 있음 즉 안 넣을 수 도 있고, 여러개를 넣을 수도 있습니다.
**
를 붙임ex)
def set_option(**option):
....
# 호출 시
set_option(home="전세", min_price=10000000, max_price=90000000, location="서울")
set_option(home="월세", month_price=300000)
set_option()
각 인수에는 순서가 존재합니다. 이러한 순서가 없다면 함수를 호출 하기 위해 값을 설정 시에 어떠한 값이 어느 인수에 들어가야되는지 명확하지 않아
많이 힘들지 않을 까 싶습니다.
아래 그림을 참고하면 알 수 있습니다.
자주 사용하는 print는 Variable Length Arguments, Variable length keyword arguments로 구성되어 있습니다.
💡 21.05.16 Edit end는 키워드 전용 인수인수입니다.
ex)
print() # 가변 인수, 가변 키워드 인수이기 때문에 인수를 안 받아도 됨.
print(end="")
print("hello", "world")
print("Good!", end="")
def func_param(name="철수", age):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
func_param("철수", 20)
SyntaxError: non-default argument follows default argument
default인수는 non-default 앞에 올 수 없음
가능하다고 해도, non-default인수 때문에, 무조건 2개의 인수를 넣어야됨.
따라서 default 인수를 사용하는 이유가 없어짐.
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'
가변인수 뒤에 있으면, 키워드 전용 인수가 되므로 위와 같은 에러 발생
def func_param_with_var_args(name, *args, age):
...
func_param_with_var_args("철수", "01012341234", "seoul", age=20)
가변인수 뒤에 있으니, age가 키워드 전용 인수 이므로 함수 호출 시, 키워드(age) 명시
def func_param_with_var_args(name, age, *args):
...
func_param_with_var_args("철수", 20, "01012341234", "seoul")
age를 name 뒤로 이동시켜, 위치 인수로 만들기
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, **kwargs, address=0):
^
SyntaxError: invalid syntax
가변 키워드 인수는 순서상 맨 마지막에 와야 되기 때문에 **kwargs
, address=0
의 위치를 변경해야됨.
변경을 하면 1.위치 > 2.디폴트 > 3.가변키워드 인수 순이 됨.
def func_param_with_kwargs(name, age, address=0, **kwargs):
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")
def mixed_params(name="철수", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
다음 순으로 인수 위치 변경
1. age: 위치 인수
2. name: 디폴드 인수
3. args: 가변 인수 - "01012341234", "male"가 들어감
4. address=0: 디폴트 키워드 전용 인수
5. kwargs: 키워드 전용 인수
def mixed_params(age, name="철수", *args, address, **kwargs):
앞서 살펴본 바와 같이 python에는 다양한 인수의 형태가 있는데요. 이렇게 다양한 인수의 형태는 코드를 할 때 더욱 더 편하고 유연하게 작성할 수 있도록 도와주는 것 같습니다.
여러가기 인수의 형태 때문에 위치가 헷갈릴 수 있지만, 각 인수의 특징을 이해한다면, 자연스럽게 어떻게 조합해서 사용해야 할지 생각할 수 있을 것 같습니다.
python keyword only arguments - getkt.com
이펙티브 파이썬 - 21. 키워드 전용 인수로 명료성을 강요하자