def
는 함수를 만들 때 사용하는 예약어입니다. 함수 이름, 인자 목록과 콜론(:)을 입력한 다음에 수행할 코드를 작성합니다.
함수에서 값을 반환하려면 return
을 사용합니다.
두 개의 인자(a, b)를 더하는 함수를 다음과 같이 생성해 볼 수 있습니다.
def sum_function(a, b):
return a + b
다음과 같이 생성한 함수를 호출할 수 있습니다. sum_function에 2개의 인수(5, 7)을 전달하면 5 + 7인 12가 반환됩니다.
def sum_function(a, b):
return a + b
c = sum_function(5, 7)
print(f'5 + 7 = {c}')
당연히 인자가 없는 함수를 선언할 수도 있으며 반환 값도 필수 값은 아닙니다.
def no_param():
return 'Hello'
def no_return():
print('World')
print(no_param())
no_return()
함수의 인자를 전달할 때, 기본적으로는 positional argument 방법이 사용됩니다. 함수 정의에서 지정한 위치
에 따라 전달되는 방법입니다.
다음과 같이 함수 정의에서 지정한 인자의 위치와 전달되는 인수의 위치가 같아야 합니다.
def my_func(name, age):
print(f'my name is {name} and {age} years old')
my_func('john doe', 20) # my name is john doe and 20 years old
"john doe"와 20의 위치가 바뀐다면 my_func 함수에서는 name이 20이고, age가 "john doe"가 됩니다.
def my_func(name, age):
print(f'my name is {name} and {age} years old')
my_func(20, 'john doe') # my name is 20 and john doe years old
Keyword argument는 함수의 인자를 전달할 때, 인자의 이름
에 따라 전달되는 방법입니다.
다음과 같이 함수 정의에서 지정한 인자의 이름과 인수의 이름이 같아야 하며, 위치에 대한 제약이 없습니다.
def my_func(name, age, country):
print(f'name : {name}')
print(f'age : {age}')
print(f'country : {country}')
my_func(country='KR', age=20, name='john doe')
다음과 같이 positional argument 방법과 함께 사용할 수 있습니다.
def my_func(name, age, country):
print(f'name : {name}')
print(f'age : {age}')
print(f'country : {country}')
my_func('john doe', country='KR', age=20)
💡 my_func(name='john doe', age=20, 'KR')와 같이 positional argument가 Keyword argument보다 뒤에 사용될 경우 SyntaxError가 발생합니다.
인수를 전달하지 않아도 미리 지정된 초기 값
을 설정하여 자동으로 할당되게 할 수 있습니다.
당연히, 인수를 전달하면 초기 값이 아닌 전달된 값을 사용하게 됩니다.
def my_func(name, age, country='KR'):
print(f'name : {name}')
print(f'age : {age}')
print(f'country : {country}')
my_func('john doe', 20)
💡 my_func(name, country='KR', age)와 같이 초기 값이 설정되지 않은 인자의 위치보다 앞에 사용될 경우 SyntaxError가 발생합니다.
함수의 인자 개수가 가변적일 경우 *args
나 **kwargs
를 사용할 수 있습니다.
변수 명은 정해진 것은 없으나, 다른 이들과의 협업 등을 위해 되도록이면 args나 kwargs를 사용합니다.
다음과 같이 인자의 개수를 원하는 대로 주어서 실행이 가능합니다.
def sum_function(*args):
result = 0
for arg in args:
result += arg
return result
print(sum_function(1,2,3,4,5)) # 15
args(arguments)를 사용할 때는 변수 값만 전달하였다면, kwargs(keyword arguments)는 변수의 이름과 함께 사용이 가능합니다.
def my_func(**kwargs):
for key, value in kwargs.items():
print(f'{key} : {value}')
my_func(name='john doe', age=20, country='KR')
💡 *args의 데이터 타입은 tuple이고, **kwargs의 데이터 타입은 dict
입니다.
다음과 같이 args와 kwargs를 동시에 사용할 수 있습니다.
def myFun(*args, **kwargs):
print(f'args: {args}')
print(f'kwargs: {kwargs}')
myFun('john doe', 20, 'KR', name='john doe', age=20, country='KR')
함수의 인자 및 반환 값에 대한 데이터 타입을 명시
하여 코드의 가독성과 안정성을 높일 수 있습니다.
💡 PEP 484에서 자세한 내용을 확인할 수 있습니다.
어떤 함수의 인자가 str형과 int형을 받아서 dict형의 데이터를 반환한다고 하면 다음과 같이 작성할 수 있습니다.
def my_func(a:str, b:int) -> dict:
return {"name":a, "age":b}
print(my_func('john doe', 20))
하지만, 주석과 같은 용도이지 강제성이 없습니다.
즉, str형에 int를 전달하여도 오류가 나지 않고 int으로 취급됩니다.
def my_func(a:str, b:int) -> dict:
print(type(a)) # <class 'int'>
print(type(b)) # <class 'str'>
my_func(20, 'john doe')
💡 Keyword argument와 조합하고자 할때는 my_func(a:str, b:int=20)과 같이 Type hints 이후에 사용하면 됩니다.