به‌کارگیری پرچم

در مثالِ پیشین برنامه را واداشتیم که تا زمانِ برقرار بودنِ شرطی مشخّص، به انجام وظایفی بپردازد. امّا در برنامه‌های پیچیده که در‌آنها رخدادهای مختلفی ممکن است باعث توقّف اجرا شوند، چه باید کرد؟

برای مثال در یک بازی رخدادهای مختلف و فراوانی می‌توانند به بازی خاتمه دهند. وقتی تمام کشتی‌های کاربر غرق می‌شود، زمان او به پایان می‌رسد یا شهرهایی که باید از آن‌ها محافظت می‌کرده همگی نابوده شده‌اند، بازی باید پایان یابد. بازی باید با رخ دادن هر کدام از این رویدادها به پایان برسد. اگر امکان وقوع رخدادهای مختلفی برای پایان دادن به برنامه وجود دارد، آزمودن همه‌ی ‌آن‌ها در یک عبارت while ممکن است پیچیده و مشکل باشد.

در برنامه‌ای که فقط باید تا زمان برقراری شرط‌هایی اجرا شود، می‌توانید یک متغیّر تعریف کنید که تعیین کند کل برنامه فعّال است یا نه. این متغیّر که به آن پرچم گویند، در برنامه مانند یک نشانه عمل می‌کند. می‌توانیم برنامه را به نحوی بنویسیم که تا زمان درست (True) بودن پرچم اجرا شود و هنگامی که یکی از چندین رخداد مقدار آن را نادرست (False) کند، اجرای برنامه متوقّف شود.

بیایید پرچمی به parrot.py از بخش قبل، اضافه کنیم. این پرچم که آن را active می‌نامیم (و هر نامی که بخواهید می‌توانید به آن بدهید) نگاه می‌کند که آیا اجرای برنامه باید ادامه یابد یا نه:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "

active = True

while active:
    message = input(prompt)

    if message == 'quit':
        active = False

    else:
        print(message)

در 1 متغیّر active را برابر True می‌گذاریم تا برنامه در وضعیّت فعّال قرار گیرد. انجام چنین کاری عبارت while را ساده‌تر می‌کند زیرا هیچ مقایسه‌ای در خود عبارت صورت نمی‌پذیرد؛ منطق برنامه در دیگر بخش‌های آن مورد نظر قرار می‌گیرد. تا زمانی که متغیّر active مقدار True دارد اجرای حلقه ادامه می‌یابد (2).

به محض این که کاربران ورودی خود را اعمال کنند مقدار message را در گزاره‌ی if داخل حلقه‌ی while بررسی می‌کنیم. اگر در 3 کاربر ‘quit’ را وارد کرد، active را False می‌کنیم و حلقه‌ی while متوقّف می‌شود. اگر کاربر چیزی جز ‘quit’ وارد کند، 4، ورودی او را در قالب پیامی چاپ می‌کنیم.

خروجی این برنامه مشابه خروجی مثال قبلی است. حال که ما پرچمی داریم که نشان می‌دهد کل برنامه در وضعیّت فعّال است یا نه، افزودن آزمون‌های بیشتر (مثلاً با عبارت‌های elif) برای رخ‌دادهایی که باید active را False کنند، ساده خواهد بود.