Table of Contents
مقدمه
در این بخش روی اشتباههایی تمرکز میکنیم که تقریباً همهٔ تازهکارها هنگام کار با شرطها (if / elif / else) مرتکب میشوند. هدف این است که آنها را ببینید، دلیلشان را بفهمید و یاد بگیرید چطور از آنها دوری کنید.
۱. استفاده از `if`های جدا بهجای `elif`
یکی از رایجترین اشتباهها این است که بهجای زنجیرهٔ if / elif / else، چند if جداگانه نوشته میشود.
مثال اشتباه:
age = 20
if age < 18:
print("کمتر از ۱۸")
if age < 30:
print("کمتر از ۳۰")
else:
print("۳۰ یا بیشتر")در این کد:
- اگر
age = 20باشد: - شرط اول (
age < 18) اجرا نمیشود. - شرط دوم (
age < 30)Trueاست، پس"کمتر از ۳۰"چاپ میشود. elseمربوط بهifدوم است، نهifاول؛ و چون شرط دومTrueبود،elseاجرا نمیشود.
اما خیلیها انتظار دارند ساختار بالا مثل if / elif / else عمل کند. حالت درست:
age = 20
if age < 18:
print("کمتر از ۱۸")
elif age < 30:
print("کمتر از ۳۰")
else:
print("۳۰ یا بیشتر")
نکتهٔ کلیدی:
وقتی فقط یکی از چند حالت باید رخ دهد، از if / elif / else استفاده کنید، نه چند if جداگانه.
۲. اشتباه در تورفتگی (indentation) شرطها
تورفتگی اشتباه باعث میشود بخشهایی از کد درون شرط قرار بگیرند یا بیرون آن، بدون اینکه متوجه شوید.
مثال اشتباه:
score = 90
if score >= 60:
print("قبول شدید")
passed = True
print("تبریک! شما قبول شدید.")در نگاه اول ممکن است فکر کنید چاپ خط آخر هم وابسته به شرط است؛ اما نیست. این خط همیشه اجرا میشود، چه قبول شده باشید چه نه.
حالت صحیح (اگر میخواهید پیام تبریک فقط برای قبولشدهها باشد):
score = 90
if score >= 60:
print("قبول شدید")
passed = True
print("تبریک! شما قبول شدید.")نکتهها:
- همیشه با دقت به فاصلهٔ ابتدای خطوط نگاه کنید.
- اگر از ویرایشگر یا IDE استفاده میکنید، از نمایش کاراکترهای فاصله / تب کمک بگیرید.
- یکدست از «۴ فاصله» یا فقط Tab استفاده کنید (ترجیحاً ۴ فاصله).
۳. قاطی کردن `=` و `==`
در شرطها باید مقایسه کنید، نه مقداردهی.
=برای مقداردهی به متغیر است.==برای مقایسه برابر بودن است.
مثال اشتباه (این کد اصلاً اجرا نمیشود و خطای نحوی میدهد):
x = 5
if x = 10: # اشتباه
print("x برابر ۱۰ است")حالت درست:
x = 5
if x == 10:
print("x برابر ۱۰ است")
الگو برای بهخاطر سپردن:
«یک مساوی برای گذاشتن مقدار در متغیر، دو مساوی برای پرسیدن مقدار متغیر.»
۴. استفاده از عملگر انتساب داخل شرط بهجای قبل از آن
گاهی مبتدیان سعی میکنند همزمان مقدار بدهند و شرط بنویسند، شبیه بعضی زبانهای دیگر:
# اشتباه رایج (از زبانهای دیگر الهام گرفته)
if is_raining = True:
print("چتر بردار")این در پایتون مجاز نیست و خطای نحوی میدهید. ابتدا مقداردهی کنید، بعد شرط:
is_raining = True
if is_raining == True:
print("چتر بردار")یا حتی کوتاهتر (و پایتونیتر):
if is_raining:
print("چتر بردار")۵. مقایسهٔ غیرضروری با `True` و `False`
مبتدیان معمولاً اینطور مینویسند:
is_logged_in = True
if is_logged_in == True:
print("خوش آمدید")این کار میکند، اما در پایتون رایج نیست و گاهی باعث گیجی میشود. روش بهتر:
if is_logged_in:
print("خوش آمدید")و برای حالت منفی:
if not is_logged_in:
print("لطفاً وارد شوید")اشتباه رایج دیگر:
if is_logged_in == False:
print("لطفاً وارد شوید")
این هم کار میکند، اما ناخواناتر است. در عوض از not استفاده کنید.
۶. سوءبرداشت از «درست و نادرست» بودن مقادیر
در شرطها، فقط True و False نیستند که بهعنوان «درست / نادرست» عمل میکنند. در پایتون:
- صفرها (
0,0.0) و لیست / رشته خالی ([],"",{}) بهعنوانFalseدر نظر گرفته میشوند. - بقیهٔ عددها و رشتههای غیرخالی معمولاً
Trueهستند.
این موضوع میتواند باعث رفتار غیرمنتظره شود اگر ندانید.
مثال:
name = ""
if name:
print("سلام", name)
else:
print("نام وارد نشده است")
چون name رشتهٔ خالی است، شرط if name در واقع False میشود و else اجرا میشود.
اشتباه رایج:
count = 0
if count:
print("چیزی وجود دارد")
else:
print("هیچ چیزی نیست")
چون count = 0 است، شرط if count معادل if 0 است و False در نظر گرفته میشود. خیلیها انتظار دارند شرط if count با خود عدد کار کند، در حالیکه اینجا فقط «صفر یا غیرصفر» مهم است.
اگر میخواهید «عدد صفر نبودن» را تست کنید، بهتر است صریح باشید:
if count != 0:
print("چیزی وجود دارد")۷. استفاده از رشتهٔ اشتباه برای `True` و `False`
خیلیها بهاشتباه از "True" و "False" (بهصورت رشته) استفاده میکنند:
is_admin = "True" # اشتباه از نظر طراحی
if is_admin:
print("شما مدیر هستید")
این کد همیشه پیام را چاپ میکند، چون هر رشتهٔ غیرخالی (مثل "True" و حتی "abc") در شرط معادل True است.
بهتر است از مقادیر بولی واقعی استفاده کنید:
is_admin = True # مقدار بولی
if is_admin:
print("شما مدیر هستید")یا اگر ورودی کاربر را به صورت متن گرفتهاید، آن را به بولی تبدیل کنید:
answer = input("آیا مدیر هستید؟ (yes/no): ")
is_admin = (answer == "yes")
if is_admin:
print("شما مدیر هستید")۸. شرطهای غیرقابلرسیدن (Unreachable)
گاهی زنجیرهای از شرطها نوشته میشود که یکی از آنها هیچوقت نمیتواند اجرا شود.
مثال:
age = 20
if age > 18:
print("بزرگسال")
elif age > 10:
print("نوجوان")
elif age > 5:
print("کودک")در اینجا:
- اگر
age > 18باشد، اولین شرط اجرا میشود و بقیه اصلاً بررسی نمیشوند. - اگر
ageبین ۱۱ تا ۱۸ باشد، شرط دوم اجرا میشود. - شرط سوم (
age > 5) فقط زمانی بررسی میشود که شرطهای قبلیFalseشوند.
اشتباه رایج: گذاشتن شرطی که همیشه توسط شرطهای قبلی «پوشش» داده شده است، مثلاً:
if age > 5:
...
elif age > 10:
...
شرط دوم در این مثال هیچوقت اجرا نمیشود، چون اگر age > 10 باشد، یعنی حتماً age > 5 هم هست و در نتیجه شرط اول قبلاً True شده است.
نکته: ترتیب قرار دادن شرطها مهم است. از «خاصتر» به «عمومیتر» یا از «بزرگتر» به «کوچکتر» (یا برعکس، ولی یکدست) فکر کنید.
۹. استفاده از چند `if` مستقل وقتی فقط یک حالت باید فعال باشد
گاهی لازم است چندین شرط را بررسی کنید که مستقل از هم هستند؛ در این حالت استفاده از چند if مشکلی ندارد.
اما اشتباه زمانی است که منطق شما میگوید «فقط یکی از این حالتها باید رخ دهد»، ولی بهجای elif، چند if میگذارید و بیش از یک پیام چاپ میشود.
مثال اشتباه:
score = 85
if score >= 90:
print("عالی")
if score >= 70:
print("خوب")
if score >= 50:
print("قبول")
else:
print("مردود")
اگر score = 85 باشد، خروجی:
"خوب""قبول"
ممکن است فقط یکی از اینها را انتظار داشته باشید. در این حالت باید از elif استفاده کنید:
score = 85
if score >= 90:
print("عالی")
elif score >= 70:
print("خوب")
elif score >= 50:
print("قبول")
else:
print("مردود")۱۰. اشتباه در استفاده از عملگرهای منطقی (`and`, `or`, `not`)
خطای منطقی در ترکیب شرطها با and و or بسیار رایج است.
۱۰.۱. استفادهٔ نادرست از `or`
مثال اشتباه:
color = "red"
if color == "red" or "blue": # اشتباه
print("قرمز یا آبی")بسیاری فکر میکنند این یعنی «اگر رنگ قرمز یا آبی بود»، ولی در واقع شرط به این صورت تفسیر میشود:
(color == "red") or ("blue")
و چون "blue" یک رشتهٔ غیرخالی است، همیشه True است؛ پس شرط همیشه True خواهد بود.
حالت درست:
if color == "red" or color == "blue":
print("قرمز یا آبی")یا خواناتر:
if color in ["red", "blue"]:
print("قرمز یا آبی")۱۰.۲. استفادهٔ نادرست از `and` و بازهها
مثال اشتباه:
age = 20
if 18 <= age <= 30 and 30:
print("بین ۱۸ و ۳۰ سال")چیزی که معمولاً میخواهند این است:
if 18 <= age <= 30:
print("بین ۱۸ و ۳۰ سال")پایتون اجازهٔ نوشتن این نوع مقایسهٔ زنجیرهای را بهصورت مستقیم میدهد (از ویژگیهای مفید پایتون).
۱۱. شرطهای تکراری و کد تکراری
گاهی همان بلاک کد را در چند شاخهٔ شرط تکرار میکنیم، در حالیکه میتوانیم سادهتر بنویسیم.
مثال:
age = 20
if age >= 18:
print("خوش آمدید")
print("سیستم برای شما باز است")
else:
print("شما اجازه ورود ندارید")
print("سیستم برای شما باز است")
در اینجا جملهٔ "سیستم برای شما باز است" در هر دو شاخه تکرار شده، در حالیکه میشود آن را بیرون از شرط آورد:
age = 20
if age >= 18:
print("خوش آمدید")
else:
print("شما اجازه ورود ندارید")
print("سیستم برای شما باز است")نکتهٔ مهم: این اشتباه فقط خوانایی کد را پایین نمیآورد؛ بلکه شانس اشتباه کردن در تغییرات بعدی را زیاد میکند.
۱۲. قرار ندادن `else` وقتی لازم است
بعضی وقتها فقط if مینویسید و فراموش میکنید حالت «در غیر این صورت» را هم پوشش دهید. این همیشه اشتباه نیست، ولی میتواند منجر به حالتهای ناخواسته شود.
مثال:
age = 15
if age >= 18:
discount = 0.1
print("تخفیف:", discount)
اگر age < 18 باشد، متغیر discount اصلاً تعریف نشده و این کد خطا میدهد. شما احتمالاً انتظار دارید که برای زیر ۱۸ سال، تخفیف 0 باشد.
حالت امنتر:
age = 15
if age >= 18:
discount = 0.1
else:
discount = 0
print("تخفیف:", discount)یا حتی امنتر: مقدار پیشفرض قبل از شرط:
age = 15
discount = 0 # مقدار پیشفرض
if age >= 18:
discount = 0.1
print("تخفیف:", discount)۱۳. شرطهای خیلی پیچیده در یک خط
مبتدیان گاهی همهٔ منطق را در یک شرط بلند و پیچیده مینویسند، که هم احتمال اشتباه را زیاد میکند و هم خوانایی را کم.
مثال:
if (age > 18 and age < 60 and country == "IR" and is_student == False) or (age > 65 and country == "IR" and is_student == False):
print("شرایط شما پذیرفته است")
اینجا بهسختی میتوان فهمید دقیقاً چه اتفاقی میافتد و کوچکترین اشتباه در and/or کل منطق را خراب میکند.
راه بهتر: شکستن شرط به چند قسمت معنادار:
is_adult = (18 < age < 60)
is_elder = (age > 65)
in_iran = (country == "IR")
not_student = (not is_student)
if (is_adult or is_elder) and in_iran and not_student:
print("شرایط شما پذیرفته است")
یا اگر هنوز پیچیده است، منطق را در چند if و elif جدا کنید.
۱۴. فراموش کردن `:` بعد از شرط
اشتباه بسیار رایج نحوی:
age = 20
if age >= 18 # دو نقطه فراموش شده
print("بزرگسال")در این حالت، پایتون پیامی مثل «expected ':'» میدهد. همیشه بهخاطر داشته باشید:
- بعد از
if،elifوelseباید:بگذارید. - همینطور بعد از
while,for,def,classو غیره.
نمونهٔ درست:
if age >= 18:
print("بزرگسال")۱۵. استفاده از `input()` مستقیم در شرط بدون تبدیل نوع
در کار با شرطها و ورودی کاربر، فراموش کردن تبدیل نوع، منبع خطای بسیار رایجی است.
مثال اشتباه:
age = input("سن خود را وارد کنید: ")
if age >= 18: # اشتباه: age یک رشته است
print("بزرگسال")
این کد یا خطا میدهد، یا در پایتون نسخههای خاص رفتار عجیبی خواهد داشت، چون age از نوع str است و با عدد قابل مقایسه نیست.
حالت درست: تبدیل به عدد (این موضوع در فصل ورودی/خروجی بهتفصیل آمده، اینجا فقط به اشتباه آن اشاره میکنیم):
age = int(input("سن خود را وارد کنید: "))
if age >= 18:
print("بزرگسال")۱۶. عدم پوشش حالتهای خاص (Edge Cases)
گاهی شرطها را برای حالتهای معمولی مینویسیم و موارد مرزی (مثل صفر، رشته خالی، مقدار مساوی با حد، و …) را فراموش میکنیم.
مثال:
score = 60
if score > 60:
print("قبول")
else:
print("مردود")اگر قانون شما این است که «۶۰ هم قبولی است»، این کد اشتباه است، چون فقط بیشتر از ۶۰ را قبول کردهاید. باید بنویسید:
if score >= 60:
print("قبول")
else:
print("مردود")برای جلوگیری از این اشتباه:
- همیشه حالتهای «مرزی» را ذهنی یا روی کاغذ تست کنید (مثلاً دقیقاً ۰، دقیقاً ۱۰۰، رشته خالی، حدّ پایین و بالا، و …).
- چند مقدار نمونه را زیر کد یادداشت کنید و با خودتان مرور کنید که کدام شاخهٔ شرط برای آنها اجرا میشود.
جمعبندی
در کار با شرطها، بیشتر مشکلها از «اشتباه منطقی» میآید، نه از خود دستور if. برای پرهیز از این خطاها:
- از
if / elif / elseبهدرستی و بهجا استفاده کنید. - به تورفتگیها و جای
:دقت کنید. - فرق
=و==و نوعهای بولی را خوب در ذهن نگه دارید. - شرطها را بیش از حد پیچیده نکنید؛ آنها را به بخشهای ساده و قابلفهم بشکنید.
- همیشه چند مقدار نمونه (بهخصوص حالتهای مرزی) را در ذهن یا با اجراکردن کد، امتحان کنید.
با تمرین و نوشتن مثالهای زیاد، چشمتان به این اشتباهها عادت میکند و بهمرور خودتان آنها را به سرعت پیدا و اصلاح خواهید کرد.