함수(function)의 의미
파이썬에서 제공하는 기능으로 특정 용도의 코드를 한 곳에 모아 놓은 것을 뜻한다. 함수는 처음 한 번만 작성해 놓으면 필요할 때 계속 불러 쓸 수 있다.
함수를 사용하는 이유
파이썬 함수의 구조
def 함수명(매개변수1, 매개변수2, ...): <수행할 문장1> <수행할 문장2>` ...
def
: 함수를 만들 때 사용하는 예약어. 'define'에서 따온 키워드매개변수(parameter)
: 함수를 통해 입력받은 인수(argument)
가 저장되는 변수인수(argument)
: 함수를 호출할 때 넣는 값함수 호출
()
를 적어주면 된다.
함수 이름()
예시
def func_mul(x): # 매개변수가 x인 함수 생성
""" # 함수에 docstring 입력
자동 곱셈 함수
"""
y1 = x * 100
y2 = x * 100
y3 = x * 100
return y1, y2, y3 # return에 값을 지정함으로써 함수를 통해 반환되는 값을 지정
a, b, c = func_mul(5) # 인수(argument) 5를 입력하여 함수를 호출
# 더불어, 호출된 함수가 반환하는 값을 변수 a, b, c에 할당(저장)
print(a, b, c)
print(func_mul.__doc__) # 함수 이름.__doc__: 함수에 입력된 docstring 문자열에 접근해주는 메서드
위 예시의 경우처럼, 함수 안에 return
을 사용하면 값을 함수 바깥으로 반환한다.(만약 return
에 값을 지정하지 않으면 None
을 반환) 하지만 값의 반환이 곧바로 출력으로 이어지는 것은 아니다. 값을 출력하려면 print()
를 사용해야 한다.
위 예시처럼, return
을 통해 반환하는 값이 여러 개인 경우, 각각의 값은 tuple
에 담겨 출력된다.
def func_mul(x):
y1 = x * 100
y2 = x * 100
y3 = x * 100
return y1, y2, y3
print(func_mul(5)) # 결괏값: (500, 500, 500)
return
은 값을 반환하는 기능 이외에도 함수 중간에서 빠져나오는 기능을 한다. def func_mul(x):
y1 = x * 100
y2 = x * 100
y3 = x * 100
return
if y1 == 500:
print('y1의 값은 {}입니다.'.format(500))
# return으로 함수를 빠져나왔기 때문에, return 아래로 이어지는 print()는 실행x
print(func_mul(5)) # 결괏값: None
매개변수 vs 인수
매개변수(parameter)
: 함수를 통해 입력받은 인수(argument)
가 저장되는 변수
인수(argument)
: 함수를 호출할 전달하는 입력값
매개변수가 없는 함수
def say():
print('Hello wordl!')
a = say() # 함수가 실행되며, 결괏값 None은 변수 a에 저장된다
매개변수의 초깃값이 지정된 함수
함수를 호출하려면 매개변수의 개수만큼 인수를 입력해야 한다. 만약 아래의 예시처럼 매개변수의 개수에 맞춰 인수를 전달하지 않으면 error가 발생한다.
def example_mul(arg1, arg2): # 매개 변수 2개
for i in arg1, arg2:
print(i)
example_mul(10) # 전달한 인수 1개
# Error 발생 : TypeError: example_mul() missing 1 required positional argument: 'arg2'
하지만, 함수의 매개변수에 초깃값이 지정된 경우엔 인수 입력을 생략할 수 있다.
def example_mul(arg1, arg2=20): # 매개 변수 2개
for i in arg1, arg2:
print(i)
example_mul(10) # 전달한 인수 1개
# 정상적으로 실행된다.
매개 변수의 초깃값 지정 시 주의 사항
초깃값이 모든 변수에 지정되지 않은 경우라면, 초깃값이 설정되지 않은 매개변수를 가장 먼저 입력해야 한다.
초깃값이 지정돼도 인수 입력을 통해 새롭게 값을 지정할 수 있다.
가변 인수(variable argument) 함수 만들기(*매개변수
)
만약 함수의 입력값(인수의 입력값)이 몇 개가 될지 예측할 수 없는 경우엔 어떻게 해야 할까? 이러한 상황에선 가변 인수를 활용하면 된다. 가변 인수 함수는 인수 입력을 생략할 수도, 1개만 입력할 수도, 여러 개를 입력할 수도 있다.
가변 인수 함수를 만들 때에는 *매개변수
처럼 매개변수 앞에 *
(애스터리스크) 를 붙여주면 된다.
입력된 인수의 값은 각각 tuple
에 담겨 출력된다
주의 사항: 가변 인수와 고정 인수가 함께 사용될 경우, 고정 인수에 대응하는 매개변수를 가장 먼저 입력해야 한다.
def example_mul(arg1, arg2, *args): # '*매개변수' 형태로 입력하여 가변 인수 함수를 사용
x = []
for i in arg1, arg2, args:
x.append(i)
return x
print(example_mul(10, 20, 'park', 'kim')) # 고정 인수 'arg1', 'arg2'에 대한 값: 10, 20
# 가변 인수 '*args'에 대한 값: 'park', 'kim'
# 결괏값: [10, 20, ('park', 'kim')]
키워드 인수를 사용하는 가변 인수(variable argument) 함수 만들기(**매개변수
)
키워드 인수를 사용하는 가변 인수 함수는 키워드=값
형식으로 인수를 입력받는다.
해당 가변 인수 함수를 만들려면 **매개변수
처럼 매개변수 앞에 **
를 붙여주면 된다.
입력된 인수의 값은 각각 dict
에 담겨 출력된다
주의 사항: 가변 인수와 고정 인수가 함께 사용될 경우, 매개변수 순서에서 **kwargs는 반드시 가장 뒤쪽에 와야 한다.
def example_mul(arg1, arg2, *args, **kwargs): # '**매개변수' 형태로 입력하여 키워드 인수를 사용하는 가변 인수 함수를 사용
for i in arg1, arg2, args, kwargs:
print(i, end=' ')
example_mul(10, 20, 'park', 'kim', age1 = 24, age2 = 21)
# 고정 인수 'arg1', 'arg2'에 대한 값: 10, 20
# 가변 인수 '*args'에 대한 값: 'park', 'kim'
# 가변 인수 '**kargs'에 대한 값: age1 = 24, age2 = 21
# 결괏값: 10 20 ('park', 'kim') {'age1': 24, 'age2': 21}
unpacking을 이용하여 인수 넣기
*
(에스터리스크)는 매개변수 앞에 붙어서 가변 인수 함수를 생성하는 데 사용될 뿐만 아니라, 반복 가능한 객체(iterable)의 요소를 unpacking하여 함수의 인수로 입력할 때 사용되기도 한다.
unpacking이란??
기본적인 형식은 다음과 같다.
함수 이름(*iterable 객체)
예시
def example_mul(arg1, arg2, *args):
x = []
for i in arg1, arg2, args:
x.append(i)
return x
a = [1, 3, 5, 6, 7, 8, 9] # 인수로 입력할 요소로 구성된 list 객체이다.
print(example_mul(*a)) # '에스터리스크'를 활용하여 변수 a에 할당된 list 객체의 요소를 각각의 매개 변수에 나누어 담는다.
# 결괏값: [1, 3, (5, 6, 7, 8, 9)]