day 5 함수 사용하기

3 minute read

함수

출력 함수 만들기

함수는 def에 함수 이름을 지정하고 ( )(괄호)와 :(콜론)을 붙인 뒤 다음 줄에 원하는 코드를 작성합니다(함수의 이름을 짓는 방법은 변수와 같습니다). 이때 코드는 반드시 들여쓰기를 해야 합니다(들여쓰기 규칙은 if, for, while과 같습니다).

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

def hello():
    print('Hello, world!')
 
hello()
..
..
Hello, world!


hello()         # hello 함수를 만들기 전에 함수를 먼저 호출
 
def hello():    # hello 함수를 만듦
    print('Hello, world!')

Traceback (most recent call last):
  File "C:\project\function.py", line 1, in <module>
    hello()    # hello 함수를 만들기 전에 함수를 먼저 호출
NameError: name 'hello' is not defined 

함수를 먼저 호출하면 함수가 정의(define)되지 않았다는 에러가 발생합니다. 왜냐하면 파이썬 코드는 위에서 아래로 순차적으로 실행되기 때문입니다. 반드시 함수를 먼저 만든 뒤에 함수를 호출해야 합니다.

참고 | 빈 함수 만들기

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

def hello():
  pass

나중에 다른 사람이 만든 파이썬 소스 코드를 보다 보면 pass를 자주 접할 수 있습니다. pass는 아무 일을 하지 않아도 함수의 틀을 유지할 필요가 있을 때 사용합니다.

image

참고 | 함수 독스트링 사용하기

파이썬에서는 함수의 :(콜론) 바로 다음 줄에 “”” “”“(큰따옴표 세 개)로 문자열을 입력하면 함수에 대한 설명을 넣을 수 있습니다. 이런 방식의 문자열을 독스트링(문서화 문자열, documentation strings, docstrings)이라고 합니다. 단, 독스트링의 윗줄에 다른 코드가 오면 안 됩니다.

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

독스트링은 ‘ ‘(작은따옴표), “ “(큰따옴표), ‘’’ ‘’‘(작은따옴표 세 개)로 만들어도 되지만, 파이썬 코딩 스타일 가이드(PEP 8)에서는 “”” “”“(큰따옴표 세 개)를 권장합니다.

앞에서 만든 add 함수에 독스트링으로 설명을 추가해보겠습니다.

function_documentation_strings.py
def add(a, b):
    """이 함수는 a와 b를 더한 뒤 결과를 반환하는 함수입니다."""
    return a + b
 
x = add(10, 20)       # 함수를 호출해도 독스트링은 출력되지 않음
print(x)
 
print(add.__doc__)    # 함수의 __doc__로 독스트링 출력
실행 결과
30
이 함수는 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를 더한 뒤 결과를 반환하는 함수입니다.

독스트링을 적절히 작성해두면 나중에 본인이 만든 코드를 다른 사람이 사용할 때 좀 더 편리하게 사용할 수 있습니다.

함수의 결과를 반환

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

image

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

함수를 만들 때 매개변수는 없지만 값만 반환하는 함수를 만들 수도 있습니다. 다음은 매개변수 없이 1만 반환합니다.

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

참고 | return으로 함수 중간에서 빠져나오기

return은 값을 반환하는 기능뿐만 아니라 함수 중간에서 바로 빠져나오는 기능도 있습니다. 다음은 매개변수 a가 10이면 함수를 그냥 빠져나옵니다.

>>> 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은 함수 중간에서 빠져나올 때 자주 사용합니다. 보통은 if와 조합해서 특정 조건일 때 함수 중간에서 빠져나옵니다.

참고 | 값 여러 개를 직접 반환하기

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

def one_two():
    return (1, 2)

사실 파이썬에서는 괄호 없이 값을 콤마로 구분하면 튜플이 되죠? 즉, 튜플 1, 2는 튜플 (1, 2)와 같습니다.

>>> 1, 2
(1, 2)

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

def one_two():
    return 1, 2    # return (1, 2)와 같음

물론 return에서 리스트를 직접 반환해도 됩니다. 이때도 반환값을 변수 여러 개에 저장할 수 있습니다.

>>> def one_two():
...     return [1, 2]
...
>>> x, y = one_two()
>>> print(x, y)
1 2

함수의 호출 과정 알아보기

image

image

image

함수는 스택(stack) 방식으로 호출됩니다. 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라집니다. 특히 프레임은 스택 안에 있어서 각 프레임을 스택 프레임이라고 부릅니다.

참고로 전역 프레임은 스크립트 파일의 실행이 끝나면 사라집니다.

Leave a comment