فهرست عناوین

موضوع قبلی

18. بهم گوش کن ... وگرنه ...

موضوع بعدی

20. نا...درست!

19. باز هم پرش از مانع!

ریبرگ توی کانادا زندگی می‌کند. جایی که نه فقط گاهی می‌تواند بارانی یا آفتابی باشد، بلکه ممکن است برف هم ببارد... معمولاً هر سه تا هم زمان نیست... ولی پیش میآید دیگر. خب، فرض کنیم که فقط یکی از اینا ممکن است اتّفاق بیافتد. این طوری ریبرگ با این گزینه‌ها رو به رو می‌شود:

if it_rains(): # اگه بارون می‌باره
    play_indoors() # توی خونه بازی کن

elif it_snows(): # در غیر این صورت اگر برف می‌باره
    go_skiing() # برو اسکی بازی

else: # وگرنه
    go_swimming() # برو شنا (فرض کردیم هوا گرمه)

به کاربرد elif (مخفّف "else if" به معنی «در غیر این صورت اگر») برای گزینهٔ ۲ دقّت کنید. اگر پدیده‌های آب و هوایی دیگر مثل تگرگ، رعد و برق، مِه، نم نم باران و غیره را هم به حساب بیارویم؛ احتمالاً بتوانیم با چند تکّه‌کد اضافی elif:... گزینه‌های دیگری را اضافه کنیم.

این نمای تصویری از گزینه‌هایی است که ریبرگ با آن‌ها رو به رو می‌شود:

../../_images/elif.png

19.1. چطور فرآیند گزارهٔ if/elif/ ... /else را بفهمیم؟

وجود تعدادی از گزاره‌های if/elif/ ... /else پشت سر هم معادل جا زدن اوّلین تکّه‌کدی هست که نتیجهٔ بررسیش درست True باشد. بنابراین این تکّه‌کد:

if False:
    do_1() # کار ۱

elif True:
    do_2() # کار ۲

elif True:
    do_3() # کار ۳

else:
    do_4() # کار ۴

معادل این است که این کد را نوشته باشیم:

do_2() # کار ۲

در حالی که این کد

if False:
    do_1() # کار ۱
elif False:
    do_2() # کار ۲
elif False:
    do_3() # کار ۳
else:
    do_4() # کار ۴

معادل این است:

do_4() # کار ۴

و به همین ترتیب.

19.2. بازگشت به دو با مانع

دو درس پیش، برنامه‌ای نوشتید که برای محیط‌های با مانع ۱ و با مانع ۲ کار می‌کرد؛ ولی برای محیط با مانع ۳ کار نمی‌کرد. علّت کار نکردنش این بود که آن برنامه با این فرض نوشته شده بود که فاصلهٔ مانع‌ها از هم دیگر یکسان است. بیاید از تابع شرط جدید ()front_is_clear و کلیدواژهٔ elif برای تغییر آن برنامه استفاده کنیم.

این جا یک برنامه هست که اگر تکّه‌کدهای خالی آن را درست پر کنید، می‌بایست برای محیطی که بالاتر گفتیم (محیط با مانع ۳ ) کار کند.

def jump_over_hurdle():
     # تعریف مناسب

def run_jump_or_finish ():
     if at_goal():
         # یک سری کار
     elif front_is_clear():
         # یک سری کار
     else:
         # یک سری کار

 repeat 42:
     run_jump_or_finish()

همان طور که بالاتر گفته شد، با دقّت به ساختار گزاره‌های if/elif/else شما می‌بایست بفهمید که این گزاره سه تا شرط مستقلّ ارائه می‌دهد، که فقط یکی از آن‌ها اجرا می‌شود.

انجام بدهید!

این برنامه را بنویسید و امتحان کنید تا از درست کار کردنش خاطر جمع شوید.

آیا این برنامه می‌تواند بدون تغییر برای محیط با مانع ۴ جواب بدهد؟ نگاهی بیاندازید و احتمالاً نتیجه می‌گیرید که جواب خیر هست. می‌توانید برای اطمینان امتحان کنید. مدّتی (while) طول می‌کشد تا شما برای نوشتن برنامه‌ای آماده شوید که ریبرگ بتواند با آن در محیط با مانع ۴ هم مثل سه تای قبل مسابقه بدهد.