در Python، دستورهای if، elif (مخففی از «else and if») و else برای کنترل جریان اجرا و تصمیمگیری در برنامه به کار میروند.
برخلاف بسیاری از زبانهای برنامهنویسی دیگر، Python تا نسخهی ۳.۹ و پایینتر دستور case-switch رسمی ندارد و بهجای آن از چندین دستور elif برای همین منظور استفاده میکند.
Python ۳.۱۰ نوعی دستور case-switch به نام structural pattern matching را معرفی میکند که جداگانه در مفهوم دیگری بررسی خواهد شد.
دستورهای شرطی از عبارتهایی استفاده میکنند که باید به 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 قرار بگیرد، یک بلوک else اختیاری زمانی اجرا میشود که شرط اولیهی if به False ارزیابی شود:
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'
در این تمرین، یک سیستم کنترل ساده برای یک راکتور هستهای میسازیم.
راکتور برای تولید توان باید در حالتی از «بحرانیت» باشد. اگر راکتور در حالتی کمتر از بحرانیت باشد، ممکن است آسیب ببیند. اگر حالت راکتور از بحرانیت فراتر برود، ممکن است دچار اضافهبار شود و به ذوب هسته بیانجامد. میخواهیم احتمال ذوب هسته را کاهش دهیم و حالت راکتور را درست مدیریت کنیم.
سه کار زیر همگی به نوشتن کدی مربوط میشوند که حالت ایدهآل راکتور را نگه دارد.
نخستین کاری که یک سیستم کنترل باید انجام دهد، بررسی این است که راکتور از نظر بحرانیت متعادل باشد یا نه. راکتور زمانی از نظر بحرانیت متعادل در نظر گرفته میشود که شرایط زیر را برآورده کند:
تابعی به نام is_criticality_balanced() را پیادهسازی کنید که temperature برحسب کلوین و neutrons_emitted را به عنوان پارامتر میگیرد و اگر شرایط بحرانیت برآورده شوند True و در غیر این صورت False را برمیگرداند.
>>> is_criticality_balanced(750, 600)
True
وقتی راکتور شروع به تولید توان کرد، باید بازدهی آن تعیین شود. بازدهی را میتوان در ۴ بازه دستهبندی کرد:
green -> بازدهی ۸۰٪ یا بیشتر،orange -> بازدهی کمتر از ۸۰٪ اما دستکم ۶۰٪،red -> بازدهی کمتر از ۶۰٪، اما همچنان ۳۰٪ یا بیشتر،black -> بازدهی کمتر از ۳۰٪.مقدار درصدی را میتوان بهصورت (generated_power/theoretical_max_power)*100 محاسبه کرد که در آن generated_power = voltage * current است.
توجه کنید که مقدار درصدی معمولاً عددی صحیح نیست، پس حتماً استفادهی درست از مقایسههای < و <= را در نظر بگیرید.
تابع reactor_efficiency(<voltage>, <current>, <theoretical_max_power>) را با سه پارامتر پیادهسازی کنید: voltage، current و theoretical_max_power.
این تابع باید بازهی بازدهی راکتور را برگرداند: «green»، «orange»، «red» یا «black».
>>> reactor_efficiency(200,50,15000)
'orange'
کار نهایی شما ساختن یک سازوکار ایمن در برابر خرابی است تا از اضافهبار و ذوب هسته جلوگیری شود. این سازوکار تعیین میکند که راکتور پایینتر، برابر یا بالاتر از آستانهی بحرانیت ایدهآل است. سپس میتوان با وارد کردن (یا خارج کردن) میلههای کنترل در راکتور، بحرانیت را افزایش، کاهش یا متوقف کرد.
تابعی به نام fail_safe() را پیادهسازی کنید که ۳ پارامتر میگیرد: temperature برحسب کلوین، neutrons_produced_per_second و threshold، و یک کد وضعیت برای راکتور خروجی میدهد.
اگر temperature * neutrons_produced_per_second کمتر از ۹۰٪ مقدار threshold باشد، کد وضعیت «LOW» را خروجی بدهید که نشان میدهد برای تولید توان باید میلههای کنترل را خارج کرد.
اگر مقدار temperature * neutrons_produced_per_second در محدودهی ۱۰٪ آستانه باشد (یعنی یا ۰ تا ۱۰٪ کمتر از آستانه، برابر آستانه، یا ۰ تا ۱۰٪ بیشتر از آستانه)، راکتور در بحرانیت است و باید کد وضعیت «NORMAL» خروجی داده شود که نشان میدهد راکتور در شرایط بهینه است و میلههای کنترل در موقعیت ایدهآل قرار دارند.
اگر temperature * neutrons_produced_per_second در بازههای گفتهشده نباشد، راکتور به سمت ذوب هسته میرود و باید کد وضعیت «DANGER» بازگردانده شود تا راکتور بیدرنگ خاموش شود.
>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'