Pythonでは、if、elif(「else 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'
この演習では、原子炉のためのシンプルな制御システムを作ります。
原子炉が電力を生み出すには、_臨界_の状態にある必要があります。 炉が臨界を下回る状態になると、損傷する可能性があります。 逆に臨界を超えると、過負荷になってメルトダウンを引き起こしかねません。 ここでは、メルトダウンの可能性を減らし、炉の状態を正しく管理することを目指します。
次の3つのタスクは、どれも理想的な炉の状態を保つためのコードを書くことに関係しています。
制御システムが最初にしなければならないのは、炉が_臨界のバランスが取れている_かどうかを確認することです。 炉は、次の条件をすべて満たすとき、臨界のバランスが取れているといいます。
ケルビンで表したtemperatureとneutrons_emittedを仮引数にとる関数is_criticality_balanced()を実装しましょう。この関数は、臨界の条件を満たしていればTrueを、そうでなければFalseを返します。
>>> 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という3つの仮引数をもつ関数reactor_efficiency(<voltage>, <current>, <theoretical_max_power>)を実装しましょう。
この関数は、炉の効率の段階('green'、'orange'、'red'、'black')を返します。
>>> reactor_efficiency(200,50,15000)
'orange'
最後のタスクでは、過負荷とメルトダウンを避けるためのフェイルセーフ機構を作ります。 この機構は、炉が理想的な臨界のしきい値より下か、ちょうどそこか、上かを判定します。 そして、炉に制御棒を挿入したり(取り出したり)することで、臨界を上げたり、下げたり、止めたりできます。
fail_safe()という関数を実装しましょう。この関数は、ケルビンで表したtemperature、neutrons_produced_per_second、thresholdの3つの仮引数をとり、炉の状態コードを出力します。
temperature * neutrons_produced_per_secondがthresholdの90%未満なら、'LOW'という状態コードを出力します。これは、発電するために制御棒を取り出さなければならないことを示します。
temperature * neutrons_produced_per_secondの値がthresholdの10%以内(しきい値より0〜10%低い、しきい値ちょうど、またはしきい値より0〜10%高いのいずれか)であれば、炉は_臨界_にあり、'NORMAL'という状態コードを出力します。これは、炉が最適な状態にあり、制御棒が理想的な位置にあることを示します。
temperature * neutrons_produced_per_secondが上記のどの範囲にも入っていなければ、炉はメルトダウンへ向かっており、ただちに炉を停止するために'DANGER'という状態コードを渡さなければなりません。
>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'