دستور if در پایتون را مانند پلیس راهنمایی و رانندگی هوشیاری در نظر بگیرید که جریان کدهای نوشته شده را بر اساس شرایط مشخصی هدایت میکند. این دستور، یکی از عناصر بسیار مهم در برنامه نویسی پایتون است، زیرا به کدهای برنامه کمک میکند که انتخاب کنند. در واقع برنامه را راهنمایی میکند تا بر اساس پیشامدهای مختلفی که در آن روی میدهند، عکس العمل متفاوتی را نیز بروز دهد. در این مطلب جامع به بررسی همه مسائلی خواهیم پرداخت که باید درباره دستور if در پایتون بدانیم. از سینتکس و مطالب پایهای گرفته تا کاربردهای پیشرفته دستور if را توضیح داده و برای هر کدام هم مثال کدنویسی شدهای را نمایش میدهیم.
در این مطلب از مجله فرادرس، با دستور if در پایتون آشنا شده و روش کار آن را آموزش دادهایم. بخشهای اختیاری این دستور که شامل عبارتهای «else» و «elif» میشود را بررسی کرده و درنهایت روشهای مختلف استفاده از ساختار شرطی «if-else» را نیز نمایش دادهایم. در آخر مطلب هم درباره ساختار «Match-Case» و اشتباههای رایج زمان استفاده از این دستور به همراه راه حل هر کدام مطالبی کاملی را بیان کردهایم.
دستور if در پایتون چیست؟
در پایتون از دستور if برای اجرای عملیات شرطی استفاده میکنیم. if ابزاری است که به برنامه کمک میکند، بر اساس شرایط مختلف پیش آمده تصمیم بگیرد.
سینتکس دستور if در پایتون
عبارت if در پایتون، یکی از بلوکهای بنیادین در برنامهنویسی است. عبارت شرطی است که در صورت بر قرار بودن شرایط خاصی به کدهای مشخص شده دستور اجرا میدهد. در مثال زیر روش کار این عبارت را به صورت بسیار ساده نمایش دادهایم.
1y = 15
2if y < 20:
3 print('y is less than 20')
4
5# Output:
6# 'y is less than 20'
در مثال بالا، متغیری به نام y داریم که با مقدار عددی 15 به آن تخصیص داده شده است. عبارت if در این کد بررسی میکند که آیا مقدار y از 20 کمتر است یا نه. از آنجا که مسلما عدد 15 از عدد 20 کمتر است، جواب عملیات مقایسه «True» است و کد درون عبارت if باید اجرا شود. در نتیجه در خروجی عبارت y is less than 20 چاپ خواهد شد.
در کد زیر condition آزمونی است که دستور if مورد بررسی قرار میدهد. اگر جواب ارزیابی عبارت condition برابر با صحیح یا True شود، بلوک کد زیر عبارت if اجرا خواهد شد وگرنه این بلوک نادیده گرفته میشود.
1if condition:
2 # code to be executed if the condition is true
برای حالت عدم برقراری شرط نیز میتوانیم رویدادهای دیگری را برنامهریزی کنیم. به این منظور از عبارت else استفاده میکنیم.
دستور if-else چیست؟
دستور «if-else» عبارتی است که برای گرفتن تصمیم بر اساس شرایط مختلف در کدهای پایتون بهکار برده میشود. این بلوک کد را میتوانیم مانند دوشاخه کردن ریل قطار در نظر بگیریم. بر اساس اینکه سوئیچ درون قطارها کدام راه را نشان میدهد، قطار در دو راهی ریل پیش روی خود، یکی از مسیرها را انتخاب خواهد کرد. پایتون زبان مفسری است. به این معنی که مفسر پایتون خطهای کد را یک به یک از بالا به پایین میخواند. در سادهترین حالت ممکن، این مسئله باعث شکل گرفتن جریان خطی کدها میشود. یعنی خطوط کد خوانده شده، تفسیر میشوند و یک به یک پشت سر هم اجرا خواهند شد.
اما این روش ساده، مانع ساخت برنامههای پیچیده است. برای دستیابی به سطحی از تغییرپذیری در روند اجرای برنامه، ساختارهای کنترل دیگری مورد نیاز هستند. به صورت کلی، تغییرپذیری روند اجرای برنامه در تمام برنامههای مربوط به پروژههای دنیای واقعی باید قابل اجرا باشد.
در بخشهای بعد به صورت دقیقتر و با جزئیات بیشتری به بررسی روش کار و استفاده از عبارت «if-else» پرداختهایم. در بخش بعدی با این عبارت بیشتر آشنا خواهیم شد. همچنین، در مطالب قبلی مجله فرادرس نیز در مورد «شرط در برنامهنویسی» صحبت کردهایم که میتوانید مطلب مربوطه را مطالعه کنید.
دستور if در پایتون چگونه کار می کند؟
عبارت «if-else» پایتون تقریبا مانند همین عبارت در سایر زبانهای برنامهنویسی کار میکند. اگرچه چند تفاوت کلیدی وجود دارد. در این بخش به بررسی روش کار بلوک کد «if-else» در پایتون و تفاوتهای آن با سایر زبانهای برنامه نویسی پرداختهایم.
سینتکس کلی دستور if-else در پایتون
سینتکس کلی دستور «if-else» در پایتون را به صورت نوشته شده در کادر زیر میتوان نمایش داد. در سینتکس زیر مشاهده میشود که ابتدا شرطی را مشخص میکنیم. سپس عملکرد یا رفتاری را تعریف میکنیم که – تابع if_body() - در صورت روی دادن شرط مشخص شده باید توسط برنامه انجام گیرد. بعد از آن در بلوک else ، کدی را مینویسیم – یا رفتاری را مشخص میکنیم – که در صورت روی ندادن شرط تعریف شده باید توسط برنامه انجام بگیرد.
1if condition:
2 if_body()
3else:
4 else_body()
شرط تعریف شده میتواند به یکی از دو حالت True یا False منتهی شود. حتی از طریق وارد کردن مستقیم True یا False به عنوان شرط، میتوانیم این الگو را شفافتر هم بکنیم. این روش کدنویسی در نهایت به برنامه ایستایی ختم میشود که در آن هر دو مسیر برای انتخاب در مقابل مفسر پایتون به صورت شفاف قرار داده شدهاند. نمونه کدهای استاتیک تعریف شده را در مثال پایین نمایش دادهایم.
1if False:
2 # this code will never be executed
3 if_body()
4else:
5 else_body()
6
7if True:
8 if_body()
9else:
10 # this code will never be executed
11 else_body()
البته الگوی نمایش داده شده در بالا کاربردی نیست و فقط بخاطر نمایش دادن روش کار عبارت if-else ، آن را پیادهسازی کردهایم. در برنامههای مربوط به دنیای واقعی، بهجای استفاده از مقادیر ایستای True یا False، از عبارتی به عنوان شرط استفاده میکنیم. در زمان اجرای برنامه، عبارت نوشته شده ارزیابی خواهد شد. نتیجه این ارزیابی به عنوان مقدار حقیقی بدست آمده و برای استفاده در عبارت «if-else» ذخیره میشود. با توجه به مقدار ذخیره شده برنامه تصمیم میگیرد که کدام شاخه از کدهای تعریف شده را اجرا کند.
توجه: باید در نظر داشته باشیم که وجود بخش else در این ساختار اختیاری است. کدهای درون بخش else فقط زمانی اجرا میشوند که شرایط زیر برقرار باشد.
- شرط تعریف شده در عبارت if برقرار نشده باشد.
- شرط تعریف شده برای else برقرار باشد. در صورت تعریف نشدن هیچ شرطی برای else ، تنها برقرار نشدن شرط if برای اجرای کدهای else کفایت میکند.
در بعضی حالتها اصلا نیازی به نوشتن بخش else در کدها نداریم.
بهترین روش آموزش زبان پایتون
بهترین روش آموزش برای هر شخصی، به مدل یادگیری و روحیه آن شخص وابسته است. روشهای مختلفی از جمله کلاسهای حضوری و آنلاین، یادگیری خودآموز با کمک کتابها و فیلمهای آموزشی و غیره وجود دارند که هر کدام مزایا و معایب خاص خود را دارند. در این میان، یکی از روشهای تقریبا موثر در همه اشخاص استفاده از فیلمهای آموزشی است. فیلمهای آموزشی امتیازهای برجستهای دارند که آنها را از سایر گزینهها برتر میکند. برای مثال، میتوان به استفاده همزمان حواس بینایی و شنیداری در هنگام آموزش، امکان تکرار تماشای فیلمها به دفعات و غیره اشاره کرد.
فرادرس هم به عنوان بهترین و بزرگترین تولید کننده محتوای آموزشی در کشور، فیلمهای بسیار خوبی در حوزههای مختلف تولید کرده است. یکی از حوزههای مورد علاقه فرادرس و مخاطبانش، حوزه تکنولوژی و کامپیوتر است. زبان برنامهنویسی پایتون هم به عنوان شاخه مهمی از همین علوم شناخته میشود. یادگیری پایتون با کمک فیلمهای فرادرس یکی از بهترین انتخابهای ممکن است. در پایین، چند مورد از فیلمهای آموزشی سطح متوسط و پیشرفته پایتون را معرفی کردهایم.
استفاده از عبارت elif برای بررسی چند شرط
عبارتهای elif رابطه تنگاتنگی با دستور if در پایتون دارند و برای بررسی صحت چندین عبارت شرطی مختلف بهکار برده میشوند. بلوکهای کدها elif بعد از بلوکهای کد if و قبل از بلوک اختیاری کد else به کدهای برنامه افزوده میشوند. اگر شرط درون بلوک if برقرار نبود – خروجی Flase برگرداند – عبارت مشخص شده در اولین بلوک elif ارزیابی خواهد شد. اگر شرط مشخص شده برای این بلاک هم برقرار نبود، سراغ شرط مشخص شده در دومین بلوک elif میرویم. به همین ترتیب بلوکهای elif را یکی پس از دیگری ارزیابی میکنیم تا یکی از شرایط برقرار شود یا به انتهای کدهای بخش شرطی این قسمت از برنامه برسیم.
در نتیجه کدهای نوشته شده در بلوک elif فقط به شرطی اجرا میشوند که شروط همه بلوکهای قبل از آن با نتیجه False روبهرو شده باشند. به این صورت، فقط یکی از شاخههای مشخص شده در عبارت if اجرا خواهند شد.
1if condition:
2 if_body()
3elif other_condition:
4 elif_body()
5elif another_condition:
6 another_elif_body()
7else:
8 else_body()
در جدول زیر، به طور خلاصه توضیح دادهایم که هر کدام از انواع مختلف عبارتهای شرطی چندبار قابل رویدادن هستند.
عبارت | تعداد استفاده |
if | دقیقا یکبار |
elif | هیچ، یک یا چندبار |
else | هیچ یا یکبار |
از ساختار شرطی «if-else» در پایتون چگونه استفاده می شود؟
مانند همه زبانهای برنامه نویسی، دستور if در پایتون بخشی بنیادین از این زبان است و به همین صورت هم روشهای مختلفی برای استفاده از این دستور وجود دارند. در این بخش و بخشهای بعدی مطلب، چند نمونه رایج را به عنوان مثال نمایش خواهیم داد. همچنین بهترین روش استفاده و چند اشباه رایج در بهکار بردن این الگو را نمایش دادهایم.
دستورات شرطی یکی از مهمترین و بنیادیترین ابزارها در پایتون هستند. تسلط بر این دستورات به برنامهنویسان کمک میکند تا برنامههای قدرتمند و انعطافپذیری بنویسند که بر اساس شرایط مختلف، بتوانند رفتارهای متفاوتی از خود نشان دهند. با مشاهده فیلم آموزش رایگان دستورات شرطی در پایتون – دستور else و if – با جادی از فرادرس تا حد قابل قبولی بر تکنیکهای استفاده از این دستورات مسلط میشوید. لینک مربوط به این فیلم آموزشی را در پایین نیز قرار دادهایم.
روش صحیح استفاده از دستور if در پایتون
در ابتدا نگاهی به روش کار شرط در عبارتهای تصمیمگیری خواهیم داشت. هر شرطی در ابتدا به عنوان عبارت بولی تفسیر میشود و سپس مقدار True یا False برمیگرداند. این مسئله به معنای این است که برنامهنویس دیگر نیاز ندارد به صورت مسقیم مقادیر بولی بدست آمده را از بابت برابری با یکدیگر مقایسه کند.
در کد زیر، روش ساده کدنویسی مطلب بیان شده در بالا را نمایش دادهایم.
1if expression == True:
2 ...
کدهای نوشته شده در بالا باعث برگشتن خطا نمیشوند، اما میتوانند ظاهر غیرحرفهای از کدهای برنامه را نمایش دهند. برنامهنویسان باتجربه و حرفهای از کد زیر بهجای کدهای بالا استفاده میکنند.
اکنون در کادر زیر به مثالی از الگوی کدنویسی بد انجام شده، نگاه میکنیم. فرض کنیم که اگر عدد داده شده فرد باشد، تابع is_odd() مقدار True را برمیگرداند. در غیر این صورت مقدار False برگشت داده میشود.
1if is_odd(number) == True:
2 print("The number is odd.")
در مثال بالا، چه اتفاقی خواهد افتاد اگر کد با استفاده از عدد فردی اجرا شود؟ عبارت is_odd(number) == True به صورت عبارت True == True ارزیابی خواهد شد. که به نوبه خود به صورت عبارت True ارزیابی میشود. در نتیجه بدنه دستور if اجرا خواهد شد. شاید بتوانید در این برنامه افزونگی کد – کدهای زائد نوشته شده – را مشاهده کنید. این کد، بسیار زیباتر خواهد شد اگر عملگر «==» را حذف کرده و فقط از مقدار بولی برگشت داده شده توسط تابع is_odd() استفاده کنیم.
در کادر زیر، شکل تمیزتر کد بالا را پیادهسازی کردهایم.
1if is_odd(number):
2 print("The number is odd.")
اجرای کدهای اختیاری با کمک دستور if در پایتون
فرض کنیم که بلوکی از کدها را با شرایط و اهداف مختلف در اختیار داریم. این خطوط کد یکی پس از دیگری اجرا خواهند شد. اما در این کدها، بخش خواصی فقط وقتی اجرا میشود که شرط مشخصی محقق شود. برای پیادهسازی کردن چنین حالتی، فقط نیاز به استفاده از عبارت if داریم. در کد زیر، حالت بیان شده در بالا را با مثالی درباره روند عادی ثبت نام کاربر نمایش دادهایم.
1def register_user(user_data, do_newsletter_signup = False):
2 # create user account
3 user_account = create_account(user_data)
4 # sign up for newsletter — only if requested by user
5 if do_newsletter_signup:
6 signup_newsletter(user_account)
7 # send confirmation mail
8 send_confirmation_mail(user_account)
استفاده از ساختار «if-else» پایتون برای تمایز بین دو مورد مختلف
برنامههای کامپیوتری، معمولا مجبور به انتخاب از بین دو مورد جمعناپذیر باهم هستند. یعنی از بین شرایطی که ممکن نیست همزمان روی دهند، باید یکی را انتخاب کنند. اگر فقط دو حالت خروجی ممکن وجود داشته باشد، استفاده از ساختار «if-else» فکر بسیار خوبی است. در این حالت، اگر شرطی درست باشد، برنامه مسیری را برای ادامه کار خود انتخاب میکند. به همین صورت اگر شرط مشخص شده نادرست باشد، هم مسیر دیگری برای ادامه کار برنامه انتخاب خواهد شد. در این حالت، هیچ گزینه دیگری نمیتواند وجود داشته باشد.
1def is_of_age(person, age_limit = 18):
2 if person.age >= age_limit:
3 print("You're old enough")
4 else:
5 print("Sorry, wait some more")
استفاده از ساختار «if-else» پایتون برای تمایز بین چند مورد جمع ناپذیر
اگر در فضای کاری برنامه، امکان روی دادن بیش از دو حالت جمعناپذیر وجود داشته باشد، استفاده از عبارتهای elif برای مدیریت شرایط به برنامهنویس کمک میکند. اضافه کردن else به انتهای دستور if نیز به مدیریت سایر مواردی کمک میکند که برای برنامهنویس ناشناخته است. در زمان اجرای کدها ممکن است که چنین موارد خاصی ظاهر شوند.
در مثال زیر، نامهای کامل هر کشور را بر اساس کدهای مختصر شده آنها به هر کدام اختصاص میدهیم.
1def get_country_from_code(country_code):
2 if country_code == 'US':
3 country = "United States"
4 elif country_code == 'MX':
5 country = "Mexico"
6 elif country_code == 'CA':
7 country = "Canada"
8 elif country_code == 'GB':
9 country = "Great Britain"
10 elif country_code == 'CN':
11 country = "China"
12 else:
13 country = None
14 return country
بعضی وقتها بهتر است زنجیره elif بخشی از تابع شود تا اینکه از چندین عبارت مستقل if استفاده کنیم. با این روش میتوان از اختصاص دادن غیر ضروری مقادیر به صورت چند مرحلهای دوری کرد. با کمک عبارت return در پایتون، از تابع، خارج میشویم. خروج از تابع همراه با نتیجه بدست آمده از یکی از شرایط صحیح انجام میشود. بهجای استفاده از else در انتهای کدها، عبارت نهایی return قرار داده شده است. این عبارت فقط وقتی در دسترس قرار میگیرد که هیچ کدام از شرایط تعیین شده درست نباشند.
1def get_country_from_code(country_code):
2 if country_code == 'US':
3 return "United States"
4 if country_code == 'MX':
5 return "Mexico"
6 if country_code == 'CA':
7 return "Canada"
8 if country_code == 'GB':
9 return "Great Britain"
10 if country_code == 'CN':
11 return "China"
12 return None
زنجیرههای تخصیص elif الگوی شناخته شدهای برای زبانهای برنامهنویسی قدیمیتر هستند. در پایتون معمولا سادهتر است که از تکنیک جستوجوی دیکشنری استفاده کنیم. هر کدام از نامها را میتوان به صورت مستقیم به کد کشور مربوط به همان نام اختصاص داد.
این فرایند اختصاص نامها به کد را در ساختاری به نام دیکشنری در پایتون تعریف میکنیم. سپس با استفاده از هر کد به سادگی میتوان نام مربوط به آن کشور را استخراج کرد.
در این حالت هم بهجای اینکه در انتهای زنجیره elif -ها از دستور else استفاده کنیم، میتوان از متد get() یکپارچه شدهای استفاده کرد. این متد، مقدار پیشرفرضی را به عنوان پارامتر دوم خود میپذیرد.
در کدهای زیر، روش بیان شده بالا را پیادهسازی کردهایم.
1def get_country_from_code(country_code):
2 countries = {
3 'US': "United States",
4 'MX': "Mexico",
5 'CA': "Canada",
6 'GB': "Great Britain",
7 'CN': "China",
8 }
9 country = countries.get(country_code, None)
10 return country
استفاده از دستور if برای بررسی وجود داده در شیء
پایتون از نوع زبانهای برنامهنویسی است که به صورت قدرتمند و خودکار میتواند به متغیرها نوعدهی کند. یعنی نوع داده هر متغیر را به صورت خودکار در زمان اجرا تشخیص داده و به آن اختصاص دهد. پایتون حتی در طول زمان اجرا میتواند این نوع را نیز تغییر دهد. نوع دادهها وابسته به مقادیر درون متغیر است و نه خود متغیر. علاوه بر مقادیر حقیقی که شامل True و False میشود، پایتون شامل مفاهیم ارزشهای truthy و falsy نیز است.
این مسئله به معنای آن است که شرایط تعیین شده در دستور if در پایتون، لازم نیست که حتما به صورت صریح به True و False منتهی شوند. مقادیری از سایر نوعها هم میتوانند به عنوان نتایج شرطها مورد استفاده قرار بگیرند. در چنین موردی، این مقادیر مانند مقادیر بولی و البته با استفاده از مجموعه قوانین خاصی تفسیر میشوند.
نکته مهم: هر شیء میتواند برای دستیابی به «صحت مقدار» (truthy) مورد آزمایش قرار بگیرد. یعنی لازم نیست که دقیقا برابر با True باشد. در نتیجه هر شی قابل استفاده در شرط if یا while و حتی به عنوان عملوندی از عملیات بولین هست. زیرا هر شیء به عنوان مقدار True در نظر گرفته میشود، مگر اینکه کلاس آن شیء، متد __bool__() را تعریف کرده باشد، به طوری که مقدار False برگرداند. یا از متد __len__() استفاده کرده باشد که مقدار صفر «0» را برمیگرداند.
نوع داده Boolean برای کار بر روی محاسبات جبر بولی ساخته شده و امروزه کاربرد بسیار گستردهای در کامیپوترها پیدا کرده است. برای آشنایی با نوع داده Boolean، پیشنهاد میکنیم که مطلب Boolean چیست؟ نوع داده بولی به زبان ساده را از مجله فرادرس مطالعه کنید.
از الگوی زیر میتوانیم برای بررسی وجود هر دادهای درون اشیا استفاده کنیم.
1text = ''
2if not text:
3 print("No text given")
نکته: اشیا زیر در فضای بولی با مقدار False ارزیابی میشوند. در نتیجه به عنوان غیر صحیح در نظر گرفته میشوند.
شیء | توضیح |
False و None | ثابتهایی که به عنوان False تعریف شدهاند. |
0 و 0.0 و Decimal(0) و Fraction(0, 1) و غیره | اعدادی که نمایانگر عدد صفر هستند. |
” و () و [] و {} و set() و range(0) | توالیها و مجموعه دادههای خالی |
در کادر زیر، مثال دیگری را با استفاده از لیست خالی پیادهسازی کردهایم.
1books_in_library = []
2if not books_in_library:
3 print("Library is empty")
تمام سایر اشیاء با مقدار True ارزیابی میشوند.
1number = 42
2if number:
3 print("Number exists")
تغییر وضعیت بولین ها با استفاده از بلاک «if-else» در پایتون
از بلاک «if-else» میتوان برای سوئیچ کردن به جلو و عقب بین دو عبارت غیرقابل جمع نیز استفاده کرد. ایده پشت سر این قضیه، چیزی شبیه به روشن و خاموش کردن چراغ است. برای مثال میتوانیم تابعی تعریف کنیم که برای تغییر وضعیت چراغ از روشن به خاموش یا برعکس استفاده میشود.
1def toggle_light(light):
2 if light == 'on':
3 return 'off'
4 else:
5 return 'on'
شاید از قبل به آن توجه کرده باشید که برای انجام اینکار راه سادهتری نیز وجود دارد. اگر حالت را بهجای استفاده از مقدار رشتهای با مقدار بولی – true یا false – نشان دهیم، دیگر نیازی به استفاده از عبارت if نداریم. در عوض استفاده از این ساختار میتوانیم از عملگر منطقی NOT استفاده کرده تا بین مقادیر true و false سوئیچ کنیم.
1def toggle(boolean):
2 return not boolean
حل مسائل if تودرتو در پایتون با استفاده از دستور return
یکی از تمرین بسیار رایج برنامهنویسی به این شکل است که بلوک خاصی از کدها را بهشرطی اجرا کنیم که چندین شرط در کنار یکدیگر محقق شده باشند. این مسئله معمولا برنامهنویسان مبتدی را مجبور به استفاده از دستورات if به صورت تودرتو میکند. اما معمولا نوشتن کدهای تودرتو به این صورت، شکل بدی دارد. زیرا استفاده از این تکنیک دنبال کردن کدها را سختتر کرده و به همین ترتیب نگهداری از کدها نیز بسیار مشکلتر میشود.
در ادامه به مثالی در اینباره توجه میکنیم. فرض کنید که باید تابعی را با هدف سنجش صلاحیت اشخاص برای شرکت در انتخابات، تعریف کنیم. در ابتدا بررسی میکنیم که آیا این شخص دارای شماره ملی است یا نه. بعد از آن باید سن فرد را بررسی کنیم. یعنی اینکه آیا شخص مورد نظر به سن قانونی برای رای دادن رسیده است یا نه. در بخش پایین، ظاهر این تابع را که با استفاده از عبارتهای تودرتوی if پیادهسازی شده، میتوان مشاهده کرد.
1def person_can_vote(person, voting_age = 18):
2 if person.has_id():
3 if person.get_age() >= voting_age:
4 return True
یکی از مشکلات این روش کدنویسی، این است که مهمترین بخش کد، همان عمیقترین بخش نهفته در عبارتهای تودرتو است. برای اینکه از استفاده عبارتهای if تودرتو دوری کنیم، میتوانیم از دستور return به صورت بلافاصله استفاده کنیم. بر اساس این رویکرد در تابع طراحی شدهمیتوانیم به صورت سریع و از اولین قدمها برقرار بودن شرطها را بررسی کنیم. اگر یکی از شرایط محقق نشده باشد، با استفاده از دستور return از تابع خارج میشویم.
در بخش زیر، تابع مربوط به تشخیص صلاحیت رای دهندگان را با استفاده از عبارتهای return پیوسته، بازنویسی کردهایم. در چنین حالتی معمولا مجبور به بازنویسی شرایط تعیین شده به شکل معکوس میشویم. برای انجام اینکار، داشتن دانش پایهای درباره نوع داده بولی در پایتون میتواند بسیار مفید باشد. اگر هیچ کدام از شرایط معکوس شده محقق نشوند، در آن صورت تابع مقدار True برمیگرداند.
1def person_can_vote(person, voting_age = 18):
2 if not person.has_id():
3 return False
4 if person.age < voting_age:
5 return False
6 # if we made it this far, the person can vote
7 return True
ساده سازی و جایگزینی عبارت های if در پایتون با استفاده از عملگرهای منطقی
همانطور که در بالا دیده میشود، اغلب لازم میشود که چندین شرط مختلف را بررسی کنیم. در شکل حرفهای بررسی شرطهای مختلف، ترجیح داده میشود که انجام این کار بدون استفاده از عبارتهای if به صورت تودرتو انجام شود. در کدهای پایین، مثال دیگری را مشاهده میکنیم که به مسئله بررسی صلاحیت رای دهندگان پرداخته است. توجه کنید که در صورت استفاده از عبارتهای if به صورت تودرتو، کد جواب به شکل نمایش داده شده در پایین خواهد بود.
1if has_id(person):
2 if is_adult(person):
3 print("You may vote")
در هنگام نوشتن این کد، رویکرد کمی هوشمندانهتر شامل استفاده از عملگرهای منطقی میشود. از آنجا که میخواهیم درستی هر دو شرط مطرح شده را بررسی کنیم، میتوانیم از عملگر AND استفاده کنیم. در نتیجه فقط به یکی از عبارتهای if احتیاج خواهیم داشت.
1if has_id(person) and is_adult(person):
2 print("You may vote")
با کمک جدول زیر مرور کلی بر عملگرهای منطقی پایه در پایتون میکنیم.
عملگر منطقی | معنی | سینتکس پایتون |
AND | اگر همه شرایط صحیح باشند، مقدار True به بیرون برگشت داده میشود. | and |
OR | اگر حداقل یکی از شرایط هم صحیح باشد، مقدار True به بیرون برگشت داده میشود. | or |
NOT | مقدار حقیقی بدست آمده از عبارت را معکوس کرده و به بیرون برگشت میدهد. | not |
از عملگرهای منطقی میتوان برای جایگزی کلی دستور if در پایتون نیز استفاده کرد. برای مثال در زمان تنظیم کردن مقادیر پیشفرض از این عملگرها استفاده میشود.
فرض کنیم که برنامهای نوشته شده است و در آن برنامه، کاربر برای انجام خریدهای خود به گزینه انتخاب ارز مورد استفاده دسترسی دارد. در این برنامه دلار آمریکا با علامت USD به عنوان ارز پیشفرض در نظر گرفته شده است. این برنامه را میتوان مانند کدهای موجود در کادر زیر پیادهسازی کرد.
1# user didn’t choose a currency
2currency = None
3...
4# further down in the program flow
5if not currency:
6 # set default if value missing
7 currency = 'USD'
در این مورد میتوانیم از عملگر منطقی OR به جای عبارت شرطی if استفاده کنیم. در کد زیر، اگر کاربر ارزی را برای استفاده در درون برنامه انتخاب نکند، به صورت خودکار مقدار USD به متغیر ارز اختصاص داده میشود.
1# user didn’t choose a currency
2currency = None
3...
4# further down in the program flow
5# set default if value missing
6currency = currency or 'USD'
در کد بالا دقیقا چه اتفاقی میافتد؟ مشاهده میکنید که در خط آخر به متغیر currency مقدار جدیدی اختصاص داده شده است. برای انجام اینکار، عبارت «currency or ‘USD’ » ارزیابی شده است. در ابتدای کار، عملگر منطقی OR عبارت سمت چپ -یعنی در این مورد « currency » – را ارزیابی میکند. در مثال بالا و در خط اول کدها به متغیر currency ، مقدار None اختصاص داده شده است. بنابراین مقدار این متغیر با ارزش False ارزیابی میشود. این مسئله به معنی این است که عبارت قرار گرفته در سمت راست – در این مثال «USD » – ارزیابی خواهد شد و به عنوان مقدار برگشت داده شده برای اختصاص به متغیر currency به کار برده میشود.
عملگر شرطی و سه تایی «if-else» در پایتون
تا الان بر روی کاربردهای مربوط به تصمیمگیری با استفاده از عبارتهای «if-else» در پایتون تمرکز کرده بودیم. اما از دستور «if-else» میتوان به عنوان عملگر شرطی نیز استفاده کرد. به این نوع از عملگرها «عملگر سهتایی» (Ternary Operator) گفته میشود. این نوع عملگر برای اجرای ماموریت تشخیص بین دو مقدار ممکن بهکار برده میشود.
در ابتدا نگاهی به روش انجام اینکار با استفاده از عبارت «if-else» خواهیم داشت. کد پایین، یکی از واحدهای فارنهایت یا سلسیوس را به عنوان مقیاس محاسبه دما تنظیم میکند. البته این تنظیم بسته به این است که آیا کل سیستم بر روی مقیاس متریک تنظیم شده است یا نه.
1if system == 'metric':
2 unit = 'C'
3else:
4 unit = 'F'
هرچند این کد را میتوان با استفاده از عملگر شرطی به شکل بسیار سادهتری نیز نوشت.
1unit = 'C' if system == 'metric' else 'F'
همینطور که از نام آن قابل تشخیص است، عملگر سهتایی سه عملوند مختلف میپذیرد، دو مقدار و یک عبارت. این عبارت برای تعیین شرط عملگر بهکار برده میشود.
نوع عملگر | توضیح | مثال |
Unary | این عملگر فقط یک عملوند میپذیرد. | عملگر not ، این عملگر همراه با عملوندی از جنس بولی بهکار برده میشود. |
Binary | این عملگر دو عملوند میپذیرد. | عملوند راست + عملوند چپ |
Ternary | این عملگر سه عملوند میپذیرد. | مقدار اول اگر شرط برقرار باشد در غیر این صورت مقدار دوم |
جایگزینی if-else به کمک match case
عبارت «Match-Case» توسط پایتون ۳٫۱۰ معرفی شده است. عبارتهای «Match-Case» همانند عبارتهای «Switch-Case» در سایر زبانهای برنامه نویسی هستند. عبارتهای «Switch-Case» در سایر زبانها برای از بین بردن ساختارهای طولانی «if-elif-else»بهکار برده میشوند.
استفاده از عبارتهای «Match-Case» جزو تکنیکهای پیشرفته کدنویسی پایتون است. اما این تکنیکها شامل موارد بسیار جالبتر و متنوعتری نیز میشوند. برای اینکه با تکنیکهای پیشرفته کدنویسی پایتون آشنا شوید، میتوانید فیلم آموزش برنامه نویسی پایتون پیشرفته درباره ترفندهای Python را از فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک این فیلم را در ادامه نیز قرار دادهایم.
به این دلیل که عبارتهای «Switch-Case» اغلب اوقات مستعد روبهرو شدن با خطا هستند، طراحان پایتون هیچ وقت این الگو را به زبان برنامه نویسی پایتون وارد نکردند. در عوض، پایتون از عبارتهای «Match-Case» استفاده میکند. این عبارتها نزدیک به ساختار «عملکرد تطبیق الگو» (Pattern Matching Functionality) هستند که از زبانهای تابعی مانند Haskell وام گرفته شده است. عبارتهای «Match-Case» کارکرد و انعطافپذیری بسیار بیشتری نسبت به عبارتهای سنتی «Switch-Case» از خود نشان میدهند.
در کدهای زیر، اصول پشت ساختار «Match-Case» را با کمک مثالی نمایش دادهایم. فرض کنید که میخواهیم دادههای مردم را با شکلهای مختلفی پردازش کنیم. هر شخص میتواند فقط با نام خود معرفی شود یا به شکل دیکشنری شامل سن و نام یا حتی در تاپلی که شامل نام کوچک و نام خانوادگی او است.
1# the name 'Jack'
2person1 = 'Jack'
3# just a name
4person2 = 'John'
5# name and age in a dict
6person3 = {'name': 'Jim', 'age': 42}
7# name in a dict, but no age
8person4 = {'name': 'Walter', 'email': '[email protected]'}
9# tuple of first and last name
10person5 = ('Walter', 'White')
الان باید، تابعی ایجاد کنیم که به هر شخص در سه شکل مختلف خوشامدگویی میکند. همراه با تابع isinstance() از ساختار «if-elif-else» نیز استفاده میکنیم تا بین شکلهای مختلف خوشامدگویی تفاوت قائل شویم. همچنین عملگر AND را برای بررسی چندین شرط مختلف بهکار میبریم. علاوه بر موارد بیان شده، از عبارت «if-else» به صورت تودرتو نیز استفاده خواهیم کرد. هرچند نتیجه تولید شده نهایی شاید به میزان خوبی شفاف نباشد.
1def greet_person(person):
2 if isinstance(person, str):
3 if person == 'Jack':
4 print('Jack himself has arrived')
5 else:
6 print(f"Hi there, {person}")
7 elif isinstance(person, dict) and 'name' in person and 'age' in person:
8 print(f"It's, {person['name']}. Born {person['age']} years ago")
9 elif isinstance(person, dict) and 'name' in person:
10 print(f"It's {person['name']}")
11 elif isinstance(person, tuple) and len(person) == 2:
12 first, last = person
13 print(f"Hello, {first} {last}")
14 else:
15 print('Not sure what kind of person this is')
کد نوشته شده در بالا را میتوان با استفاده از عبارت «Match-Case» به صورت بسیار تمیزتر و زیباتری پیادهسازی کرد. در این روش میتوان ساختار شکلهای مختلف خوشامدگویی را به صورت مستقیم توصیف کرد. همینطور میتوان مقادیر مجزا را به عنوان متغیر استخراج کرد. در نتیجه کد بسیار شفافتر، با پیچیدگی کمتر و خواناتر میشود.
1def match_person(person):
2 match person:
3 case 'Jack':
4 print('Jack himself has arrived')
5 case str() as name:
6 print(f"Hi there, {name}")
7 case {'name': name, 'age': age}:
8 print(f"It's, {name}. Born {age} years ago")
9 case {'name': name}:
10 print(f"It's {name}")
11 case (first, last):
12 print(f"Hello, {first} {last}")
13 case _:
14 print('Not sure what kind of person this is')
فیلم های پروژه محور فرادرس برای یادگیری پایتون
وبسایت فرادرس یکی از بزرگترین و غنیترین منابع فیلمهای آموزشی به زبان فارسی است و تقریبا در تمام رشتههای علمی، صنعتی، تحصیلی و غیره فیلمهای آموزشی بسیار با کیفیتی را تهیه کرده. از سوی دیگر، زبان برنامهنویسی پایتون هم به یکی از محبوبترین و رایجترین زبانهای مورد استفاده و پر طرفدارترین دورههای آموزشی تبدیل شده است. بنابراین فرادرس تلاش کرده تا بهترین فیلمهای آموزشی را درباره زبان پایتون تولید و منتشر کند. یکی از بهترین روشهای آموزشی، آموزش همراه با اجرای پروژههای مورد استفاده در دنیای واقعی است. به همین جهت در فرادرس فیلمهای آموزشی پروژه محور زیادی در ارتباط با زبانهای برنامهنویسی مختلف از جمله پایتون تهیه شدهاند.
در ادامه، چند مورد فیلم مربوط به آموزشهای پروژهمحور زبان پایتون را معرفی کردهایم. در صورت تمایل با کلیک بر روی تصویر زیر میتوانید به صفحه اصلی این مجموعه آموزشی هدایت شده و فیلمهای پروژهمحور بیشتری را نیز تماشا کنید.
مشکلات رایج در زمان استفاده از دستور if در پایتون و راه حل ها
حتی با داشتن بهترین شناخت از دستور if در پایتون، ممکن است که با چند مشکل رایج در زمان نوشتن کدها روبهرو شویم.
در این بخش به بررسی این مشکلات و راه حل آنها در کنار بهترین روشهای بهینهسازی این عبارات آشنا میشویم.
خطاهای مربوط به سینتکس
یکی از رایجترین خطاها در زمان کار با عبارات شرطی مانند دستور if، خطاهای سینتکس است. این مسئله میتواند شامل فراموش کردن استفاده از نماد دو نقطه «:» در پایان دستور if یا استفاده غیر صحیح از دندانهگذاری باشد. همیشه به یاد داشته باشید که پایتون برای دستهبندی بلوکهای کد از دندانهگذاری استفاده میکند.
1x = 10
2if x > 5
3 print('x is greater than 5')
4
5# Output:
6# SyntaxError: invalid syntax
در مثال بالا، استفاده از دو نقطه را در انتهای دستور فراموش کردهایم. در نتیجه با خطای سینتکس روبهرو شدهایم. برای برطرف کردن این مشکل، فقط کافیست که در انتهای خط اول از دستور if نماد دو نقطه «:» را قرار بدهیم.
خطاهای منطقی
مشکل رایج دیگری که در زمان کدنویسی با آنها روبهرو میشویم، خطاهای منطقی هستند. درحالی که کدهای نوشته شده بدون هیچ خطایی اجرا میشوند، اما نتایج مورد انتظار را تولید نمیکنند. این مسئله اغلب میتواند به دلیل استفاده از شرط نادرست در دستور if در پایتون روی دهد.
1x = 10
2if x < 5:
3 print('x is greater than 5')
4
5# Output:
6# (No output)
نکات مهم بهینه سازی
وقتی که از دستور if در پایتون استفاده میکنیم، روش خوب این است که کدهای خود را با محتملترین شرط شروع کنیم. از آنجا که پایتون شرطها را به ترتیب و یک به یک بررسی میکند و به محض رسیدن به شرط درست، کار را متوقف میکند، انجام این کار کدهای نوشته شده را کارآمدتر میکند. با این کار در زمان پردازش صرفهجویی میشود. این صرفهجویی زمانی به طور خاص در زمان کار با پایگاه های داده بزرگ بهچشم میآید.
در حالی که استفاده از عبارت if در پایتون ممکن است شامل مشکلات رایج زیادی برای افراد مبتدی باشد، اما شناخت این مشکلات و راه حلهای آنها نیز میتواند به برنامهنویسان در نوشتن کدهای بهتر و کارآمدتر کمک کند.
جمعبندی
با کمک این مطلب در مجله فرادرس، نگاه عمیقی به دنیای دستور if در پایتون انداختهایم. از پایهایترین کاربردها تا سناریوهای پیچیده را بررسی کرده و دیدیم که این ابزار بنیادین کدنویسی چگونه کار میکند و چگونه میتوان از آن به صورت کارآمدتری استفاده کرد. دستور if در پایتون ابزاری چندکاره و قدرتمند در جعبه ابزار مورد استفاده برنامهنویسان است. با کمک این ابزار شرطهای خاصی را بررسی کرده و در صورت برقرار بودن هر کدام، عکسالعمل مشخص شدهای را اجرا میکنیم.
با کمک این دستور میتوان کدهای پیچیدهای را با استفاده از عملگرهای شرطی و مقایسهای و حتی به صورت تودرتو پیادهسازی کرد. همچنین آموختیم که چگونه با استفاده از عبارتهای elif و else در ترکیب با دستور if ساختارهای تصمیمگیری پیچیدهتری را نیز پیادهسازی کنیم. مشکلات رایج در زمان استفاده از دستور if را بررسی کرده و راهحلهای هر کدام را نیز بیان کردیم. فرقی نمیکند که در چه سطح مهارتی از برنامهنویسی باشیم، استفاده صحیح از دستور if در پایتون، کیفیت و کارآمدی کدهای نوشته شده را تا حد بسیار خوبی ارتقا میدهد.
source