Table of Contents
ایدهٔ کلی شرطهای تو در تو
گاهی یک شرط ساده if / elif / else کافی نیست؛ چون تصمیم دوم شما به نتیجهٔ تصمیم اول وابسته است. در این حالت از شرطهای تو در تو استفاده میکنیم؛ یعنی یک if (یا elif / else) را داخل بلوک شرط دیگری قرار میدهیم.
به زبان ساده:
- اول یک شرط را بررسی میکنید،
- اگر آن شرط برقرار بود، درون همان بلوک شرطهای دیگری را بررسی میکنید.
ساختار کلی شرط تو در تو
الگوی کلی به این شکل است:
if شرط_اول:
# اگر شرط اول درست باشد
if شرط_دوم:
# این کد فقط اگر شرط اول و شرط دوم هر دو درست باشند اجرا میشود
else:
# این کد فقط اگر شرط اول درست و شرط دوم نادرست باشد اجرا میشود
else:
# این کد اگر شرط اول نادرست باشد اجرا میشودبه فاصلهها (تورفتگیها / indentation) دقت کنید:
- بلوک مربوط به
if شرط_اولیک سطح تورفتگی دارد. - شرط دوم
if شرط_دوموelseمربوط به آن، یک سطح دیگر تورفتگی دارند.
مثال ۱: سن و اجازهٔ رانندگی
فرض کنید میخواهیم وضعیت رانندگی یک نفر را بررسی کنیم:
- اگر زیر ۱۸ سال است: اجازهٔ رانندگی ندارد.
- اگر ۱۸ سال یا بیشتر است:
- اگر گواهینامه دارد: اجازهٔ رانندگی دارد.
- اگر گواهینامه ندارد: باید اول گواهینامه بگیرد.
age = int(input("سن خود را وارد کنید: "))
has_license = input("آیا گواهینامه دارید؟ (yes/no): ")
if age >= 18:
if has_license == "yes":
print("میتوانید رانندگی کنید.")
else:
print("سن شما کافی است، اما باید گواهینامه بگیرید.")
else:
print("سن شما برای رانندگی کافی نیست.")در این مثال:
- شرط اول:
age >= 18 - اگر درست باشد، تازه شرط دوم بررسی میشود:
has_license == "yes"
مثال ۲: نمره و وضعیت قبولی
فرض کنید:
- اگر نمره کمتر از ۱۰ باشد: مردود.
- اگر نمره بین ۱۰ تا ۲۰ باشد:
- اگر بالای ۱۷ باشد: ممتاز.
- در غیر این صورت: قبول عادی.
score = float(input("نمره را وارد کنید: "))
if score < 10:
print("مردود")
else:
if score >= 17:
print("قبول با رتبهٔ ممتاز")
else:
print("قبول")
اینجا شرط تو در تو داخل else قرار گرفته است؛ یعنی:
- اگر نمره کمتر از ۱۰ نباشد (پس ۱۰ یا بیشتر است)، وارد
elseمیشویم، - سپس درون آن، شرطهای دیگری روی همان مقدار بررسی میکنیم.
شرط تو در تو یا `elif`؟
خیلی وقتها میتوانید بهجای شرط تو در تو از elif استفاده کنید، و کد را خواناتر کنید.
مثال بالا را میتوان اینطور هم نوشت:
score = float(input("نمره را وارد کنید: "))
if score < 10:
print("مردود")
elif score >= 17:
print("قبول با رتبهٔ ممتاز")
else:
print("قبول")پس چه زمانی تو در تو منطقیتر است؟
- وقتی شرط دوم فقط در صورت درست بودن شرط اول معنی دارد.
- وقتی میخواهید مرحلهبهمرحله تصمیم بگیرید (مثل منوهای چند مرحلهای).
مثال ۳: انتخاب از منوی چندمرحلهای
یک مثال خوبِ کاربرد شرط تو در تو، منوهای چندمرحلهای است:
print("1. نوشیدنی گرم")
print("2. نوشیدنی سرد")
main_choice = input("انتخاب کنید (1 یا 2): ")
if main_choice == "1":
print("1. چای")
print("2. قهوه")
hot_choice = input("نوع نوشیدنی گرم را انتخاب کنید: ")
if hot_choice == "1":
print("شما چای انتخاب کردید.")
elif hot_choice == "2":
print("شما قهوه انتخاب کردید.")
else:
print("انتخاب نامعتبر برای نوشیدنی گرم.")
elif main_choice == "2":
print("1. آب")
print("2. آبمیوه")
cold_choice = input("نوع نوشیدنی سرد را انتخاب کنید: ")
if cold_choice == "1":
print("شما آب انتخاب کردید.")
elif cold_choice == "2":
print("شما آبمیوه انتخاب کردید.")
else:
print("انتخاب نامعتبر برای نوشیدنی سرد.")
else:
print("انتخاب نامعتبر در منوی اصلی.")اینجا:
- انتخاب نوع نوشیدنی گرم فقط وقتی معنی دارد که کاربر «نوشیدنی گرم» را انتخاب کرده باشد؛
- به همین دلیل، شرطهای مربوط به نوشیدنی گرم داخل بلوک
if main_choice == "1"نوشته شدهاند.
تورفتگی (Indentation) در شرطهای تو در تو
در شرطهای تو در تو، اشتباه در تورفتگیها خیلی رایج است. چند نکته:
- هر سطح جدید از تو در تو بودن، یعنی یک سطح تورفتگی بیشتر.
- در یک بلوک، تمام خطوط باید همسطح باشند.
- مخلوط کردن فاصله و تب (space و tab) میتواند مشکل ایجاد کند؛ معمولاً از ۴ فاصله برای هر سطح استفاده میشود.
مثال نادرست:
age = 20
if age >= 18:
print("بزرگسال") # خطا: تورفتگی ندارد
if age > 60:
print("سالمند")مثال درست:
age = 20
if age >= 18:
print("بزرگسال")
if age > 60:
print("سالمند")مثال ۴: چندین سطح تو در تو
میتوانید بیش از دو سطح تو در تو داشته باشید، اما خوانایی کد کم میشود. به مثال زیر دقت کنید:
username = input("نام کاربری: ")
password = input("رمز عبور: ")
if username == "admin":
if password == "1234":
print("ورود موفق")
confirm = input("آیا میخواهید تنظیمات را ببینید؟ (yes/no): ")
if confirm == "yes":
print("نمایش تنظیمات...")
else:
print("بازگشت به صفحهٔ اصلی")
else:
print("رمز عبور اشتباه است.")
else:
print("نام کاربری اشتباه است.")سطحها:
- بررسی نام کاربری
- اگر درست بود، بررسی رمز عبور
- اگر هر دو درست بودند، پرسیدن سؤال بعدی
این منطق بهترتیب اجرا میشود و هر مرحله به مرحلهٔ قبلی وابسته است، پس استفاده از شرط تو در تو منطقی است.
اشتباهات رایج در شرطهای تو در تو
چند خطای متداول:
۱. شرط تو در تو بدون نیاز واقعی
گاهی میتوان بدون تو در تو بودن، همان منطق را سادهتر نوشت:
# پیچیده و غیرضروری
if age >= 18:
if age >= 65:
print("بازنشسته")
else:
print("بزرگسال")
# سادهتر
if age >= 65:
print("بازنشسته")
elif age >= 18:
print("بزرگسال")۲. قرار دادن `else` در سطح اشتباه
اگر تورفتگی را اشتباه بزنید، else به شرط دیگری وصل میشود:
age = 20
if age >= 18:
if age > 60:
print("سالمند")
else:
print("کمتر از ۱۸ سال") # این else در واقع مربوط به if age > 60 است، نه if age >= 18
در این مثال، else اشتباه در سطح داخلی قرار گرفته است. نسخهٔ درست:
age = 20
if age >= 18:
if age > 60:
print("سالمند")
else:
print("کمتر از ۱۸ سال")یا با ساختار بهتر:
age = 20
if age < 18:
print("کمتر از ۱۸ سال")
elif age > 60:
print("سالمند")چه زمانی از شرط تو در تو استفاده کنیم؟
بهطور خلاصه، شرطهای تو در تو مناسباند وقتی:
- تصمیمها مرحلهبهمرحله گرفته میشوند،
- شرط دوم فقط وقتی معنی دارد که شرط اول برقرار باشد،
- در منوهای چندسطحی، فرمهای چندمرحلهای، یا پردازشهایی که حالت (وضعیت) سیستم را قدمبهقدم تغییر میدهند.
و بهتر است از شرط تو در تو پرهیز کنید وقتی:
- میتوانید با
elifمنطق را سادهتر و خواناتر کنید، - تعداد سطحهای تو در تو بیش از ۲–۳ سطح میشود و کد سخت خوانده میشود.
در ادامهٔ تمرینها و پروژهها، از شرطهای تو در تو در کنار حلقهها و ورودی کاربر استفاده خواهید کرد تا منوها و سناریوهای تعاملی بسازید.