함수란?
파이썬(Python)에서 함수는 어떤 입력을 받고, 받은 입력을 처리해서, 처리한 값을 반환 하는 코드를 말합니다. 함수는 def 라는 키워드를 사용해서 정의할 수 있습니다.
함수가 왜 필요할까?
함수를 사용해서 반복적으로 사용되는 비슷한 코드를 간략하게 대체할 수 있기 때문입니다. 함수 안에서 선언된 변수(지역변수, local variables)들은 다른 함수나 외부 코드에게 보여지지 않기 때문에 독립적으로 안전하게 코드를 작성할 수 있습니다. 함수는 코드를 재사용할 수 있게 하고 결과적으로 모듈화를 가능하게 합니다.
함수의 정의
먼저 덧셈을 하는 함수의 예제를 보겠습니다.
def add(a, b):
c = a + b
return c
위의 함수는 add 라는 함수를 def 키워드를 사용해서 정의하고 있습니다. 함수 이름 뒤에는 괄호가 따라오며 괄호 안에 어떤 입력을 받을 지 정의할 수 있습니다. 이 예제에서는 (a, b) 라고 입력을 정의했습니다. 입력 뒤에는 콜론(:)으로 문장을 끝내야합니다. 그리고 바로 함수의 실제 코드가 따라와야합니다. 실제 코드는 앞서 배운 들여쓰기(indentation)를 하고 작성이 되어야 합니다. 이 함수는 덧셈을 하고 그 결과를 반환하는 함수이기 때문에 입력으로 받은 변수 a와 b를 더해서 변수 c에 할당합니다. 그리고 최종적으로 return 키워드를 사용해서 결과값을 반환합니다. 보통 함수는 return을 통해서 그 결과를 반환하지만 그렇지 않은 경우도 있습니다.
함수의 호출
함수를 호출 하기 위해서는 해당 함수가 선언이 되어있어야 합니다. 그리고 함수에 적절한 인자값을 입력해서 함수를 호출할 수 있습니다. 만약 함수가 반환값이 있다면 변수에 값을 할당 할 수 도 있습니다.
# 함수의 정의. add 함수를 정의합니다.
def add(a, b):
c = a + b
return c
# 함수의 호출. 함수의 a, b인자에 각각 1과 2가 할당이 됩니다.
# 함수는 인자로 넘긴 1과 2를 합한 결과를 반환합니다. 반환값은 변수 r에 저장이 됩니다.
r = add(1, 2)
print(r)
# 3
함수의 인자(Arguments)
함수를 정의할때 입력을 위해 정의한 괄호안의 변수들을 파라미터(parameter) 또는 인자(argument)라고 합니다. 두 용어간의 미묘한 차이가 있지만 지금은 그냥 둘다 입력을 위한 변수라고 생각합시다. 이 후부터는 이 녀석들은 일관되게 '인자'라는 용어를 쓰도록 하겠습니다. 함수의 인자는 몇개이든 상관 없습니다. 하나도 없을 수도 있고 여러개가 될 수도 있습니다.
def add(a, b, c):
d = a + b + c
return d
r = add(1, 2, 3)
print(r)
# 6
또한 함수 인자는 변수이기 때문에 변수이름 규칙에 따라 이름을 만들 수 있습니다.
def add(x, my_y, your_z0):
d = x + my_y + your_z0
return d
r = add(1, 2, 3)
print(r)
# 6
함수의 인자는 기본값(default argument)을 가질 수 있습니다. 함수 선언시 인자에 기본값을 할당하면 됩니다. 아래 예제에서 다양한 사용법을 살펴볼께요.
def add(a, b, c=2):
d = a + b + c
return d
# 인자 a, b, c 모두에게 순서대로 1 이 할당됩니다.
# 즉, 결과는 3이 되겠죠
t = add(1, 1, 1)
print(t)
# 3
# 인자 c는 기본값이 2이기 때문에, 함수 호출 시 값을 주지 않으면, 기본값 2를 가지게 됩니다.
# 즉, a는 1, b는 1, c는 2가 되어 결과는 4가 됩니다.
t = add(1, 1)
print(t)
# 4
# 함수 호출시 인자의 이름을 명시적으로 줄 수도 있습니다. (keyword argument)
t = add(a=2, b=3, c=4)
print(t)
# 9
# 명시적으로 인자를 할당하면 인자의 순서가 바뀌어도 상관없습니다.
# 즉, a는 2, b는 3, c는 4가 됩니다.
t = add(c=4, a=2, b=3)
print(t)
# 9
함수의 인자가 몇개가 들어올지 알수 없을 경우에는 *args 를 인자로 사용할 수 있습니다. (Arbitrary argument lists)
# *args를 사용해서 인자들을 받습니다. 몇개가 들어올지는 알 수 없습니다.
# args는 리스트(list) 타입을 갖게 됩니다.
def add_all(*args):
sum = 0
for v in args:
sum = sum + v
return sum
# 1 부터 10까지 더하는 함수 호출
r = add_all(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print(r)
# 55
# 1 부터 3까지 더하는 함수 호출
r = add_all(1, 2, 3)
print(r)
# 6
함수안에서 변수의 범위
함수 안에서 선언된 변수는 지역변수(local variables) 라고 불리며, 함수 안에서만 유효한 변수 입니다. 즉, 다른 함수나 함수 밖에서 같은 이름의 변수가 사용되어도 그건 전혀 다른 변수입니다.
def calc(a, b, c):
d = a + b + c # 함수 안에서 변수 d는 함수 안에서만 유효한 변수 입니다.
e = d * 2 # 변수 e 도 마찬가지로 함수 안에서만 유효합니다. 이런 변수를 지역 변수라고 부릅니다.
return e
d = calc(1, 2, 3) # 함수 밖에서 변수 d는 함수 안의 d와는 다릅니다.
e = calc(3, 5, 1) # 마찬가지로 함수 밖에서 e는 함수 안에서 e와 다릅니다.
재귀 함수 (Recursive Function)
함수는 함수 안에서 자기 자신을 다시 호출하는 재귀적 호출을 할 수 있습니다. 예를 들어서 1 부터 10까지 더하는 함수를 아래처럼 재귀적으로 작성할 수 있습니다.
def factorial(x):
if x == 1:
return 1
else:
return (x * factorial(x-1)) # factorial 함수에서 factorial 함수를 재귀적으로 호출
r = factorial(3)
print(r)
# 6
만약 재귀 함수를 반복문으로 바꿀 수 있다면 반복문을 사용하는것을 추천드립니다. 재귀함수는 코드를 좀 더 보기쉽게 해줄수 있지만 때때로 재귀 호출을 이해하기 힘들 수 도 있습니다. 또한 재귀적 호출이 반복될때마다 추가적인 메모리가 소모되기 때문에 비효율적인 면이 있습니다. 위의 재귀함수는 아래처럼 while 반복문을 통해서 다시 쓸 수 있습니다.
def factorial(x):
num = 1
while x >= 1:
num = num * x
x = x - 1
return num
r = factorial(3)
print(r)
# 6
더 읽어보면 좋은 글
2020/09/12 - [파이썬/자주하는 질문] - 파이썬(Python) *args **kwargs 는 무엇일까?
'파이썬 > [누구나! 완전 기초 파이썬]' 카테고리의 다른 글
#9 클래스(Class) (0) | 2020.10.05 |
---|---|
#7 while, for 반복문 (0) | 2020.09.24 |
#6 조건문 (if ~ else ~) (0) | 2020.09.23 |
#5 리스트(Lists) (0) | 2020.09.21 |
#4 문자열(Strings) (0) | 2020.09.19 |
댓글