Python에서는 if, elif('else and if'의 줄임말) 그리고 else 문을 사용해 프로그램의 실행 흐름을 제어하고 결정을 내려요.
다른 많은 프로그래밍 언어와 달리, Python 3.9 이하 버전에는 공식적인 case-switch 문이 없어요. 대신 여러 개의 elif 문으로 비슷한 역할을 해요.
Python 3.10에서는 structural pattern matching이라는 변형된 case-switch 문이 도입되었는데, 이는 다른 개념에서 따로 다뤄요.
조건문은 True 또는 False로 귀결되는 표현식을 사용해요. bool 타입을 직접 반환하거나, "truthy" 또는 "falsy"로 평가되는 방식이죠.
x = 10
y = 5
# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
print("x is greater than y")
...
>>> x is greater than y
if와 함께 쓰이면, 원래 if 조건이 False로 평가될 때 선택적인 else 코드 블록이 실행돼요:
x = 5
y = 10
# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
print("x is greater than y")
else:
print("y is greater than x")
...
>>> y is greater than x
elif를 쓰면 조건을 여러 개 평가하고 분기를 나눌 수 있어요.
x = 5
y = 10
z = 20
# The 'elif' statement allows for the checking of more conditions.
if x > y:
print("x is greater than y and z")
elif y > z:
print("y is greater than x and z")
else:
print("z is greater than x and y")
...
>>> z is greater than x and y
불리언 연산과 비교는 조건문과 결합해서 더 복잡한 검사를 할 수 있어요:
>>> def classic_fizzbuzz(number):
if number % 3 == 0 and number % 5 == 0:
say = 'FizzBuzz!'
elif number % 5 == 0:
say = 'Buzz!'
elif number % 3 == 0:
say = 'Fizz!'
else:
say = str(number)
return say
>>> classic_fizzbuzz(15)
'FizzBuzz!'
>>> classic_fizzbuzz(13)
'13'
이번 연습 문제에서는 원자로를 위한 간단한 제어 시스템을 만들어 봐요.
원자로가 전력을 생산하려면 임계 상태에 있어야 해요. 원자로가 임계보다 낮은 상태에 있으면 손상될 수 있어요. 원자로 상태가 임계를 넘어서면 과부하가 걸려 멜트다운으로 이어질 수 있어요. 우리는 멜트다운의 가능성을 줄이고 원자로 상태를 올바르게 관리하는 것이 목표예요.
다음 세 가지 과제는 모두 이상적인 원자로 상태를 유지하기 위한 코드를 작성하는 것과 관련이 있어요.
제어 시스템이 가장 먼저 해야 할 일은 원자로가 임계 균형 상태에 있는지 확인하는 거예요. 원자로가 다음 조건을 만족하면 임계 균형 상태라고 해요.
켈빈 단위로 측정한 temperature와 neutrons_emitted를 매개변수로 받아, 임계 조건이 충족되면 True를, 그렇지 않으면 False를 반환하는 is_criticality_balanced() 함수를 구현해 봐요.
>>> is_criticality_balanced(750, 600)
True
원자로가 전력을 생산하기 시작하면 그 효율을 판단해야 해요. 효율은 4개의 구간으로 나눌 수 있어요.
green -> 효율이 80% 이상,orange -> 효율이 80% 미만이지만 최소 60% 이상,red -> 효율이 60% 미만이지만 여전히 30% 이상,black -> 효율이 30% 미만.백분율 값은 (generated_power/theoretical_max_power)*100로 계산할 수 있는데, 여기서 generated_power = voltage * current예요.
백분율 값은 보통 정수가 아니니, <와 <= 비교를 적절히 사용해야 한다는 점을 꼭 기억해요.
voltage, current, theoretical_max_power 세 개의 매개변수를 받는 reactor_efficiency(<voltage>, <current>, <theoretical_max_power>) 함수를 구현해 봐요.
이 함수는 원자로의 효율 구간인 'green', 'orange', 'red', 'black' 중 하나를 반환해야 해요.
>>> reactor_efficiency(200,50,15000)
'orange'
마지막 과제는 과부하와 멜트다운을 피하기 위한 페일 세이프 메커니즘을 만드는 거예요. 이 메커니즘은 원자로가 이상적인 임계 기준보다 낮은지, 기준과 같은지, 높은지를 판단해요. 그런 다음 제어봉을 원자로에 삽입하거나 빼서 임계 상태를 높이거나 낮추거나 멈출 수 있어요.
세 가지 매개변수, 즉 켈빈 단위로 측정한 temperature, neutrons_produced_per_second, threshold를 받아 원자로의 상태 코드를 출력하는 fail_safe() 함수를 구현해 봐요.
temperature * neutrons_produced_per_second가 threshold의 90% 미만이면, 전력을 생산하기 위해 제어봉을 빼내야 한다는 의미로 'LOW' 상태 코드를 출력해요.
temperature * neutrons_produced_per_second 값이 threshold의 10% 이내라면(즉, 임계값보다 010% 작거나, 임계값과 같거나, 임계값보다 010% 큰 경우), 원자로는 임계 상태이며 'NORMAL' 상태 코드를 출력해야 해요. 이는 원자로가 최적의 상태이고 제어봉이 이상적인 위치에 있다는 것을 나타내요.
temperature * neutrons_produced_per_second가 위에 나온 범위에 들지 않으면, 원자로가 멜트다운으로 가고 있으므로 즉시 원자로를 정지시키라는 의미로 'DANGER' 상태 코드를 전달해야 해요.
>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.