Skip to content

18. 함수(Function)


1. 키워드

  • 함수(Function)
  • 매개변수(Parameter)와 인수(Argument)
  • 독스트링(Docstrings)
  • 스택 다이어그램(Stack Diagram)
  • 프레임(Frame)
  • 스택(Stack)


2. 함수 사용하기

  • 파이썬은 함수라는 기능을 제공하는데 특정 용도의 코드를 한 곳에 모아 놓은 것을 뜻한다.
  • 예를 들어 지금까지 사용했던 print, input 등도 모두 파이썬에서 미리 만들어 둔 함수이다.


3. Hello, world! 출력 함수 만들기

  • 함수는 def에 함수 이름을 지정하고 ()(괄호)와 :(콜론)을 붙인 뒤 다음 줄에 원하는 코드를 작성한다.
  • 이때 코드는 반드시 들여쓰기를 해야 한다.


def 함수이름():
    코드


1) 함수 만들기

  • "Hello, world!"를 출력하는 함수를 만들어보자.


>>> def hello():
...     print("Hello, world!")
...


2) 함수 호출하기

  • hello()와 같이 함수 이름과 ()를 적어주면 함수를 사용할 수 있다.


>>> hello()
Hello, world!


3) 소스 파일에서 함수를 만들고 호출하기

  • 이번에는 소스 파일에서 함수를 만들고 호출해 보자.


def hello():
    print("Hellom, world!")

hello() # Hello, world!


4) 함수의 실행 순서

  • hello 함수는 다음과 같은 순서로 실행된다.


1] 파이썬 스크립트 최초 실행

2] hello 함수 호출

3] hello 함수 실행

4] print 함수 실행 및 "Hello, world!" 출력

5] hello 함수 종료

6] 파이썬 스크립트 종료


001


5) 함수 작성과 함수 호출 순서

  • 함수를 만들고 호출할 때 주의할 점이 있는데, 바로 함수를 만들기 전에 함수를 먼저 호출하면 안 된다는 점이다.


hello()

def hello():
    print("Hello, world!") # NameError: name 'hello' is not defined


  • 함수를 먼저 호출하면 함수가 정의되지 않았다는 에러가 발생한다.


빈 함수 만들기

  • 내용이 없는 빈 함수를 만들 때는 코드 부분에 pass를 넣어준다.


def hello():
    pass


4. 덧셈 함수 만들기

  • 함수에서 값을 받으려면 ()(괄호) 안에 변수 이름을 지정해 주면 되는데, 이 변수를 매개변수라고 부른다.


def 함수이름(매개변수1, 매개변수2):
    코드


  • 이제 두 수를 더하는 함수를 만들어보자.


>>> def add(a, b):
...     print(a + b)
...


  • add 함수가 만들어졌다.


>>> add(10, 20)
30


  • 1020을 더한 값인 30이 출력되었다.
  • 여기서 함수를 호출할 때 넣는 값을 인수라고 부른다.


002


함수 독스트링 사용하기

  • 파이썬에서는 함수의 :(콜론) 바로 다음 줄에 """ """(큰따옴표 세 개)로 문자열을 입력하면 함수에 대한 설명을 넣을 수 있다.
  • 이런 방식의 문자열을 독스트링(문서화 문자열, Documentation Strings, Docstrings)이라고 한다.
  • 단, 독스트링의 윗줄에 다른 코드가 오면 안 된다.


def 함수이름(매개변수):
    """독스트링"""
    코드

def 함수이름(매개변수):
    """
    여러 줄로 된
    독스트링
    """
    코드


  • 파이썬 코딩 스타일 가이드(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에 함수를 넣으면 함수의 이름, 매개변수, 독스트링을 도움말 형태로 출력해 준다.


help(객체)
>>> help(add)
Help on function add in module __main__:

add(a, b)
     함수는 a와 b를 더한  결과를 반환하는 함수입니다.


5. 함수의 결과를 반환하기

  • 다음과 같이 함수 안에서 return을 사용하면 값을 함수 바깥으로 반환한다.
  • 이때 return에 값을 지정하지 않으면 None을 반환한다.


def 함수이름(매개변수):
    return 반환값


  • 두 수를 더해서 반환하는 add 함수를 만들어보자.


>>> def add(a, b):
...     return a + b
...


  • 이제 add 함수에 1020을 넣고 결과를 x에 저장한다.


>>> x = add(10, 20)

>>> x
30


  • 이처럼 return을 사용하면 값을 함수 바깥으로 반환할 수 있고, 함수에서 나온 값을 변수에 저장할 수 있다.
  • 즉, return으로 반환하는 값은 반환값이라고 하며 함수를 호출해 준 바깥에 결과를 알려주기 위해 사용한다.


003


  • 반환값은 변수에 저장하지 않고 바로 다른 함수에 넣을 수도 있다.


>>> print(add(10, 20))
30


매개변수는 없고 반환값만 있는 함수

  • 함수를 만들 때 매개변수는 없지만 값만 반환하는 함수를 만들 수도 있다.


>>> def one():
...     return 1
...

>>> x = one()

>>> x
1


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에 값이나 변수를 ,(콤마)로 구분해서 지정하면 된다.


def 함수이름(매개변수):
    return 반환값1, 반환값2


  • 두 수를 더한 값과 뺀 값을 반환하는 함수를 만들어보자.


>>> def add_sub(a, b):
...     return a + b, a - b
...


  • 이제 add_sub 함수에 1020을 넣고 결과를 xy에 저장한다.


>>> x, y = add_sub(10, 20)

>>> x
30
>>> y
-10


  • x의 값을 출력해 보면 1020을 더한 값인 30이 나오고, y의 값을 출력해 보면 10에서 20을 뺀 값인 -10이 나온다.
  • 이처럼 return은 값을 여러 개 반환할 수 있다.


004


  • 이렇게 return으로 값을 여러 개 반환하면 실제로는 튜플이 반환된다.


>>> x = add_sub(10, 20)

>>> x
(30, -10)


값 여러 개를 직접 반환하기

  • 함수에서 값 여러 개를 직접 반환할 때는 다음과 같이 return에 튜플을 지정해 주면 된다.


def one_two():
    return (1, 2)


  • 파이썬에서는 괄호없이 값을 콤마로 구분하면 튜플이 된다.


>>> 1, 2
(1, 2)


  • 따라서 return 1, 2return (1, 2)와 의미가 같다.


>>> def one_two():
...     return [1, 2]
...

>>> x, y = one_two()

>>> print(x, y)
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는 생성만 되었을 뿐 호출이 되지 않은 상태이다.


005


  • 프레임이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간이다.
  • 특히 전역 프레임은 파이썬 스크립트 전체에서 접근할 수 있다.


  • 이제 함수 add를 호출한 뒤 안으로 들어가서 줄 7 print(c)까지 실행하면 다음과 같은 모양으로, 함수 add의 스택 프레임(Stack Frame)이 만들어지고 매개변수 ab, 그리고 변수 c가 들어간다.


006


  • 여기서 함수 mul을 호출한 뒤 안으로 들어가서 줄 3 return c까지 실행하면 함수 mul의 스택 프레임이 만들어지고 매개변수 ab, 그리고 변수 c가 들어간다.


007


  • 이제 줄 9 print(d)까지 실행해서 함수 mul을 끝내고 함수 add로 되돌아 간다.
  • 이렇게 하면 mul에서 반환한 반환값 200이 변수 d에 저장되며 add의 스택 프레임에 들어간다.
  • 물론 mul은 끝났으므로 스택 프레임도 사라진다.


008


  • 그다음에 줄 13 add(x, y)까지 실행해서 함수 add를 끝낸다.
  • 이렇게 하면 add의 스택 프레임도 사라진다.


009


  • 지금까지 설명한 과정처럼 함수는 스택 방식으로 호출된다.
  • 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라진다.
  • 전역 프레임은 스크립트 파일의 실행이 끝나면 사라진다.

References