Python에서 함수의 인자는 아래처럼 4가지로 나뉩니다.
- 필수 인자
- 선택 인자
- 가변 위치 인자 튜플
- 가변 키워드 인자 딕셔너리
여기서 알아보고자 하는 건, 인자의 기본값
입니다. Python에서 함수의 인자에는 기본값을 설정할 수 있고, 꽤 유용하게 사용할 수 있습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def sum(a=0, b=0): | |
return a + b | |
print(sum(1)) | |
# 1 | |
print(sum()) | |
# 0 |
그러나 Python에서 함수 인자의 기본값은 단 한 번만 평가됩니다. 따라서, 아래와 같은 함수는 예상 외의 결과를 만들어 냅니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from datetime import datetime | |
import time | |
def log(message, at=datetime.now()): | |
print('[{}] {}'.format(str(at), message)) | |
log('Something') | |
# [2018-04-04 20:14:46.864867] Something | |
time.sleep(1) | |
log('Something!') | |
# [2018-04-04 20:14:46.864867] Something! |
log
함수에 at
인자가 전달되지 않을 경우 '현재 시간'으로 인자를 채우도록 하려는 의도였으나, 두 번의 함수 호출에 대한 at
인자의 값이 동일합니다. Python의 함수는 인자의 기본값 평가를 최초 한 번만 수행하기 때문입니다. 따라서 아래와 같이 함수를 작성하는 것이 좋습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from datetime import datetime | |
import time | |
def log(message, at=None): | |
if at is None: | |
at = datetime.now() | |
print('[{}] {}'.format(str(at), message)) | |
log('Something') | |
# [2018-04-04 20:18:57.922852] Something | |
time.sleep(1) | |
log('Something!') | |
# [2018-04-04 20:18:58.925154] Something! |
기본값을 None
으로 두고, 함수 내부의 if문에서 값을 채워주는 방식입니다.
'Python 계열 > Python 레거시 글' 카테고리의 다른 글
[Python] Closure (0) | 2018.07.20 |
---|---|
[Python] 문자열의 메모리 할당 방식 (0) | 2018.07.19 |
[Python] @property와 setter (0) | 2018.07.13 |
[Python] Keyword exclusive argument (0) | 2018.07.11 |
[Python] 입출력 (0) | 2018.07.10 |