زنجیره‌ی if-elif-else

اغلب نیاز دارید که بیش از دو وضعیّت را بررسی کنید. برای ارزیابی چنین شرایطی می‌توانید از دستور if-elif-else پایتون استفاده کنید. پایتون تنها یکی از بخش‌ها را در زنجیره‌ی if-elif-else اجرا می‌کند. تا زمانی که یکی از آزمون‌ها برقرار شود، پایتون آن‌ها را به ترتیب اجرا می‌کند. به محض برقراری یک شرط، کد مربوط به آن اجرا شده و باقی آزمون‌ها نادیده گرفته می‌شوند.

بسیاری از وضعیت‌ها در دنیای واقعی بیش از دو شرط ممکن دارند. برای مثال یک شهربازی را در نظر بگیرید که نرخ‌های مختلفی برای گروه‌های سنّی مختلف در نظر می‌گیرد:

  • پذیرش کودکان زیر ۴ سال رایگان است.
  • پذیرش افراد بین ۴ تا ۱۸ سال ۲۵ دلار هزینه دارد.
  • پذیرش افراد ۱۸ سال و بالاتر ۴۰ دلار هزینه دارد.

چگونه می‌توانیم از گزاره‌ی if برای تعیین هزینه‌ی پذیرش یک شخص استفاده کنیم؟ کد زیر گروه سنّی فرد را بررسی می‌کند و هزینه‌ی متناسب را چاپ می‌کند:

1
2
3
4
5
6
7
8
age = 12

if age < 4:
    print("Your admission cost is $0.")
elif age < 18:
    print("Your admission cost is $25.")
else:
    print("Your admission cost is $40.")

آزمون if در 1 بررسی می‌کند که آیا سن فرد زیر ۴ سال است یا نه. اگر این چنین باشد پیام مناسب چاپ شده و پایتون بقیه‌ی آزمون‌ها را نادیده می‌گیرد. خط elif در 2 در واقع یک if دیگر است و تنها زمانی اجرا می‌شود که آزمون قبلی موفّق نباشد. در این نقطه از زنجیره می‌دانیم که سن فرد حداقل ۴ سال است زیرا آزمون اول نتیجه نداده است. اگر سن فرد زیر ۱۸ سال باشد پیام متناسب چاپ خواهد شد و پایتون بخش else را نادیده می‌گیرد. اگر هر دو آزمون if و elif برقرار نشوند، کد مربوط به else را در 3 اجرا می‌کند.

در این مثال آزمون 1 False ارزیابی می‌شود پس این بخش از کد اجرا نمی‌شود. امّا آزمون دوم True می‌شود (۱۲ کمتر از ۱۸ است) پس این کد اجرا خواهد شد. خروجی یک جمله است که هزینه‌ی پذیرش فرد را نشان می‌دهد:

1
Your admission cost is $25.

هر سنّی بالاتر از ۱۷ موجب رد شدن هر دو آزمون اوّل می‌شود. در چنین شرایطی بخش else اجرا خواهد شد و هزینه‌ی پذیرش ۴۰ دلار است.

به جای چاپ کردن هزینه در هر بخش از زنجیره‌ی if-elif-else، مختصرتر این است که تنها قیمت را در زنجیره مشخّص کنیم و پس از پایان ارزیابی کامل زنجیره، یک بار دستور print() ساده را فراخوانی کنیم:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
else:
    price = 40

print(f"Your admission cost is ${price}.")

خط‌ها در 2،1 و 3 مقدار price را بر اساس سن فرد تعیین می‌کند. پس از تعیین شدن قیمت در زنجیره‌ی if-elif-else، فراخوانیِ جداگانه و بدونِ تورفتگی print()، این مقدار را برای گزارش هزینه‌ی پذیرش فرد نمایش می‌دهد.

خروجی این کد مشابه مثال قبل است امّا مقصود زنجیره‌ی if-elif-else اینجا دقیق‌تر و مختصرتر است. به جای تعیین و چاپ کردن قیمت، تنها قیمت پذیرش را تعیین می‌کند. علاوه بر کارآمدی بیشتر، کد بازبینی‌شده نسبت به رویکرد اولیّه راحت‌تر قابل تغییر است. برای تغییر متن پیام خروجی، به جای تغییر سه print() مجزّا، کافی است تنها یک دستور print() را عوض کنید.

استفاده از چند elif

می‌توانید هر تعداد elif که خواستید در کد خود استفاده کنید. مثلاً اگر شهربازی برای افراد مسن تخفیف قائل شده باشد، می‌توانید یک آزمون شرطی دیگر به کد اضافه کنید تا تشخیص دهید فرد مستحقّ دریافت تخفیف است یا نه. فرض کنید افراد بالای ۶۵ سال باید نصف هزینه‌ی معمول پذیرش، یعنی ۲۰ دلار، را بپردازند:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
elif age < 65:
    price = 40
else:
    price = 20

print(f"Your admission cost is ${price}.")

بیشترِ کد دست نخورده است. پیش از تعیین قیمت معمولی ۴۰ دلار، بخش elif دوم در 1 بررسی می‌کند که آیا فرد زیر ۶۵ سال است یا نه. توجّه کنید که قیمت تعیین شده در else (2) باید ۲۰ دلار باشد چون تنها افرادی که به این بخش می‌رسند بالای ۶۵ سال سن دارند.

حذف کردن قسمت else

پایتون الزامی به وجود یک بخش else در پایان زنجیره‌ی if-elif نمی‌بیند. گاهی وجود قسمت else سودمند است؛ گاهی به کار‌گیری یک گزاره‌ی elif اضافی برای دریافتن یک شرط مشخّص مورد نظر، واضح‌تر است:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
age = 12

if age < 4:
    price = 0
elif age < 18:
    price = 25
elif age < 65:
    price = 40
elif age >= 65:
    price = 20

print(f"Your admission cost is ${price}.")

قسمت elif افزوده شده در 1 برای افزاد بالاتر از ۶۵ سال قیمت ۲۰ دلار را تعیین می‌کند. این کار از به‌کارگیری یک قسمتِ else عمومی کمی واضح‌تر است. با این تغییر هر قسمتِ کد با گذراندن یک آزمون شرطی مشخّص اجرا خواهد شد.

قسمت else گزاره‌ای همه‌گیر است و با برقراری هر شرطی به جز آن‌ها که در آزمون‌های مشخّص if یا elif مشخّص شده‌اند، اجرا می‌شود که می‌تواند گاهی شامل داده‌های نامعتبر یا حتّی مخرّب باشد. اگر یک شرط پایانی مشخّص برای آزمودن دارید، حذف کردن قسمت else و اضافه کردن یک elif پایانی را در نظر داشته باشید. در نتیجه شما مطمئن‌تر خواهید بود که کد تنها تحت شرایط درست اجرا می‌شود.