18. 함수(Function)
1. 키워드
- 함수(Function)
- 매개변수(Parameter)와 인수(Argument)
- 독스트링(Docstrings)
- 스택 다이어그램(Stack Diagram)
- 프레임(Frame)
- 스택(Stack)
2. 함수 사용하기
- 파이썬은 함수라는 기능을 제공하는데 특정 용도의 코드를 한 곳에 모아 놓은 것을 뜻한다.
- 예를 들어 지금까지 사용했던
print
,input
등도 모두 파이썬에서 미리 만들어 둔 함수이다.
3. Hello, world! 출력 함수 만들기
- 함수는
def
에 함수 이름을 지정하고()
(괄호)와:
(콜론)을 붙인 뒤 다음 줄에 원하는 코드를 작성한다. - 이때 코드는 반드시 들여쓰기를 해야 한다.
1) 함수 만들기
"Hello, world!"
를 출력하는 함수를 만들어보자.
2) 함수 호출하기
hello()
와 같이 함수 이름과()
를 적어주면 함수를 사용할 수 있다.
3) 소스 파일에서 함수를 만들고 호출하기
- 이번에는 소스 파일에서 함수를 만들고 호출해 보자.
4) 함수의 실행 순서
hello
함수는 다음과 같은 순서로 실행된다.
1] 파이썬 스크립트 최초 실행
2] hello
함수 호출
3] hello
함수 실행
4] print
함수 실행 및 "Hello, world!"
출력
5] hello
함수 종료
6] 파이썬 스크립트 종료
5) 함수 작성과 함수 호출 순서
- 함수를 만들고 호출할 때 주의할 점이 있는데, 바로 함수를 만들기 전에 함수를 먼저 호출하면 안 된다는 점이다.
- 함수를 먼저 호출하면 함수가 정의되지 않았다는 에러가 발생한다.
4. 덧셈 함수 만들기
- 함수에서 값을 받으려면
()
(괄호) 안에 변수 이름을 지정해 주면 되는데, 이 변수를 매개변수라고 부른다.
- 이제 두 수를 더하는 함수를 만들어보자.
add
함수가 만들어졌다.
10
과20
을 더한 값인30
이 출력되었다.- 여기서 함수를 호출할 때 넣는 값을 인수라고 부른다.
함수 독스트링 사용하기
- 파이썬에서는 함수의
:
(콜론) 바로 다음 줄에""" """
(큰따옴표 세 개)로 문자열을 입력하면 함수에 대한 설명을 넣을 수 있다. - 이런 방식의 문자열을 독스트링(문서화 문자열, Documentation Strings, Docstrings)이라고 한다.
- 단, 독스트링의 윗줄에 다른 코드가 오면 안 된다.
- 파이썬 코딩 스타일 가이드(PEP 8)에서는
""" """
(큰따옴표 세 개)를 권장한다.
def add(a, b):
"""이 함수는 a와 b를 더한 뒤 결과를 반환하는 함수입니다."""
return a + b
x = add(10, 20)
print(x) # 30
print(add.__doc__) # 이 함수는 a와 b를 더한 뒤 결과를 반환하는 함수입니다.
- 독스트링은 함수의 사용 방법만 기록할 뿐
add(10, 20)
으로 함수를 호출해도 출력되지 않는다. - 독스트링을 출력하려면
print(add.__doc__)
와 같이 함수의__doc__
을 출력하면 된다.
- 다음과 같이
help
에 함수를 넣으면 함수의 이름, 매개변수, 독스트링을 도움말 형태로 출력해 준다.
5. 함수의 결과를 반환하기
- 다음과 같이 함수 안에서
return
을 사용하면 값을 함수 바깥으로 반환한다. - 이때
return
에 값을 지정하지 않으면None
을 반환한다.
- 두 수를 더해서 반환하는
add
함수를 만들어보자.
- 이제
add
함수에10
과20
을 넣고 결과를x
에 저장한다.
- 이처럼
return
을 사용하면 값을 함수 바깥으로 반환할 수 있고, 함수에서 나온 값을 변수에 저장할 수 있다. - 즉,
return
으로 반환하는 값은 반환값이라고 하며 함수를 호출해 준 바깥에 결과를 알려주기 위해 사용한다.
- 반환값은 변수에 저장하지 않고 바로 다른 함수에 넣을 수도 있다.
매개변수는 없고 반환값만 있는 함수
- 함수를 만들 때 매개변수는 없지만 값만 반환하는 함수를 만들 수도 있다.
return
으로 함수 중간에서 빠져나오기
return
은 값은 반환하는 기능뿐만 아니라 함수 중간에서 바로 빠져나오는 기능도 있다.
>>> def not_ten(a):
... if a == 10:
... return
... print(a, "입니다.", sep="")
...
>>> not_ten(5)
5입니다.
>>> not_ten(10)
not_ten
함수에5
를 넣으면print
로"5입니다."
를 출력하지만,10
을 넣으면return
으로 함수 중간에서 바로 빠져나오므로 그 아래에 있는print
는 실행하지 않는다.- 따라서 아무것도 출력되지 않는다.
- 이처럼
return
은 함수 중간에서 빠져나올 때 자주 사용한다.
6. 함수에서 값을 여러 개 반환하기
- 함수에서 값을 여러 개 반환할 때는 다음과 같이
return
에 값이나 변수를,
(콤마)로 구분해서 지정하면 된다.
- 두 수를 더한 값과 뺀 값을 반환하는 함수를 만들어보자.
- 이제
add_sub
함수에10
과20
을 넣고 결과를x
와y
에 저장한다.
x
의 값을 출력해 보면10
과20
을 더한 값인30
이 나오고,y
의 값을 출력해 보면10
에서20
을 뺀 값인-10
이 나온다.- 이처럼
return
은 값을 여러 개 반환할 수 있다.
- 이렇게
return
으로 값을 여러 개 반환하면 실제로는 튜플이 반환된다.
값 여러 개를 직접 반환하기
- 함수에서 값 여러 개를 직접 반환할 때는 다음과 같이
return
에 튜플을 지정해 주면 된다.
- 파이썬에서는 괄호없이 값을 콤마로 구분하면 튜플이 된다.
- 따라서
return 1, 2
는return (1, 2)
와 의미가 같다.
- 물론
return
에서 리스트를 직접 반환해도 된다. - 이때에도 반환값을 변수 여러 개에 저장할 수 있다.
7. 함수의 호출 과정 알아보기
- 이번에는 함수 여러 개를 만든 뒤에 각 함수의 호출 과정을 스택 다이어그램으로 알아보자.
- 다음은 덧셈 함수
add
와 곱셈 함수mul
이 있고,add
함수 안에서mul
함수를 호출하는 방식으로 만들어져 있다.
def mul(a, b):
c = a * b
return c
def add(a, b):
c = a + b
print(c)
d = mul(a, b)
print(d)
x = 10
y = 20
add(x, y)
# 30
# 200
- 먼저 파이썬 스크립트를 실행하면 줄 1부터 실행한다.
- 여기서 줄 12
y = 20
까지 실행하면 전역 프레임(Global Frame)에는 함수mul
,add
, 변수x
,y
가 들어간다. - 이때 함수
mul
,add
는 생성만 되었을 뿐 호출이 되지 않은 상태이다.
- 프레임이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간이다.
- 특히 전역 프레임은 파이썬 스크립트 전체에서 접근할 수 있다.
- 이제 함수 add를 호출한 뒤 안으로 들어가서 줄 7
print(c)
까지 실행하면 다음과 같은 모양으로, 함수add
의 스택 프레임(Stack Frame)이 만들어지고 매개변수a
와b
, 그리고 변수c
가 들어간다.
- 여기서 함수
mul
을 호출한 뒤 안으로 들어가서 줄 3return c
까지 실행하면 함수mul
의 스택 프레임이 만들어지고 매개변수a
와b
, 그리고 변수c
가 들어간다.
- 이제 줄 9
print(d)
까지 실행해서 함수mul
을 끝내고 함수add
로 되돌아 간다. - 이렇게 하면
mul
에서 반환한 반환값200
이 변수d
에 저장되며add
의 스택 프레임에 들어간다. - 물론
mul
은 끝났으므로 스택 프레임도 사라진다.
- 그다음에 줄 13
add(x, y)
까지 실행해서 함수add
를 끝낸다. - 이렇게 하면
add
의 스택 프레임도 사라진다.
- 지금까지 설명한 과정처럼 함수는 스택 방식으로 호출된다.
- 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라진다.
- 전역 프레임은 스크립트 파일의 실행이 끝나면 사라진다.