2.4 실습: 조도값 판정 함수¶
사이버파이의 조도 센서 함수 cyberpi.get_bri()는 0~100 범위의 정수를 반환한다(Makeblock mCode 문서). 이 절에서는 측정값을 판정하는 함수를 요구 조건에 맞게 작성하고, 경계값 시험으로 정확성을 확인한다. 완성한 함수는 4.6절에서 실제 센서 측정값에 적용한다.
요구 조건¶
| 조도값 | 판정 |
|---|---|
| 0~29 | 어두움 |
| 30~69 | 보통 |
| 70~100 | 밝음 |
| 0 미만, 100 초과 | 측정 오류 |
센서 값은 정상이라면 0~100 범위에 있지만, 통신 오류나 프로그램 오류로 범위 밖의 값이 입력될 수 있다. 판정 함수는 이런 값을 정상 단계로 판정하지 않도록 먼저 걸러 낸다.
함수 작성¶
def judge_light(bri):
"""조도값을 판정한다. 0~100 범위 밖이면 "측정 오류"를 반환한다."""
if bri < 0 or bri > 100:
return "측정 오류"
if bri < 30:
return "어두움"
if bri < 70:
return "보통"
return "밝음"
for v in [-1, 0, 29, 30, 69, 70, 100, 101]:
print(v, judge_light(v))
실행 결과
경계값 시험¶
시험값은 구간의 경계(29·30, 69·70)와 범위의 양 끝(0·100), 범위 밖(−1·101)에서 선택했다. 판정 오류는 대부분 경계에서 발생한다. 예를 들어 bri < 30을 bri <= 30으로 잘못 작성하면 30이 "어두움"으로 판정되는데, 30을 시험하지 않으면 이 오류를 발견할 수 없다.
assert 문은 조건이 거짓이면 오류를 발생시킨다. 기대한 판정 결과를 assert로 작성해 두면 함수를 수정한 뒤에도 같은 시험을 반복할 수 있다.
assert judge_light(29) == "어두움"
assert judge_light(30) == "보통"
assert judge_light(70) == "밝음"
assert judge_light(101) == "측정 오류"
print("경계값 시험 통과")
실행 결과
측정 기록 판정¶
다음 목록은 하루 동안 2시간 간격으로 조도를 측정했다고 가정한 예시 값이다. 판정 결과별 개수를 집계한다.
day_log = [12, 25, 41, 58, 66, 73, 88, 95, 71, 47, 22, 9]
dark = normal = bright = error = 0
for v in day_log:
r = judge_light(v)
if r == "어두움":
dark += 1
elif r == "보통":
normal += 1
elif r == "밝음":
bright += 1
else:
error += 1
print("어두움", dark, "보통", normal, "밝음", bright, "오류", error)
실행 결과
dark = normal = bright = error = 0은 네 변수를 한 줄에서 모두 0으로 초기화한다. 판정 결과별 개수를 이렇게 변수 4개로 집계하는 방법은 단계가 늘어나면 코드가 길어진다. 3.1절에서 딕셔너리로 같은 집계를 간결하게 작성한다.
실습 과제¶
- 소리 크기
cyberpi.get_loudness()도 0~100 범위를 반환한다. 0~39 "조용함", 40~69 "보통", 70~100 "시끄러움", 범위 밖 "측정 오류"로 판정하는 함수judge_loud(loud)를 작성하시오. judge_loud의 경계값 시험을assert로 6개 이상 작성하시오.day_log에 −5와 120을 추가하고 집계 결과의 「오류」 개수가 2로 변화하는지 확인하시오.