فهرست عناوین

موضوع قبلی

15. خلاصه

موضوع بعدی

17. به دنبال یک جای خوب

16. اگر فقط ...

اگر فقط ریبرگ خودش می‌توانست تصمیم بگیرد، ... نوشتن برنامه خیلی راحت‌تر می‌شد... ولی صبر کنید! به شما نگفته بودم که ریبرگ می‌تواند خودش تصمیم بگیرد.

16.1. گزارهٔ if

چیزی که به نام گزارهٔ شرطی (if) شناخته می‌شود؛ از الگویی تقریباً مشابه الگوی تابع‌ها پیروی می‌کند:

def some_name():
    # تکّه‌کد A

if some_condition:
    # تکّه‌کد B

اگر شرط درست باشد، تکّه‌کد B به اجرا در می‌آید، در غیر این صورت نادیده گرفته می‌شود. انگار که حذف شده باشد. ولی این حرف به این معنی نیست که چنین حذفی به صورت دائمی انجام می‌شود. یعنی اگر بنا به دلیلی برنامهٔ ما برگردد و این قسمت از کد را دوباره تکرار کند؛ گزارهٔ if هر بار دوباره بررسی می‌شود، تا تصمیم گرفته شود که آیا سطرهای توی تکّه‌کد B اجرا شوند یا نه. این فرآیند را با یک روندنما می‌توانیم این طور نشان بدهیم:

../../_images/if.png

تابع‌های خاصّی هستند که ریبرگ آن‌ها را می‌شناسد و به عنوان شرط استفاده می‌شوند. این تابع‌ها به ریبرگ اجازه می‌دهند که برای خودش به تنهایی تصمیم بگیرد. اوّلیّن‌شان ()object_here هست که به ریبرگ می‌گوید که دست کم یک شیئ در جایی که ایستاده وجود دارد. مثلاً اگر از ریبرگ بخواهیم نشانه جمع کند، یک بخش از کد می‌تواند این طور باشد:

if object_here():
    take()

به محیط‌های نشانه‌های ۱ و نشانه‌های ۲ نگاهی بیاندازید. با فرض این که ریبرگ وقتی که یک نشانه پیدا می‌کند در یک خط راست به پیش می‌رود، در هر دو مورد، همهٔ کاری که باید بکند این است که:

  1. نشانه را بردارد؛

  2. به موقعیّت بعدی حرکت کند؛

  3. نشانه را بگذارد؛

  4. یک گام دیگر به جلو برود؛

  5. و حالا دیگر کارش تمام شده ()done .

این جا فرمان جدیدی را معرفی کردم که ریبرگ می‌فهمد:()done. در حقیقت، شما می‌توانید این فرمان را به عنوان حرفی که ریبرگ به خودش برای اعلام پایان کارش می‌گوید به حساب بیاورید.

بیاید طرح کلّی برنامه‌ای که در هر دو محیط نشانه‌های ۱ و نشانه‌های ۲ کار می‌کند را بنویسیم:

def move_until_done():
    move()
    if object_here():
        # یه کار
        # یه کار دیگه
        # دوباره یه کار دیگه
        # باز هم یکی دیگه
        done()

repeat 42:
    move_until_done()

چرا ۴۲ بار؟ ... خب، راستش می‌خواستم مطمئنم بشوم که ریبرگ به اندازه کافی گام برمی‌دارد، صرف نظر از این که در چه محیطی باشد. تا به حال، همهٔ محیط‌ها به اندازهٔ کافی کوچک بوده‌اند که این مقدار کافی باشد. قبول دارم، خیلی زیرکانه به نظر نمی‌آید؛ ولی بعداً یاد می‌گیریم چطور آن را درست کنیم.

امتحان کنید!

کد بالا را در ویرایش‌گر کد رونوشت بگیرید. جای فرمان‌های خالی را پر کنید و برنامهٔتان را در هر دو محیط نشانه‌های ۱ و نشانه‌های ۲ امتحان کنید.

برای مدرّس‌ها

تابع ()object_here ‌لیستی از انواع اشیائی را که در محل داده شده پیدا می‌شوند را (به عنوان رشته‌های متنی) برمی‌‌گرداند. مثلاً اگر ستاره و نشانه در یک جا موجود باشند؛ ()object_here می‌تواند ["star", "token"] یا ["token", "star"] را برگرداند. اگر هیچ شیئی موجود نباشد، یک لیست خالی برگردانده می‌شود. همان طور که احتمالاً از قبل می‌دانید، پایتون با یک لیست تهی در گزارهٔ if مثل معادل مقدار غلط``False`` برخورد می‌کند و یک لیست ناتهی را معادل مقدار درست``True`` در نظر می‌گیرد.

اگر به طور بالقوّه اشیاء زیادی در یک محیط پیدا شوند، و ما علاقه‌مند به فقط یک نوع شیئ خاصّ باشیم، می‌توانیم آن را به عنوان مؤلّفهٔ این تابع مشخّص کنیم:

if object_here("اسـم_شیئ"):
    take("اسـم_شیئ")

بنابراین تابع ("اسـم_شیئ")object_here یا یک لیست خالی برمی‌گرداند و یا ["اسـم_شیئ"] را.