عبارات شرطی در پایتون
در واقع، در این درس عبارات شرطی در پایتون را از پایه و با مثال یاد میگیرید.
بنابراین در فصل قبل با گزارهها آشنا شدید. دیدید که هر گزاره یا درست است یا نادرست، و دیدید که میتوان گزارهها را با and و or و not به هم وصل کرد و گزارههای پیچیدهتری ساخت.
اما تا اینجا گزارهها فقط درست یا نادرست بودند و هیچ اتفاقی نمیافتاد. حالا وقت آن رسیده که از گزارهها استفاده کنیم تا برنامهمان تصمیم بگیرد.
همچنین، وقتی سر چهارراه میایستید، در ذهنتان یک گزاره میسازید: «چراغ سبز است.» اگر این گزاره درست باشد، حرکت میکنید. اگر نادرست باشد، منتظر میمانید. خودِ گزاره کاری نمیکند؛ آن چیزی که کار میکند، تصمیمی است که بر اساس گزاره میگیرید. در برنامهنویسی به این تصمیم، عبارت شرطی میگویند.
اولین شرط
به این ترتیب، در پایتون، شرط را با کلمهی کلیدی if مینویسیم. بعد از if یک گزاره میآید و بعد از گزاره، یک دونقطه.
light = "green"
if light == "green":
print("حرکت کن")علاوه بر این، این برنامه عبارت «حرکت کن» را چاپ میکند. حالا اگر مقدار light را به "red" تغییر دهید و دوباره اجرا کنید، هیچ چیزی چاپ نمیشود. برنامه خطا هم نمیدهد. فقط بیسروصدا از آن خط رد میشود.
در نهایت، این نکته را همین اول جا بیندازید: نتیجهی نادرست بودن یک شرط، خطا نیست. نتیجهاش اجرا نشدن است. بخش زیادی از باگهایی که بعدها با آنها روبهرو میشوید از همینجا میآیند؛ کدی که انتظار دارید اجرا شود، اجرا نمیشود و هیچ پیام خطایی هم در کار نیست.
تورفتگی در پایتون
در واقع، در کد بالا، خط print چهار فاصله از سمت چپ جلوتر شروع شده است. به این فاصله تورفتگی یا indentation میگویند.
بنابراین در بیشتر زبانهای برنامهنویسی، محدودهی یک شرط را با آکولاد مشخص میکنند. پایتون آکولاد ندارد و همین تورفتگی است که مشخص میکند کدام دستورها به شرط تعلق دارند.
light = "red"
if light == "green":
print("حرکت کن") # داخل شرط
print("سرعت را زیاد کن") # این هم داخل شرط
print("مراقب باش") # بیرون از شرطهمچنین، خروجی این برنامه فقط «مراقب باش» است. دو خط اول به شرط تعلق دارند و چون چراغ سبز نیست اجرا نمیشوند، ولی خط سوم که تورفتگی ندارد به شرط ربطی ندارد و همیشه اجرا میشود.
به این ترتیب، اندازهی تورفتگی را خودتان انتخاب میکنید، ولی باید در کل بلوک یکسان باشد. قرارداد رسمی جامعهی پایتون چهار فاصله است و بهتر است از همان اول به همین عادت کنید.
وقتی حالت دوم هم مهم است
علاوه بر این، تا اینجا فقط گفتیم اگر شرط درست بود چه کن. اما اغلب برای حالت نادرست هم برنامهای داریم. اینجا else به کار میآید.
light = "red"
if light == "green":
print("حرکت کن")
else:
print("صبر کن")در واقع، دقت کنید که else همسطح if نوشته میشود، نه تورفته. و بعد از else هیچ گزارهای نمیآید، چون else یعنی «در تمام حالتهای دیگر». همیشه دقیقاً یکی از این دو بلوک اجرا میشود؛ نه هر دو، نه هیچکدام.
بیش از دو راه
بنابراین چراغ راهنما فقط سبز و قرمز نیست. زرد هم هست. برای حالتهای میانی از elif استفاده میکنیم که کوتاهشدهی else if است.
light = "yellow"
if light == "green":
print("حرکت کن")
elif light == "yellow":
print("آماده شو")
elif light == "red":
print("صبر کن")
else:
print("چراغ خراب است")پایتون این شرطها را از بالا به پایین بررسی میکند و به محض اینکه به اولین گزارهی درست برسد، بلوک آن را اجرا میکند و بقیه را اصلاً نگاه نمیکند. این نکته را دستکم نگیرید؛ ترتیب نوشتن شرطها روی نتیجه اثر میگذارد.
به این نمونه نگاه کنید:
score = 95
if score >= 50:
print("قبول")
elif score >= 90:
print("عالی")نمره ۹۵ است ولی خروجی «قبول» چاپ میشود، نه «عالی». چون شرط اول درست بوده و پایتون دیگر سراغ شرط دوم نرفته است. قاعدهی ساده این است: شرطهای خاصتر را بالاتر بنویسید و شرطهای عامتر را پایینتر.
نقشهی اجرای شرط
مسیری که پایتون در یک زنجیرهی شرط طی میکند به این شکل است:
┌─────────────────┐
│ if <گزاره ۱> │
└────────┬────────┘
True │ False
┌────────────┴────────────┐
▼ ▼
┌───────────┐ ┌─────────────────┐
│ بلوک اول │ │ elif <گزاره ۲> │
└─────┬─────┘ └────────┬────────┘
│ True │ False
│ ┌────────────┴───────────┐
│ ▼ ▼
│ ┌───────────┐ ┌───────────┐
│ │ بلوک دوم │ │ else │
│ └─────┬─────┘ └─────┬─────┘
└────────────┴────────────────────────┘
▼
ادامهی برنامه
هر مسیر که انتخاب شود، در نهایت همه به یک نقطه میرسند و برنامه از آنجا به بعد ادامه پیدا میکند.
استفاده از گزارههای ترکیبی در شرط
هر چیزی که در فصل گزارهها یاد گرفتید، همینجا قابل استفاده است. جلوی if فقط یک مقایسهی ساده نمیآید؛ هر گزارهای که نتیجهاش True یا False باشد میتواند بیاید.
age = 22
has_ticket = True
if age >= 18 and has_ticket:
print("میتوانید وارد شوید")
else:
print("ورود ممکن نیست")دقت کنید که has_ticket خودش یک متغیر بولی است و لازم نیست بنویسید has_ticket == True. نوشتن == True غلط نیست ولی اضافه است و برنامهنویسان باتجربه این کار را نمیکنند.
پایتون یک امکان جالب هم دارد که در خیلی از زبانها نیست: مقایسهی زنجیرهای. به جای نوشتن این:
if age >= 18 and age < 30:
print("جوان")میتوانید دقیقاً همان کاری را بکنید که در ریاضی میکردید:
if 18 <= age < 30:
print("جوان")شرط داخل شرط
گاهی بعد از اینکه یک شرط برقرار شد، تازه سؤال بعدی مطرح میشود. در این حالت میتوانید یک شرط را داخل شرط دیگری بنویسید.
age = 22
has_ticket = False
if age >= 18:
if has_ticket:
print("میتوانید وارد شوید")
else:
print("سن شما مشکلی ندارد، ولی بلیت ندارید")
else:
print("ورود برای زیر ۱۸ سال ممنوع است")شرط داخلی یک سطح تورفتگی بیشتر دارد. این تودرتویی گاهی لازم است، مخصوصاً وقتی میخواهید برای هر حالت پیام متفاوتی بدهید. ولی حواستان باشد که هر سطح تودرتویی، خواندن کد را سختتر میکند. اگر دیدید سه سطح یا بیشتر تودرتو شدهاید، معمولاً میشود منطق را سادهتر نوشت.
عملگرهای مقایسهای که در شرطها لازم دارید
| نمونه | معنی | عملگر |
age == 18 | برابر است با | == |
age != 18 | برابر نیست با | != |
age > 18 | بزرگتر از | > |
age < 18 | کوچکتر از | < |
age >= 18 | بزرگتر یا مساوی | >= |
age <= 18 | کوچکتر یا مساوی | <= |
اشتباهات رایج
این سه خطا را تقریباً همهی کسانی که تازه شرطنویسی را شروع میکنند مرتکب میشوند. اگر از قبل بشناسیدشان، وقت کمتری برایشان تلف میکنید.
فراموش کردن دونقطه
if age >= 18
print("بزرگسال")پایتون این پیام را میدهد:
SyntaxError: expected ':'
نوشتن مساوی به جای مقایسه
if age = 18:
print("هجده ساله")خطایی که میگیرید:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
علامت = برای مقداردهی است و == برای مقایسه. خوشبختانه پایتون در نسخههای جدید خودش این اشتباه را حدس میزند و در پیام خطا یادآوری میکند.
جا انداختن تورفتگی
if age >= 18:
print("بزرگسال")و پیام خطا:
IndentationError: expected an indented block after 'if' statement on line 1
هر بلوک شرطی باید حداقل یک دستور در تورفتگی داشته باشد. اگر فعلاً نمیخواهید کاری در آن بلوک انجام دهید، از pass استفاده کنید تا پایتون خطا نگیرد.
جمعبندی
عبارت شرطی، همان جایی است که گزارههای فصل قبل به کار میآیند و برنامه از حالت خطبهخط خارج میشود و بین چند مسیر یکی را انتخاب میکند.
با if یک مسیر میسازید، با else مسیر دوم را اضافه میکنید و با elif هر تعداد مسیر میانی که لازم داشته باشید. تورفتگی مشخص میکند هر دستور به کدام شرط تعلق دارد و ترتیب نوشتن شرطها تعیین میکند کدامشان زودتر بررسی شود.
در درس بعدی سراغ موضوعی میرویم که تقریباً همه را در ابتدای کار غافلگیر میکند: مقایسهی اعداد اعشاری در شرطها. خواهید دید که چرا 0.1 + 0.2 == 0.3 در پایتون False است و چطور باید با این وضعیت کنار آمد.
برای مطالعهی بیشتر میتوانید به مستندات رسمی پایتون سر بزنید.
این درس بخشی از دوره آموزش پایتون مقدماتی است.