این حالت نمایش چند صفحه ای قابل پرینت این قسمت میباشد. برای پرینت کلیک کنید..
گزارههای شرطی
- 1: یک مثال ساده
- 2: آزمونهای شرطی
- 3: بررسی شرطهای چندگانه
- 4: گزارههای if
- 5: زنجیرهی if-elif-else
- 6: آزمودن چند شرط
- 7: بهکارگیری گزارههای if در لیستها
- 8: شکلدهی به عبارتهای if
- 9: خلاصه
1 - یک مثال ساده
برنامهنویسی گاهی مستلزم آزمودن مجموعهای از شرطها و تصمیمگیری در مورد عملی است که باید بر اساس آن شرطها اتّخاذ شود. گزارههای if در پایتون این امکان را فراهم میآورند که حالتِ فعلی برنامه را بررسی کنیم و به آن پاسخی متناسب دهیم.
در این فصل نوشتن آزمونهای شرطی را برای بررسی هر نوع شرط میآموزید. نوشتن گزارههای سادهی if و همچنین ساختن دنبالهای پیچیده از گزارههای if را فراخواهید گرفت تا تشخیص دهید که شرایطی که به طور دقیق تعیین کردهاید چهزمانی برآورده میشوند. سپس همین مفهوم را به لیستها تعمیم میدهید و قادر خواهید بود حلقهی forای بنویسید که بیشتر اعضای یک لیست را به یک روش و تعداد مشخّص دیگری را به روشی دیگر مدیریّت کند.
یک مثال ساده
مثال کوتاهی که در ادامه میآید نشان میدهد که آزمونهای if چگونه به شما امکان میدهند که به شرایط خاصّی به درستی پاسخ دهید. تصوّر کنید که لیستی از خودروها دارید و میخواهید اسامی آنها را چاپ کنید. نام خودروها بیشتر نام خاص هستند پس باید آنها را در حالت عنوان (با حروف اوّل بزرگ) چاپ کرد. با این حال مقدار ‘bmw’ باید تماماً با حروف بزرگ چاپ شوند. کد زیر در لیست خودروها حلقه میزند و به دنبال مقدار ‘bmw’ میگردد. هر گاه به این مقدار رسید آن را به جای حالت عنوان، با حروف بزرگ چاپ میکند:
حلقهی این مثال در 1 ابتدا بررسی میکند که آیا نام فعلی ‘car’ی ‘bmw’ است یا نه؟ اگر چنین باشد این نام را با حروف بزرگ چاپ میکند. اگر مقدار car چیزی جز این بود، آن را در حالت عنوان چاپ میکند:
این مثال برخی از مفاهیمی را که شما در این فصل میآموزید، در هم آمیخته است. اکنون به انواع آزمونهایی نگاه میاندازیم که میتوانید از آنها برای آزمودنِ شرطها در برنامهی خود استفاده کنید.
2 - آزمونهای شرطی
قلب هر گزارهی if عبارتی است که با True و False (درست و نادرست) بودن سنجیده میشود و آن را آزمون شرطی مینامیم. پایتون از مقدارهای True و False برای تصمیمگیری در مورد اجرا شدن کد داخل گزارهی if استفاده میکند. اگر یک آزمون شرطی True (درست) ارزیابی شود، پایتون کدی را که بعد از گزارهی if آمده اجرا میکند. اگر آزمون False (نادرست) باشد پایتون کدی را که در ادامهی گزارهی if آمده نادیده میانگارد.
بررسیِ تساوی
بیشتر آزمونهای شرطی مقدارِ کنونیِ یک متغیّر را با یک مقدار مشخّصِ موردِ نظر مقایسه میکنند. سادهترین آزمون شرطیْ تساویِ مقدارِ یک متغیّر را با یک مقدار دلخواه بررسی میکند:
خط ۱ مقدار car را به کمک یک علامت تساوی برابر با ‘bmw’ قرار میدهد، چنانکه پیش از این در موارد بسیاری آن را دیدهاید. خط ۲ به کمک دو علامت تساوی (==) بررسی میکند آیا مقدار car برابر با ‘bmw’ است یا نه؟ عملگر برابری در صورت یکی بودن مقادیرِ دو طرف خود، True و در غیر این صورت False برمیگرداند. مقادیرِ این مثال به هم میخورند پس پایتون True برمیگرداند.
اگر مقدار car چیزی جز ‘bmw’ باشد، این آزمون False برمیگرداند:
علامت تساوی تکّی در واقع یک حکم است، میتوانید کد ۱ را به این صورت بخوانید: «مقدار car را برابر با ‘audi’ قرار بده.» از طرف دیگر علامت تساوی دوتایی، مانند ۲، پرسشی مطرح میکند: «آیا مقدار car برابر با ‘bmw’ است؟» بیشترِ زبانهای برنامهنویسی از علامتهای تساوی به همین شکل استفاده میکنند.
نادیده گرفتن بزرگ و کوچکی حروف هنگام بررسی تساوی
آزمودن تساوی در پایتون به بزرگی و کوچکی حروف حسّاس است. برای مثال دو کلمه با حروف یکسان امّا بزرگ و کوچکیِ متفاوت، یکسان تلقّی نمیشوند:
اگر بزرگی و کوچکی حروف مهم باشد این روش مفید است. امّا اگر این مسأله اهمّیّتی نداشته باشد و به جای آن میخواهید تنها مقدار یک متغیّر را بررسی کنید، میتوانید مقدار آن را پیش از مقایسه به حروف کوچک تبدیل کنید:
این آزمون باید صرف از شکل ‘Audi’ هم True برگرداند زیرا اکنون دیگر به بزرگ و کوچکی حروف حسّاس نیست. تابع lower() مقدار اوّلیّهی ذخیرهشده در car را تغییر نمیدهد، پس میتوانید این گونه مقایسهها را بدون ایجاد تغییر در مقدار متغیّر انجام دهید:
وبسایتها قوانین مشخّصی مانند این را بر دادههایِ ورودیِ کاربران اعمال میکنند. برای مثال سایتی ممکن است از یک آزمون شرطی مانند این استفاده کند تا مطمئن شود کاربر یک نام کاربری واقعاً یکتا دارد، نه صرفاً نام کاربری کس دیگری با تغییری در بزرگی و کوچکی حروف. زمانی که کسی نام کاربری جدیدی را ثبت میکند مقدار آن به حروف کوچک تبدیل میشود و سپس با تمام نامهای کاربری موجودِ تبدیلشده به حروف کوچک، مقایسه میشود. طی چنین آزمونی اگر هر ترکیبی از ‘john’ قبلاً ثبت شده باشد، نام کاربریای مانند ‘John’ رد خواهد شد.
بررسی نابرابری
اگر بخواهید نابرابری دو مقدار را بررسی کنید، میتوانید از ترکیب یک علامت تعجّب و علامت تساوی (!=) استفاده کنید. علامت تعجّب، مانند بسیاری از زبانهای برنامهنویسی دیگر، بیانگر «نیست» است.
اکنون از یک عبارت if دیگر برای بررسی کاربرد عملگر نابرابری استفاده میکنیم. مواد درخواستی برای روی پیتزا را در متغیّری ذخیره میکنیم و اگر ماهی کولی سفارش نداده باشد، پیامی خطاب به او صادر میکنیم:
خطّ ۱ مقدار requested_topping را با مقدار ‘anchovies’ مقایسه میکند. اگر دو مقدار برابر نباشند پایتون True برمیگرداند درنتیجه کدی که در ادامهی گزارهی if آمده اجرا میکند. اگر دو مقدار برابر باشند پایتون False برمیگرداند و آن خط را اجرا نخواهد کرد.
چون مقدار requested_topping برابر ‘anchovies’ نیست، تابع print() اجرا میشود:
|
|
بیشترِ عبارتهای شرطیای که مینویسید برابری را بررسی میکنند امّا گاهی آزمودن نابرابری را موثّرتر خواهید یافت.
مقایسههای عددی
آزمودن مقدارهای عددی بسیار سرراست است. برای مثال کد زیر بررسی میکند که آیا شخص ۱۸ ساله است یا نه:
همچنین میتوانید نابرابری دو عدد را بررسی کنید. مثلاً در کد زیر، در صورتیکه پاسخ وارد شده درست نباشد، پیامی چاپ میشود:
آزمون شرطی ۱ قبول میشود زیرا مقدار answer (۱۷) برابر با ۴۲ نیست و به همین دلیل کد تورفته اجرا میشود:
|
|
میتوانید مقایسههای ریاضی مختلف دیگری را هم در عبارتهای شرطی خود بگنجانید، مانند کمتری، کمتری یا برابری، بزرگتری، بزرگتری و برابری:
هر مقایسهی ریاضی میتواند به عنوان بخشی از یک عبارت if به کار گرفته شود که به شما برای تشخیص شرطهای دقیق موردنظرتان کمک میکند.
3 - بررسی شرطهای چندگانه
شاید بخواهید چند شرط را همزمان بررسی کنید. برای نمونه گاهی برای انجام عملی به True بودن همزمان دو شرط نیاز دارید. زمانی دیگر ممکن است ارضا شدن تنها یکی از دو شرط کافی باشد. دو کلیدواژهی and و or میتواند شما را در این شرایط یاری کند.
بهکارگیری and برای بررسی شرطهای چندگانه
برای بررسی درست (True) بودنِ همزمانِ دو شرط از کلیدواژهی and برای ترکیب دو آزمون شرطی استفاده کنید. اگر هر دو آزمون موفق باشند عبارت کلّی درست (True) خواهد بود. در صورتی که یکی یا هر دوی آزمونها ناموفّق باشند، عبارت کلی نیز نادرست (False) خواهد بود.
برای مثال میتوانید هنگام بررسی سن دو نفر بفهمید که آیا هر دو بالای ۲۱ سال هستند یا نه:
در ۱ دو سن age_0 و age_1 را تعریف میکنیم. در ۲ بررسی میکنیم که آیا هر دو بالای ۲۱ اند یا نه؟ آزمون سمت چپ موفق است امّا راستی نه، پس کل عبارت نادرست (False) است. در ۳ age_1 را به ۲۲ تغییر میدهیم. اکنون مقدار age_1 بیشتر از ۲۱ است پس از دو آزمون شرطی موفّقاند، این باعث میشود که کل عبارت شرطی درست (True) تلقّی شود.
برای بهبود خوانایی میتوانید دو طرف هر آزمون شرطی پرانتز قرار دهید، هر چند این کار الزامی نیست. اگر از پرانتز استفاده کنید آزمون شما شبیه به این خواهد بود:
|
|
بهکارگیری or برای بررسی شرطهای چندگانه
کلیدواژهی or هم امکان بررسی چند شرط را برای شما فراهم میآورد با این تفاوت که این بار اگر یکی یا هر دوی شرطها برقرار باشند، کل عبارت پذیرفته میشود.
مثال مربوط به سن را در نظر بگیرید. این بار به دنبال این هستیم که بفهمیم آیا تنها یکی از دو نفر بالای ۲۱ سال هست یا نه:
از تعریف دو متغیّر مربوط به سن در ۱ شروع میکنیم. از آنجایی که آزمون مربوط به age_0 درست است، کل عبارت ۲ درست (True) ارزیابی میشود. سپس age_0 را به ۱۸ کاهش میدهیم. در آزمون ۳، هر دو آزمون رد میشوند و عبارت کلّی نادرست (False) تعبیر خواهد شد.
بررسی وجود یک مقدار در یک لیست
گاهی مهم است که پیش از انجام کاری بررسی کنیم که یک لیست مقدار خاصّی را شامل میشود یا نه. برای نمونه پیش از تکمیل ثبت نام کاربر در یک وبسایت، شاید نیاز داشته باشید که بررسی کنید آیا نام کاربریِ انتخابیِ کاربر در لیست نامهای کاربری قبلی وجود دارد یا نه.
برای دریافتن این که آیا مقدار خاصّی در لیست وجود دارد از کلیدواژهی in استفاده میکنیم. فرض کنید میخواهید برای یک پیتزافروشی برنامهای بنویسید. لیستی از مواد درخواستی مشتری برای روی پیتزا تهیّه میکنیم و سپس بررسی میکنیم که آیا آنها در لیست ما وجود دارد یا نه.
در ۱ و ۲، کلیدواژهی in از پایتون میخواهد وجود ‘mushrooms’ و ‘pepperoni’ را در لیستِ requested_toppings بررسی کند. این تکنیک بسیار قدرتمند است زیرا میتوانید به کمک آن لیستی از مقادیر ضروری درست کنید و سپس به آسانی بررسی کنید که مقداری مورد نظر شما با یکی از مقادیر داخل لیست برابری میکند یا نه.
بررسی وجود نداشتن یک مقدار در یک لیست
زمانی دیگر ممکن است بخواهید وجود نداشتن مقداری را در لیستی بررسی کنید. در این شرایط میتوانید از کلیدواژهی not استفاده کنید. برای مثال لیستی از کاربران را در نظر بگیرید که از ارسال نظر در یک انجمن منع شدهاند. میخواهید پیش از ثبت یک نظر بررسی کنید که آیا کاربرِ نظردهنده در لیست کاربران ممنوع وجود دارد یا نه.
خط ۱ به آسانی خوانده میشود. اگر مقدار user در لیست banned_users نبود، پایتون True برمیگرداند و کد تورفته را اجرا میکند.
کاربر ‘marie’ در لیست ‘banned_users’ نیست پس پیامی میبیند که از او برای ارسال نظرش دعوت میکند:
|
|
عبارتهای بولی
در طی آموختن برنامهنویسی جایی به عبارت بولی برخواهید خورد. عبارت بولی تنها نامی دیگر برای آزمون شرطی است. مقدار بولی همانندِ مقدارِ یک عبارتِ شرطی پس از ارزیابی، یا درست (True) است یا نادرست (False).
مقدارهای بولی غالباً برای پیگیری و دنبال کردن شرطها به کار میرود، مانند این که آیا بازی میتواند اجرا شود یا آیا کاربری میتواند مطلب خاصّی را روی وبسایت ویرایش کند یا نه:
مقدارهای بولی برای پیگیری وضعیّت برنامه یا شرط خاصّی که در برنامه مهم است، راهی موثّر ارائه میکنند.
خودآزمایی
آزمونهای شرطی
تعدادی آزمون شرطی بنویسید. گزارهای برای شرح هر آزمون و پیشبینی شما از نتیجهی هر کدام چاپ کنید. کد شما باید چیزی شبیه به این باشد:
- به دقّت به نتایج خود نگاه کنید و مطمئن شوید که دلیل True یا False شدن هر خط را متوجّه میشوید.
- دستِ کم ده آزمون بسازید طوری که حدّاقل پنج تای آنها True و پنجتای دیگر False شود.
آزمونهای شرطی بیشتر
نباید خود را به ساختن تنها ده آزمون شرطی محدود کنید. اگر میخواهید مقایسههای بیشتری بکنید، آزمونهای بیشتری بنویسید و آنها را به conditional_tests.py بیفزایید. دست کم یک نتیجهی True و یک نتیجهی False برای هر کدام از موارد زیر داشته باشید:
- آزمون برابری و نابرابری برای رشتهها
- آزمونهایی با متد lower()
- آزمونهای عددی شامل برابری و نابرابری، بزرگتری و کوچکتری، بزرگتری و تساوی و کوچکتری و تساوی.
- آزمونهایی شامل کلیدواژههای and و or
- آزمون وجود عضوی در یک لیست
- آزمون وجود نداشتن عضوی در یک لیست
4 - گزارههای if
زمانی که آزمونهای شرطی را درک کردید میتوانید نوشتن گزارههای if را آغاز کنید. انواع مختلفی از گزارههای if وجود دارد و انتخاب آنها به تعداد شرطهایی که نیاز به آزمودن دارند بستگی دارد. در بحث مربوط به آزمونهای شرطی، مثالهای متعدّدی از عبارتهای if دیدید امّا اکنون آن را عمیقتر بررسی میکنیم.
گزارههای if ساده
سادهترین نوع گزارهی if یک آزمون و یک عملکرد دارد:
میتوانید هر نوع آزمون شرطی را در خط اوّل و هر آنچه را که میخواهید انجام دهید در بخش تورفتهی بعد از آن بنویسید. اگر آزمون شرطی True ارزیابی شود کدی که بعد از گزارهی if آمده اجرا میشود امّا اگر False ارزیابی شود پایتون آن کد را نادیده میگیرد.
اکنون متغیّری را برای نمایش سن یک نفر در نظر میگیریم و میخواهیم بدانیم آیا به سنّ قانونی برای رای دادن رسیده یا نه. کد زیر امکان رای دادن شخص را بررسی میکند:
در 1 پایتون بررسی میکند که آیا مقدار age بزرگتر یا مساوی ۱۸ است یا نه؟ چون این شرط برقرار است پایتون دستور print() تورفته را اجرا میکند:
|
|
تورفتگی در گزارههای if همان نقشی را بازی میکند که در حلقههای for ایفا میکرد. تمام خطهای تورفتهی پس از گزارهی if در صورتِ برقراریِ شرط اجرا خواهند شد و کل این خطها در صورت عدم برقراری نادیده گرفته خواهند شد.
میتوانید هر تعداد خط که خواستید به بخش بعد از گزارهی if اضافه کنید. بیایید خطّی دیگر به خروجی اضافه کنید و بپرسیم که آیا فرد برای رای دادن ثبت نام کرده است یا نه:
شرط برقرار است، هر دو دستور print() تورفتهاند، پس هر دو خط چاپ میشود:
اگر مقدار age کمتر از ۱۸ باشد این برنامه هیچ خروجیای نخواهد داشت.
گزارههای if-else
اغلب میخواهید هنگام برقراری یک شرط کار خاصّی انجام دهید و در صورت عدم برقراری کار دیگری. دستور if-else پایتون چنین امکانی فراهم میآورد. ساختار if-else مشابه گزارهی if ساده است امّا گزارهی else به شما اجازه میدهد که عملی یا مجموعهای از عملها را پس از برقرار نشدن شرط اجرا کنید.
مانند مثال قبلی خطاب به کسانی که به سن رای دادن رسیدهاند پیامی چاپ میکنیم امّا این بار به کسانی که به سن قانونی نرسیدهاند هم پیامی میدهیم.
اگر شرط 1 برقرار شود اوّلین مجموعهدستورهای تورفتهی print() اجرا میشود. اگر آزمون False ارزیابی شود، کد else در 2 اجرا خواهد شد. چون این بار age زیر ۱۸ است، شرط برقرار نمیشود و کدی اجرا میشود که در بخش else آمده است:
این کد به این دلیل کار میکند که تنها دو حالت ممکن برای ارزیابی وجود دارد: یا شخص به سن قانونی برای رای دادن رسیده یا نرسیده. در چنین شرایطی که پایتون باید یکی از دو کار ممکن را انجام دهد، ساختار if-else به خوبی کار میکند. در یک زنجیرهی if-else ساده مانند این، همیشه یکی از دو کار اجرا میشود.
5 - زنجیرهی if-elif-else
اغلب نیاز دارید که بیش از دو وضعیّت را بررسی کنید. برای ارزیابی چنین شرایطی میتوانید از دستور if-elif-else پایتون استفاده کنید. پایتون تنها یکی از بخشها را در زنجیرهی if-elif-else اجرا میکند. تا زمانی که یکی از آزمونها برقرار شود، پایتون آنها را به ترتیب اجرا میکند. به محض برقراری یک شرط، کد مربوط به آن اجرا شده و باقی آزمونها نادیده گرفته میشوند.
بسیاری از وضعیتها در دنیای واقعی بیش از دو شرط ممکن دارند. برای مثال یک شهربازی را در نظر بگیرید که نرخهای مختلفی برای گروههای سنّی مختلف در نظر میگیرد:
- پذیرش کودکان زیر ۴ سال رایگان است.
- پذیرش افراد بین ۴ تا ۱۸ سال ۲۵ دلار هزینه دارد.
- پذیرش افراد ۱۸ سال و بالاتر ۴۰ دلار هزینه دارد.
چگونه میتوانیم از گزارهی if برای تعیین هزینهی پذیرش یک شخص استفاده کنیم؟ کد زیر گروه سنّی فرد را بررسی میکند و هزینهی متناسب را چاپ میکند:
آزمون if در 1 بررسی میکند که آیا سن فرد زیر ۴ سال است یا نه. اگر این چنین باشد پیام مناسب چاپ شده و پایتون بقیهی آزمونها را نادیده میگیرد. خط elif در 2 در واقع یک if دیگر است و تنها زمانی اجرا میشود که آزمون قبلی موفّق نباشد. در این نقطه از زنجیره میدانیم که سن فرد حداقل ۴ سال است زیرا آزمون اول نتیجه نداده است. اگر سن فرد زیر ۱۸ سال باشد پیام متناسب چاپ خواهد شد و پایتون بخش else را نادیده میگیرد. اگر هر دو آزمون if و elif برقرار نشوند، کد مربوط به else را در 3 اجرا میکند.
در این مثال آزمون 1 False ارزیابی میشود پس این بخش از کد اجرا نمیشود. امّا آزمون دوم True میشود (۱۲ کمتر از ۱۸ است) پس این کد اجرا خواهد شد. خروجی یک جمله است که هزینهی پذیرش فرد را نشان میدهد:
|
|
هر سنّی بالاتر از ۱۷ موجب رد شدن هر دو آزمون اوّل میشود. در چنین شرایطی بخش else اجرا خواهد شد و هزینهی پذیرش ۴۰ دلار است.
به جای چاپ کردن هزینه در هر بخش از زنجیرهی if-elif-else، مختصرتر این است که تنها قیمت را در زنجیره مشخّص کنیم و پس از پایان ارزیابی کامل زنجیره، یک بار دستور print() ساده را فراخوانی کنیم:
خطها در 2،1 و 3 مقدار price را بر اساس سن فرد تعیین میکند. پس از تعیین شدن قیمت در زنجیرهی if-elif-else، فراخوانیِ جداگانه و بدونِ تورفتگی print()، این مقدار را برای گزارش هزینهی پذیرش فرد نمایش میدهد.
خروجی این کد مشابه مثال قبل است امّا مقصود زنجیرهی if-elif-else اینجا دقیقتر و مختصرتر است. به جای تعیین و چاپ کردن قیمت، تنها قیمت پذیرش را تعیین میکند. علاوه بر کارآمدی بیشتر، کد بازبینیشده نسبت به رویکرد اولیّه راحتتر قابل تغییر است. برای تغییر متن پیام خروجی، به جای تغییر سه print() مجزّا، کافی است تنها یک دستور print() را عوض کنید.
استفاده از چند elif
میتوانید هر تعداد elif که خواستید در کد خود استفاده کنید. مثلاً اگر شهربازی برای افراد مسن تخفیف قائل شده باشد، میتوانید یک آزمون شرطی دیگر به کد اضافه کنید تا تشخیص دهید فرد مستحقّ دریافت تخفیف است یا نه. فرض کنید افراد بالای ۶۵ سال باید نصف هزینهی معمول پذیرش، یعنی ۲۰ دلار، را بپردازند:
بیشترِ کد دست نخورده است. پیش از تعیین قیمت معمولی ۴۰ دلار، بخش elif دوم در 1 بررسی میکند که آیا فرد زیر ۶۵ سال است یا نه. توجّه کنید که قیمت تعیین شده در else (2) باید ۲۰ دلار باشد چون تنها افرادی که به این بخش میرسند بالای ۶۵ سال سن دارند.
حذف کردن قسمت else
پایتون الزامی به وجود یک بخش else در پایان زنجیرهی if-elif نمیبیند. گاهی وجود قسمت else سودمند است؛ گاهی به کارگیری یک گزارهی elif اضافی برای دریافتن یک شرط مشخّص مورد نظر، واضحتر است:
قسمت elif افزوده شده در 1 برای افزاد بالاتر از ۶۵ سال قیمت ۲۰ دلار را تعیین میکند. این کار از بهکارگیری یک قسمتِ else عمومی کمی واضحتر است. با این تغییر هر قسمتِ کد با گذراندن یک آزمون شرطی مشخّص اجرا خواهد شد.
قسمت else گزارهای همهگیر است و با برقراری هر شرطی به جز آنها که در آزمونهای مشخّص if یا elif مشخّص شدهاند، اجرا میشود که میتواند گاهی شامل دادههای نامعتبر یا حتّی مخرّب باشد. اگر یک شرط پایانی مشخّص برای آزمودن دارید، حذف کردن قسمت else و اضافه کردن یک elif پایانی را در نظر داشته باشید. در نتیجه شما مطمئنتر خواهید بود که کد تنها تحت شرایط درست اجرا میشود.
6 - آزمودن چند شرط
زنجیرهی if-elif-else قدرتمند است امّا تنها زمانی کاربرد دارد که بخواهید فقط یک شرط برقرار باشد. به محض برقراری یکی از آزمونهای شرطی پایتون باقی آزمونها را نادیده میگیرد. این رفتار به خاطر کارآمدی سودمند است و آزمودن یک شرط مشخّص را برای شما ممکن میسازد.
با این حال گاهی مهم است که تمام شرطهای مورد نظر را بررسی کنیم. در این حالت باید از تعداد گزارهی if متوالی بدون elif یا else استفاده کنیم. این تکنیک زمانی معنا مییابد که بیش از یک شرط امکان تحقّق داشته باشند و بخواهید برای هر شرطی که True شود کاری انجام دهید.
حال مثال پیتزافروشی را دوباره بررسی میکنیم. اگر کسی دو نوع مواد مختلف برای روی پیتزای خود سفارش دهد، باید مطمئن شوید که هر دو نوع روی پیتزای او ریخته میشود:
|
|
در 1 لیستی شامل مواد درخواستی تعریف میکنیم. در گزارهی 2 بررسی میکنیم که آیا مشتری برای روی پیتزای خود قارچ سفارش داده یا نه. اگر چنین باشد پیامی برای تایید چاپ میشود. آزمونی که در 3 برای پپرونی آورده شده یک گزارهی if ساده است، نه elif یا else، بنابراین کد مربوط به آن، صرف از نظر از برقراریِ شرطِ قبلی، اجرا میشود. کد خط 4 بررسی میکند که بدون توجّه به آزمون قبلی، آیا پنیر اضافی درخواست شده یا نه. این سه آزمون مستقل با هر بار اجرای برنامه اجرا خواهند شد.
از آنجایی که تمام شرطها در این مثال ارزیابی میشوند، قارچ و پنیر اضافی هر دو به پیتزا اضافه میشوند:
اگر از ساختار if-elif-else استفاده میکردیم این کد به درستی کار نمیکرد، زیرا پس از برقراری یکی از شرطها اجرای آن متوقّف میشد. اینجا میبینیم که خروجی به چه شکل خواهد بود:
|
|
آزمون مربوط به ‘mushrooms’ اولین موردی است که تحقّق مییابد پس قارچ به پیتزا اضافه میشود. با این حال مقادیر ’extra cheese’ و ‘pepperoni’ هرگز بررسی نمیشوند زیرا پس از موفقّیتآمیز بودن آزمون اوّل، پایتون کدهای دیگر در زنجیرهی if-elif-else را اجرا نمیکند. اوّلین مورد درخواستی مشتری اضافه میشود امّا دوتای دیگر از قلم خواهند افتاد:
به طور مختصر، اگر بخواهید تنها یک قسمت از کد اجرا شود از یک زنجیرهی if-elif-else استفاده کنید. اگر قسمتهای مختلف کد باید اجرا شوند از تعدادی گزارهی if مستقل بهره بگیرید.
خودآزمایی
رنگهای موجودات بیگانه ۱
فرض کنید که در یک بازی به یک موجود بیگانه شلیک کردهایم. متغیّری به نام alien_color تعریف کنید و به آن مقدار ‘green’، ‘yellow’ یا ‘red’ را نسبت دهید.
- یک گزارهی if بنویسید تا سبز بودن رنگ موجود بیگانه را بررسی کند. اگر چنین بود پیامی چاپ کند که بازیکن ۵ امتیاز گرفته است.
- یک نسخه از این برنامه را به نحوی بنویسید که در آن شرط برقرار میشود. نسخهی دیگر را طوری بنویسید که در آن شرط تحقّق نیابد. (در این نسخه برنامه هیچ خروجیای ندارد.)
رنگهای موجودات بیگانه ۲
همانند تمرین ۵-۳ رنگی برای موجودات بیگانه انتخاب کنید و یک زنجیرهی if-else بنویسید.
- اگر رنگ موجود بیگانه سبز باشد، پیامی چاپ کند مبنی بر این که بازیکن ۵ امتیاز کسب کرده است.
- اگر رنگ سبز نبود اعلام کند که بازیکن ۱۰ امتیاز گرفته است.
- برنامه را یک بار طوری بنویسید که شرط if برقرار شود و بار دیگر شرط else.
رنگهای موجودات بیگانه ۳
زنجیرهی if-else مثال ۵-۴ را به if-elif-else تبدیل کنید.
- اگر رنگ موجود بیگانه سبز بود، پیامی چاپ کند که بازیکن ۵ امتیاز گرفته است.
- اگر زرد بود، پیامی چاپ کند که بازیکن ۱۰ امتیاز گرفته است.
- اگر قرمز بود، پیامی چاپ کند که بازیکن ۱۵ امتیاز گرفته است.
- سه نسخه از این برنامه را به نحوی بنویسید که هر بار یکی از شرطها برقرار شود.
مراحل زندگی
یک زنجیرهی if-elif-else بنویسید که مشخّص کند فرد در کدام مرحلهی زندگی است. مقداری برای متغیّر age تعیین کنید، سپس:
- اگر فرد زیر ۲ سال سن داشت، پیامی چاپ کند که فرد نوزاد است.
- اگر سن بین ۲ تا ۴ سال بود پیامی چاپ کند که فرد نوپاست.
- اگر فرد بین ۴ و ۱۳ سال سن دارد، پیامی چاپ کند که فرد کودک است.
- اگر سن بین ۱۳ و ۲۰ سال است پیامی چاپ کند که فرد نوجوان است.
- اگر سن بین ۲۰ و ۶۵ باشد پیامی چاپ کند که فرد بالغ است.
- اگر سن ۶۵ یا بیشتر بود پیامی چاپ کند که فرد کهنسال است.
میوهی مورد علاقه
لیستی از میوههای مورد علاقهی خود درست کنید و تعدادی گزارهی if مستقل بنویسید که وجود میوهی خاصّی را در لیست بررسی کند.
- لیستی از سه میوهی مورد علاقهی خود بسازید و آن را favorite_fruits بنامید.
- پنج گزارهی if بنویسید. هر کدام از آنها بررسی میکنند که آیا میوهی خاصّی در لیست وجود دارد یا نه. اگر میوه در لیست بود کد داخل گزارهی if باید جملهای مانند
You really like bananasچاپ کند.
7 - بهکارگیری گزارههای if در لیستها
با ترکیب کردن لیستها و گزارههای if میتوانید کارهای جالبی بکنید. میتوان مقادیر ویژهای را تحت نظر گرفت که نسبت به دیگر مقادیر موجود در لیست نیاز به عمل متفاوتی دارند، میتوانید شرایطی را که در حال تغییرند به طور موثری مدیریّت کنید. به تدریج ثابت میکنید که کد شما همانطور که انتظار دارید تحت هر شرایطی کار میکند.
بررسی موارد خاص
این فصل با مثالی ساده آغاز شد که در آن نشان دادیم چگونه مقداری ویژهای مانند ‘bmw’ را مدیریت کنیم به نحوی که در مقایسه با دیگر اعضای لیست به شکل دیگری چاپ شود. اکنون که درکی پایهای از آزمونهای شرطی و گزارههای if کسب کردهاید، نگاهی دقیقتر به نحوهی تحت نظر گرفتن مقدارهای خاصی در یک لیست میاندازیم و این که چگونه آنها را به درستی مدیریت کنیم.
اجازه دهید با مثال پیتزافروشی ادامه بدهیم. این پیتزافروشی همزمان با آماده شدن پیتزا، پیامی نشان میدهد که مواد درخواستی به پیتزا اضافه شده است. با ساختن لیستی از مواد روی پیتزا که مشتری درخواست کرده، کد این برنامه بسیار بهینهتر نوشته میشود. سپس به کمک یک حلقه اعلام میکنیم که هر مورد درخواستی به پیتزا اضافه شده است:
خروجی سرراست است زیرا کد تنها یک حلقهی سادهی for است:
اگر پیتزافروشی فلفل سبز تمام کرده باشد چه اتّفاقی میافتد؟ یک گزارهی if در داخل حلقه میتواند این وضعیّت را به خوبی مدیریّت کند:
|
|
این بار هر مورد درخواستی را پیش از افزودن به پیتزا بررسی میکنیم. کد در 1 بررسی میکند که آیا مشتری فلفل سبز درخواست کرده یا نه. اگر چنین باشد پیامی چاپ میکند و به او اعلام میکند که چرا نمیتوانند چنین موردی را به پیتزای خود اضافه کنند. قسمت else در 2 اطمینان حاصل میکند که تمام مواد دیگر به پیتزا افزوده شوند.
خروجی نشان میدهد که هر کدام از موارد درخواستی به درستی مدیریّت شدهاند:
بررسی تهی نبودن یک لیست
تا اینجا در مورد لیستهایی که با آنها کار کردهایم یک فرض ساده داشتهایم؛ فرض کردهایم که هر لیست حداقل یک عضو دارد. به زودی به کاربران امکان وارد کردن اطّلاعاتی را خواهیم داد که باید در لیستها ذخیره شود، بنابراین نمیتوانیم فرض کنیم که در هر بار اجرای حلقه لیست عضوی در خود دارد. در چنین شرایط بررسی تهی بودنِ یک لیست پیش از اجرای حلقهی for کاری سودمند است.
به عنوان یک مثال پیش از پختن پیتزا بررسی میکنیم که آیا لیست مواد درخواستی خالی است یا نه؟ اگر لیست خالی بود به کاربر اعلام میکنیم که آیا مطمئن است پیتزایی ساده میخواهد؟ اگر لیست خالی نبود پیتزا را همانند مثالهای قبلی درست میکنیم:
این بار از یک لیست خالی برای مواد درخواستی در 1 شروع کردیم. به جای پریدن داخل حلقهی for، یک آزمون سریع در 2 انجام دادیم. اگر در گزارهی if نام لیست را بیاوریم، در صورتی که لیست دستِ کم یک عضو داشته باشد، پایتون این گزاره را True ارزیابی میکند و اگر لیست خالی باشد آن را False در نظر میگیرد. اگر requested_toppings در آزمون شرطی قبول شود، حلقهی for مانند مثال قبل اجرا خواهد شد. در غیر این صورت در 3 پیامی چاپ میکنیم و از مشتری میپرسیم که آیا واقعاً یک پیتزای ساده میخواهد.
در این مورد لیست خالی است پس خروجی از کاربر میپرسد آیا واقعاً پیتزای ساده میخواهد؟
|
|
اگر لیست خالی نباشد خروجی همهی چیزهایی را که به پیتزا اضافه میشود نشان میدهد.
به کارگیری چند لیست
مشتریان ممکن است هر چیزی درخواست کنند به ویژه هنگامی که بحث پیتزا پیش میآید. اگر یک مشتری بخواهد روی پیتزای او سیبزمینی سرخکرده ریخته شود چه؟ میتوانید از لیستها و گزارههای if استفاده کنید تا پیش از انجام هر عملی روی ورودی کاربر، مطمئن شوید که درخواست او معنادار است یا نه.
حال پیش از پختن پیتزا درخواست ریختن مواد نامعمول روی آن را زیر نظر میگیریم. مثال زیر دو لیست را تعریف میکند. اولی لیست مواد موجود در پیتزافروشی و دیگری لیست موادی است که مشتری درخواست کرده است. این بار هر مورد requested_toppings پیش از اضافه شدن به پیتزا با موارد موجود مقایسه میشود:
|
|
در 1 لیستی از مواد موجود در پیتزافروشی تعریف کردیم. توجّه داشته باشید که اگر انتخابهای موجود برای مواد روی پیتزا ثابت باشد میتوان به جای لیست از چندتایی استفاده کرد. در 2 لیستی از موادِ موردِ درخواستِ مشتری درست کردیم. به درخواست نامعمول ‘french fries’ توجّه کنید. در خط 3 داخل لیست مواد درخواستی حلقه میزنیم. درون حلقه (4) ابتدا بررسی میکنیم که آیا مادهی درخواستی در لیست مواد موجود وجود دارد یا نه. اگر چنین است مواد را به پیتزا اضافه میکنیم. امّا اگر مادهی درخواستی در لیست موجود نبود، بخش else خط 5 را اجرا خواهد کرد. این بخش پیامی چاپ میکند و به مشتری میگوید که مواد مورد نظر او موجود نیست.
این کد یک خروجی مرتّب و پرمعنی تولید میکند:
در تنها چند خط کد یک مسالهی دنیای واقعی را به روشی بسیار موثّر مدیریت کردیم!
خودآزمایی
سلامْ مدیر
لیستی از پنجتا یا بیشتر نام کاربری درست کنید که شامل ‘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” خوانده شود و هر نتیجه باید در یک خط جدا چاپ شود.
8 - شکلدهی به عبارتهای if
در هر کدام از مثالهای این فصل نمونههایی از عادتهای خوب شکلدهی را دیدهاید. تنها توصیهای که PEP 8 برای شکلدهی آزمونهای شرطی ارائه کرده این است که در دو طرف عملگرهای مقایسهای مانند ==، >= و <= یک فاصلهی خالی قرار دهید.
|
|
از:
|
|
بهتر است.
این فاصلهگذاری بر روشی که پایتون کد شما را تفسیر میکند، تاثیری نمیگذارد؛ تنها خواندن کد شما را برای خودتان و دیگران سادهتر میکند.
خودآزمایی
شکلدهی به گزارههای if
برنامههایی که در این فصل نوشتهاید مرور کنید و مطمئن شوید که آزمونهای شرطی خود را به خوبی شکل دادهاید.
ایدههای شما
هماکنون شما نسبت به زمانی که این کتاب را شروع کردید برنامهنویس تواناتری هستید. اکنون که از روش مدل شدن وضعیتهای موجود در دنیای واقعی در برنامهها درک بهتری پیدا کردهاید، میتوانید به برخی مشکلات فکر کنید که میتوانید با برنامههای خود آن را برطرف کنید. همزمان با توسعهی مهارتهای برنامهنویسی خود، اگر دربارهی مسائلی که میتوانید حل کنید ایدهای دارید، آن را ثبت کنید. بازیهایی را در نظر بگیرید که دوست دارید بسازید، یا مجموعهدادههایی که میخواهید بکاوید یا برنامههای تحت وبی که میخواهید ایجاد کنید.
9 - خلاصه
در این فصل نوشتن آزمونهای شرطی را آموختید که همیشه True یا False ارزیابی میشوند. یاد گرفتید که چگونه عبارتهای سادهی if، زنجیرههای if-else و if-elif-else بنویسید. برای تشخیص شرطهای خاصی که نیاز به بررسی دارند، بهکارگیری این ساختارها را شروع کردید. همچنین فهمیدید که آن شرطها چه زمانی در برنامههای شما برآورده میشوند. برخورد متفاوت با برخی اعضای خاص یک لیست را همزمان با بهکارگیری کارآمدِ یک حلقهی for آموختید. دوباره به توصیهها و شیوهنامههای پایتون برخوردید تا مطمئن شوید با پیچیدهتر شدن برنامهها، خوانایی و درک آنها نسبتاً ساده باقی میماند.
در فصل ۶ در مورد دیکشنریهای پایتون میآموزید. دیکشنری شبیه لیست است امّا امکان به هم پیوستن اطلاعات مختلف را فراهم میآورد. ساختن دیکشنریها، حلقه زدن در آنها و استفاده کردن از آنها را در کنار لیستها و گزارههای if فرامیگیرید. آموختن در مورد دیکشنریها به شما امکان مدل کردن گسترهی بزرگتری از وضعیتهای دنیای واقعی را میدهد.