به‌کارگیری گزاره‌های if در لیست‌ها

با ترکیب کردن لیست‌ها و گزاره‌های if می‌توانید کارهای جالبی بکنید. می‌توان مقادیر ویژه‌ای را تحت نظر گرفت که نسبت به دیگر مقادیر موجود در لیست نیاز به عمل متفاوتی دارند، می‌توانید شرایطی را که در حال تغییرند به طور موثری مدیریّت کنید. به تدریج ثابت می‌کنید که کد شما همان‌طور که انتظار دارید تحت هر شرایطی کار می‌کند.

بررسی موارد خاص

این فصل با مثالی ساده آغاز شد که در آن نشان دادیم چگونه مقداری ویژه‌ای مانند ‘bmw’ را مدیریت کنیم به نحوی که در مقایسه با دیگر اعضای لیست به شکل دیگری چاپ شود. اکنون که درکی پایه‌ای از آزمون‌های شرطی و گزاره‌های if کسب کرده‌اید، نگاهی دقیق‌تر به نحوه‌ی تحت نظر گرفتن مقدارهای خاصی در یک لیست می‌اندازیم و این که چگونه آن‌ها را به درستی مدیریت کنیم.

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

1
2
3
4
5
6
requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']

for requested_topping in requested_toppings:
    print(f"Adding {requested_topping}.")

print("\nFinished making your pizza!")

خروجی سرراست است زیرا کد تنها یک حلقه‌ی ساده‌ی for است:

1
2
3
4
5
Adding mushrooms.
Adding green peppers.
Adding extra cheese.

Finished making your pizza!

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

1
2
3
4
5
6
7
8
9
requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']

for requested_topping in requested_toppings:
    if requested_topping == 'green peppers':
        print("Sorry, we are out of green peppers right now.")
    else:
        print(f"Adding {requested_topping}.")

print("\nFinished making your pizza!")

این بار هر مورد درخواستی را پیش از افزودن به پیتزا بررسی می‌کنیم. کد در 1 بررسی می‌کند که آیا مشتری فلفل سبز درخواست کرده یا نه. اگر چنین باشد پیامی چاپ می‌کند و به او اعلام می‌کند که چرا نمی‌توانند چنین موردی را به پیتزای خود اضافه کنند. قسمت else در 2 اطمینان حاصل می‌کند که تمام مواد دیگر به پیتزا افزوده شوند.

خروجی نشان می‌دهد که هر کدام از موارد درخواستی به درستی مدیریّت شد‌ه‌اند:

1
2
3
4
5
Adding mushrooms.
Sorry, we are out of green peppers right now.
Adding extra cheese.

Finished making your pizza!

بررسی تهی نبودن یک لیست

تا اینجا در مورد لیست‌هایی که با آن‌ها کار کرده‌ایم یک فرض ساده داشته‌ایم؛ فرض کرده‌ایم که هر لیست حداقل یک عضو دارد. به زودی به کاربران امکان وارد کردن اطّلاعاتی را خواهیم داد که باید در لیست‌ها ذخیره شود، بنابراین نمی‌توانیم فرض کنیم که در هر بار اجرای حلقه لیست عضوی در خود دارد. در چنین شرایط بررسی تهی بودنِ یک لیست پیش از اجرای حلقه‌ی for کاری سودمند است.

به عنوان یک مثال پیش از پختن پیتزا بررسی می‌کنیم که آیا لیست مواد درخواستی خالی است یا نه؟ اگر لیست خالی بود به کاربر اعلام می‌کنیم که آیا مطمئن است پیتزایی ساده می‌خواهد؟ اگر لیست خالی نبود پیتزا را همانند مثال‌های قبلی درست می‌کنیم:

1
2
3
4
5
6
7
8
requested_toppings = []

if requested_toppings:
    for requested_topping in requested_toppings:
        print(f"Adding {requested_topping}.")
    print("\nFinished making your pizza!")
else:
    print("Are you sure you want a plain pizza?")

این بار از یک لیست خالی برای مواد درخواستی در 1 شروع کردیم. به جای پریدن داخل حلقه‌ی for، یک آزمون سریع در 2 انجام دادیم. اگر در گزاره‌ی if نام لیست را بیاوریم، در صورتی که لیست دستِ کم یک عضو داشته باشد، پایتون این گزاره را True ارزیابی می‌کند و اگر لیست خالی باشد آن را False در نظر می‌گیرد. اگر requested_toppings در آزمون شرطی قبول شود، حلقه‌ی for مانند مثال قبل اجرا خواهد شد. در غیر این صورت در 3 پیامی چاپ می‌کنیم و از مشتری می‌پرسیم که آیا واقعاً یک پیتزای ساده می‌خواهد.

در این مورد لیست خالی است پس خروجی از کاربر می‌پرسد آیا واقعاً پیتزای ساده می‌خواهد؟

1
Are you sure you want a plain pizza?

اگر لیست خالی نباشد خروجی همه‌ی چیزهایی را که به پیتزا اضافه می‌شود نشان می‌دهد.

به کارگیری چند لیست

مشتریان ممکن است هر چیزی درخواست کنند به ویژه هنگامی که بحث پیتزا پیش می‌آید. اگر یک مشتری بخواهد روی پیتزای او سیب‌زمینی سرخ‌کرده ریخته شود چه؟ می‌توانید از لیست‌ها و گزاره‌های if استفاده کنید تا پیش از انجام هر عملی روی ورودی کاربر، مطمئن شوید که درخواست او معنادار است یا نه.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
available_toppings = ['mushrooms', 'olives', 'green peppers',
                      'pepperoni', 'pineapple', 'extra cheese']

requested_toppings = ['mushrooms', 'french fries', 'extra cheese']

for requested_topping in requested_toppings:
    if requested_topping in available_toppings:
        print(f"Adding {requested_topping}.")
    else:
        print(f"Sorry, we don't have {requested_topping}.")

print("\nFinished making your pizza!")

در 1 لیستی از مواد موجود در پیتزافروشی تعریف کردیم. توجّه داشته باشید که اگر انتخاب‌های موجود برای مواد روی پیتزا ثابت باشد می‌توان به جای لیست از چندتایی استفاده کرد. در 2 لیستی از موادِ موردِ درخواستِ مشتری درست کردیم. به درخواست نامعمول ‘french fries’ توجّه کنید. در خط 3 داخل لیست مواد درخواستی حلقه می‌زنیم. درون حلقه (4) ابتدا بررسی می‌کنیم که آیا ماده‌ی درخواستی در لیست مواد موجود وجود دارد یا نه. اگر چنین است مواد را به پیتزا اضافه می‌کنیم. امّا اگر ماده‌ی درخواستی در لیست موجود نبود، بخش else خط 5 را اجرا خواهد کرد. این بخش پیامی چاپ می‌کند و به مشتری می‌گوید که مواد مورد نظر او موجود نیست.

این کد یک خروجی مرتّب و پرمعنی تولید می‌کند:

1
2
3
4
5
Adding mushrooms.
Sorry, we don't have french fries.
Adding extra cheese.

Finished making your pizza!

در تنها چند خط کد یک مساله‌ی دنیای واقعی را به روشی بسیار موثّر مدیریت کردیم!

خودآزمایی

سلامْ مدیر

لیستی از پنج‌تا یا بیشتر نام کاربری درست کنید که شامل ‘admin’ باشد. فرض کنید کدی می‌نویسید که پس از ورود هر کاربر به سایت پیام تبریکی خطاب به او چاپ کند. در لیست حلقه بزنید و پیام تبریکی برای هر کاربر چاپ کنید:

  • اگر نام کاربری ‘admin’ است تبریکی خاص چاپ کنید مانند Hello admin, would you like to see a status report?.
  • در غیر این صورت یک پیام تبریک عمومی چاپ کنید. مانند Hello Jaden, thank you for logging in again.

فقدان کاربران

یک آزمون if به hello_admin.py اضافه کنید تا مطمئن شوید که لیست کاربران خالی نیست.

  • اگر لیست خالی است پیام We need to find some users را چاپ کند.
  • تمام نام‌های کاربری را از لیست خود حذف کنید و مطمئن شوید که پیام درست چاپ می‌شود.

بررسی نام‌های کاربری

کارهای زیر را برای ساختن برنامه‌ای انجام دهید که چگونگیِ عملکردِ وب‌سایت‌ها را هنگامِ بررسیِ یکتا بودنِ نام‌ِ کاربریِ هر کس شبیه‌سازی کند.

  • لیستی به نام current_users شامل پنج‌تا یا بیشتر نام کاربری بسازید.
  • لیست دیگری به نام new_users شامل پنج نام کاربری دیگر درست کنید. مطمئن شوید یک یا دو نام این لیست با لیست current_users مشترک است.
  • در لیست new_users حلقه بزنید تا ببینید که نام کاربری جدید قبلاً استفاده شده یا نه. اگر چنین بود پیامی چاپ کنید که به کاربر بگوید باید نام کاربر جدیدی انتخاب کند. اگر نام کاربری قبلاً استفاده نشده بود پیامی چاپ کند که اعلام کند نام کاربری موجود است.
  • مطمئن شوید که مقایسه‌ی شما به بزرگ و کوچکی حروف حساس نیست. اگر ‘John’ قبلاً انتخاب شده باشد، ‘JOHN’ نباید پذیرفته شود. (برای این کار باید یک کپی از current_users شامل نام کاربران با حروف کوچک درست کنید.)

اعداد ترتیبی

اعداد ترتیبی جایگاه خود را در یک لیست نمایش می‌دهند مثل یکم، دوم و … . در زبان انگلیسی به جز ۱، ۲ و ۳، باقی اعداد ترتیبی به th ختم می‌شوند.

  • اعداد ۱ تا ۹ را در لیستی ذخیره کنید.
  • در لیست حلقه بزنید.
  • از یک زنجیره‌ی if-elif-else در داخل حلقه استفاده کنید تا پسوند مناسب ترتیبی را برای هر عدد چاپ کند. خروجی شما باید به صورت “1st 2nd 3rd 4th 5th 6th 7th 8th 9th” خوانده شود و هر نتیجه باید در یک خط جدا چاپ شود.