day 5 함수 사용하기
함수
출력 함수 만들기
함수는 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는 아무 일을 하지 않아도 함수의 틀을 유지할 필요가 있을 때 사용합니다.
참고 | 함수 독스트링 사용하기
파이썬에서는 함수의 :(콜론) 바로 다음 줄에 “”” “”“(큰따옴표 세 개)로 문자열을 입력하면 함수에 대한 설명을 넣을 수 있습니다. 이런 방식의 문자열을 독스트링(문서화 문자열, 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 반환값
참고 | 매개변수는 없고 반환값만 있는 함수
함수를 만들 때 매개변수는 없지만 값만 반환하는 함수를 만들 수도 있습니다. 다음은 매개변수 없이 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
함수의 호출 과정 알아보기
함수는 스택(stack) 방식으로 호출됩니다. 즉, 함수를 호출하면 스택의 아래쪽 방향으로 함수가 추가되고 함수가 끝나면 위쪽 방향으로 사라집니다. 특히 프레임은 스택 안에 있어서 각 프레임을 스택 프레임이라고 부릅니다.
참고로 전역 프레임은 스크립트 파일의 실행이 끝나면 사라집니다.
Leave a comment