برنامهها برای تصمیمگیری نیاز به «اگر… وگرنه…» دارند؛ یعنی بسته به یک شرط، قطعهای از کد اجرا شود یا نشود. در زبان پایتون این کار را با سه دستور ساده در پایتون انجام میدهیم:
- دستور if برای «اگر»،
- دستور elif برای «اگر نه، ولی…»،
- دستور else برای «در غیر این صورت».
با چند مثال روزمره – مثل چک کردن رمز، دادن نمره یا تشخیص وضعیت ورود کاربر – یاد میگیریم چطور این سه را کنار هم بچینیم. بعد میبینیم چه چیزهایی در پایتون «درست» (True) یا «غلط» (False) به حساب میآیند، چطور شرطها را با and، or و not ترکیب کنیم و در نسخههای تازهتر پایتون با ویژگی جذاب match-case آشنا شویم.
دستور if در پایتون
مهم ترین دستور شرطی در پایتون، if است. این دستور به معنای “اگر” بوده و اجازه میدهد یک بلوک کد تنها در صورت برقرار بودن یک شرط اجرا شود. ساختار کلی if به شکل زیر است:
if شرط_منطقی:
# کدهایی که در صورت درست بودن شرط اجرا میشوند
هنگام استفاده از if باید به تورفتگی (indentation) دقت کنید. در پایتون برخلاف برخی زبانهای دیگر، بلاکهای کد با فاصلهی تورفتگی مشخص میشوند نه براکت؛ بنابراین خطهایی که قرار است در صورت برقرار بودن شرط اجرا شوند، باید یک سطح تورفتگی (۱ tab یا ۴ space) نسبت به خود دستور if جلوتر باشند. اگر شرط موجود در if برقرار (True) باشد، کدهای داخل بلاک اجرا میشوند و اگر شرط برقرار نباشد، آن بلاک نادیده گرفته شده و اجرای برنامه از بعد از بلاک شرطی ادامه مییابد.
برای مثال، کد زیر را در نظر بگیرید که تعیین میکند یک عدد مثبت است یا خیر:
x = 5
if x > 0:
print("عدد مثبت است")
در این مثال، شرط x > 0 بررسی میکند آیا مقدار متغیر x بزرگتر از صفر است یا خیر. اگر این شرط True باشد (که برای x = 5 برقرار است)، تابع print پیامی را چاپ میکند. در صورتی که شرط برقرار نباشد (مثلاً اگر x = -3 باشد)، بدنهی if اجرا نمیشود و برنامه بدون چاپ چیزی به پایان میرسد.
نکته: اگر لازم باشد هیچ کاری در صورت برقرار بودن شرط انجام نشود (به عبارتی بلاک شرطی خالی بماند)، نمیتوان آن را کاملاً خالی رها کرد چون از لحاظ قواعد نگارشی (syntax) زبان پایتون خطاست. در این مواقع میتوانید از دستور pass استفاده کنید که کاری انجام نمیدهد اما وجود آن باعث میشود خطای سینتکسی ایجاد نشود:
if condition:
pass # هیچ عملی انجام نمیشود
elif و else در پایتون
دستور if به تنهایی زمانی کاربرد دارد که فقط یک حالت “اگر (شرط درست بود) آنگاه … ” داشته باشیم. اما در بسیاری از مواقع نیاز داریم چندین حالت و شرط را پشت سر هم بررسی کنیم. در پایتون برای این منظور از elif و else در کنار if استفاده میشود. کلمهی کلیدی elif (مخفف “else if”) به معنی “در غیر این صورت اگر … است . با elif میتوان پس از یک if اولیه، شرایط اضافی را بررسی کرد. همچنین else به معنی “در غیر این صورت” برای حالتی به کار میرود که هیچیک از شرطهای قبل برقرار نباشند.
ساختار کلی ترکیبی به این صورت است:
if شرط_اول:
... # بلاک اجرا اگر شرط اول درست باشد
elif شرط_دوم:
... # بلاک اجرا اگر شرط اول غلط و شرط دوم درست باشد
elif شرط_سوم:
... # بلاک اجرا اگر هیچیک از شروط قبل درست نباشند و شرط سوم درست شود
...
else:
... # بلاک اجرا درصورتی که هیچ شرطی درست نباشد
در این ساختار میتوانیم صفر، یک یا چندین elif داشته باشیم و وجود بخش else نیز اختیاری است. اجرای کد به این ترتیب است که ابتدا شرط if بررسی میشود؛ اگر True بود، همان بلاک اجرا شده و کل ساختار شرطی خاتمه مییابد. اگر False بود، سراغ شرط بعدی در elif میرود و به همین ترتیب تا زمانی که یکی از شروط برقرار شود. در صورتی که هیچکدام از شرطهای if و elif برقرار نشوند، بلاک else (در صورت وجود) اجرا خواهد شد. با این روش میتوان سناریوهای چندراهی را مدیریت کرد.
به عنوان نمونه، برنامهی زیر یک عدد را از کاربر دریافت کرده و دربارهی آن تصمیمگیری میکند:
x = int(input("یک عدد صحیح وارد کنید: "))
if x < 0:
print("عدد منفی است")
x = 0
print("مقدار x به 0 تغییر یافت")
elif x == 0:
print("عدد صفر است")
elif x == 1:
print("عدد یک است")
else:
print("عدد بزرگی است")
در این مثال، چند حالت مختلف برای مقدار x در نظر گرفتهایم. ابتدا اگر x کمتر از صفر بود، پیام “عدد منفی است” چاپ میشود و سپس به عنوان مثال مقدار متغیر x را به ۰ تغییر میدهیم و اعلام میکنیم (دو خط در بلاک if اجرا شدند). اگر شرط اول برقرار نبود، برنامه سراغ elif x == 0 میرود؛ در صورت True شدن آن، پیام “عدد صفر است” چاپ میشود. در غیر این صورت سراغ elif بعدی میرود و اگر x == 1 بود پیام مربوطه را نمایش میدهد. نهایتاً اگر هیچیک از شرایط قبل برقرار نشد، بخش else اجرا شده و میگوید عدد بزرگ (غیر از موارد خاص بالا) است. به این ترتیب تمام حالات ممکن پوشش داده میشوند.
نکته : در بسیاری زبانها (مثل C یا جاوا) برای چنین شرایط چندگانهای از ساختاری به نام switch-case استفاده میکنند. از نسخه ۳.۱۰ به بعد پایتون سازوکار پیشرفتهتری به نام match-case را معرفی کرده است).
مثالهای if در پایتون
برای درک بهتر کاربرد ساختارهای شرطی، در این بخش چند مثال واقعی را بررسی میکنیم که هر یک سناریوی متفاوتی را نشان میدهد:
مثال ۱: تصمیمگیری ساده: فرض کنید میخواهیم براساس سن کاربر تصمیم بگیریم که پیغام مناسبی نمایش دهیم. اگر کاربر زیر ۱۸ سال باشد، پیغام “دسترسی محدود است” نشان دهیم و اگر ۱۸ سال یا بیشتر باشد، پیغام “دسترسی کامل است” را نشان دهیم:
age = 17
if age < 18:
print("دسترسی شما محدود است.")
else:
print("شما دسترسی کامل دارید.")
در اینجا فقط یک شرط کافی بود و با if و else حالت کمتر و بیشتر از ۱۸ سال را پوشش دادیم. برای سن ۱۷، شرط age < 18 درست میشود و خروجی بخش if اجرا میگردد. اگر متغیر age مثلاً ۱۸ بود، شرط False شده و بخش else فعال میشد.
مثال ۲: محاسبهٔ نمره: برنامهای را در نظر بگیرید که نمرهی یک دانشآموز را گرفته و بر اساس آن نتیجه را اعلام میکند. اگر نمره >= 90 بود پیغام “عالی”، اگر >= 70 بود “خوب”، اگر >= 50 بود “قبول” و در غیر این صورت “مردود” نمایش دهد:
score = 85
if score >= 90:
print("نتیجه: عالی")
elif score >= 70:
print("نتیجه: خوب")
elif score >= 50:
print("نتیجه: قبول")
else:
print("نتیجه: مردود")
با اجرای این کد برای score = 85، شرط اول False میشود (چون 85 بزرگتر مساوی 90 نیست)، اما شرط دوم score >= 70 True است و بنابراین پیام “خوب” چاپ خواهد شد. سایر شروط بررسی نخواهند شد. توجه کنید که ترتیب قرارگیری شرطها مهم است؛ در مثال بالا شرطها را از بازههای بالاتر به پایینتر نوشتهایم تا هر عدد در اولین دستهی متناسب خود قرار بگیرد.
مثال ۳: بررسی وضعیت لاگین کاربر: فرض کنیم متغیری به نام is_logged_in داشته باشیم که نشاندهنده وضعیت ورود کاربر است (True اگر کاربر وارد شده باشد و False اگر نشده باشد). همچنین متغیر دیگری به نام is_admin داریم که True بودن آن به معنای ادمین بودن کاربر است. میخواهیم با ترکیب این دو شرط، پیغام مناسبی نمایش دهیم:
is_logged_in = True
is_admin = False
if not is_logged_in:
print("لطفاً اول وارد حساب شوید.")
elif is_admin:
print("خوش آمدید ادمین گرامی")
else:
print("خوش آمدید کاربر عزیز.")
در این کد ابتدا با if not is_logged_in بررسی میکنیم اگر کاربر وارد نشده باشد (is_logged_in == False)، پیغام درخواست لاگین نمایش داده شود. در غیر این صورت (کاربر وارد شده) با elif is_admin چک میکنیم که آیا ادمین است؟ اگر بله، پیغام مخصوص ادمین چاپ میشود. و اگر هیچکدام از آن دو حالت نبود (کاربر وارد شده اما ادمین نیست)، بخش else اجرا شده و پیغام خوشآمدگویی عادی نمایش مییابد. مثلا با مقادیر فرض شده در بالا، چون is_logged_in True است شرط اول رد میشود، سپس is_admin False است پس شرط دوم هم رد شده و نهایتاً else اجرا میشود.
مفهوم Truthy و Falsy در پایتون
در بخشهای قبل دیدیم که چگونه یک شرط Boolean تعیین میکند آیا بلاک مربوطه اجرا شود یا نه. اما در پایتون فقط خود مقدارهای صریح True و False نیستند که میتوانند در شرایط به کار روند؛ هر مقداری میتواند به True یا False تعبیر (ارزیابی) شود. به بیان دیگر، پایتون برخی مقادیر را در شرطها معادل False در نظر میگیرد (اصطلاحاً Falsy) و سایر مقادیر را معادل True (اصطلاحاً Truthy) در نظر میگیرد.
برای روشنتر شدن موضوع، به جدول زیر توجه کنید که چند نمونه از مقادیر و ارزشی که در یک شرط خواهند داشت را نشان میدهد:
مقایسهی مقادیر Truthy و Falsy در پایتون
| مقدار | نتیجه در شرط (Bool) |
|---|---|
| False | False (Falsy) |
| True | True (Truthy) |
| None | False (Falsy) |
| 0 (عدد صفر) | False (Falsy) |
| 5 (عدد غیرصفر) | True (Truthy) |
| 0.0 (عدد اعشاری صفر) | False (Falsy) |
| ۲- (عدد منفی غیرصفر) | True (Truthy) |
| "" (رشتهی خالی) | False (Falsy) |
| "hello" (رشتهی غیرخالی) | True (Truthy) |
| [] (لیست خالی) | False (Falsy) |
| [1, 2] (لیست دارای المان) | True (Truthy) |
| {} (دیکشنری خالی) | False (Falsy) |
| {"key": "value"} (دیکشنری پر) | True (Truthy) |
بنابراین اگر در یک شرط به جای عبارت منطقی، مستقیماً یک متغیر یا مقدار را قرار دهیم، پایتون بر اساس این قواعد تصمیم میگیرد که آیا بلاک مربوطه اجرا شود یا خیر. برای نمونه، به کد زیر توجه کنید:
name = ""
if name:
print("نام شما:", name)
else:
print("نامی وارد نشده است.")
متغیر name در اینجا یک رشته است. اگر کاربر نامی وارد نکند و این رشته خالی بماند، آنگاه شرط if name معادل False در نظر گرفته میشود (چون رشتهی خالی Falsy است) و بلاک else اجرا خواهد شد. اما اگر name حاوی یک رشتهی غیرخالی (مثلاً “Ali”) باشد، آنگاه شرط Truthy شده و بخش if اجرا میشود که نام را نمایش میدهد.
عملگرهای منطقی and، or و not در پایتون
گاهی در برنامهنویسی شرایطی پیش میآید که بررسی یک شرط بهتنهایی کافی نیست. برای مثال، ممکن است بخواهیم اطمینان حاصل کنیم که کاربر هم وارد سیستم شده باشد و هم مدیر باشد، یا اینکه بررسی کنیم کاربر یا مدیر است یا ناظر. در چنین موقعیتهایی، لازم است چند شرط را بهصورت ترکیبی بررسی کنیم.
پایتون برای ترکیب چند شرط از عملگرهای منطقی استفاده میکند. این عملگرها عبارتاند از:
- and برای زمانی که میخواهیم هر دو شرط برقرار باشند
- or برای زمانی که برقرار بودن یکی از شرطها کافی است
- not برای وارونه کردن نتیجهی شرط
با کمک این سه عملگر میتوان شرطهای پیچیدهتری ساخت و تصمیمگیریهای دقیقتری در برنامه انجام داد. در ادامه با هر یک از این عملگرها و کاربرد آنها بیشتر آشنا میشویم.
num = 14
if num > 10 and num % 2 == 0:
print("عدد بزرگتر از ۱۰ و زوج است.")
- در اینجا دو شرط با and ترکیب شدهاند. تنها در صورتی پیام چاپ میشود که هر دو بخش (num > 10 و num % 2 == 0) True باشند. برای num = 14 خروجی نمایش داده میشود، اما اگر num = 9 (کمتر از ۱۰) یا num = 15 (زوج نیست) بود، شرط مرکب False میشد و چیزی چاپ نمیشد.
- or (یا): زمانی که کافیست حداقل یکی از شرایط برقرار باشد از or استفاده میکنیم. نتیجهی A or B در صورت False شدن هر دو شرط False خواهد بود و در بقیهی حالات True میشود. مثلا برنامهای را در نظر بگیرید که میخواهیم اگر کاربر یا ادمین است یا ناظر، اجازهی دسترسی بدهیم:
is_admin = False
is_moderator = True
if is_admin or is_moderator:
print("دسترسی granted")
- not (نقیض): این عملگر تنها یک شرط را میگیرد و True را به False و برعکس تبدیل میکند. در واقع not A زمانی True است که خود A False باشد و بالعکس. از not معمولاً برای خواناتر کردن شرطها یا چک کردن حالت مخالف استفاده میشود. به عنوان مثال، در کدی که قبلاً دیدیم از if not is_logged_in بهره بردیم تا حالت “کاربر وارد نشده” را بررسی کنیم. یا مثال سادهتر:
logged_in = False
if not logged_in:
print("شما وارد سیستم نشدهاید")
- این شرط معادل logged_in == False است. اگر متغیر logged_in False باشد، به دلیل not این شرط True میشود و پیام خطا را نشان میدهد.
عملگرهای منطقی را میتوان برای ترکیب شرطهای پیچیدهتر هم به کار برد. به عنوان نمونه، فرض کنید بخواهیم عددی را چک کنیم که بین ۱۰ و ۲۰ باشد. میتوان نوشت:
x = 15
if x > 10 and x < 20:
print("عدد بین ۱۰ و ۲۰ است.")
یا معادل خلاصهتر در پایتون از زنجیره کردن مقایسهها استفاده کرد: if 10 < x < 20: که همان منطق بالا را دارد. در اینجا دو مقایسهی 10 < x و x < 20 صورت میگیرد و نتیجه فقط وقتی True است که هر دوی آنها True باشند. (پایتون این را به صورت ضمنی به یک and تبدیل میکند).
x = 15
print(10 < x < 20)
نکات پیشرفته دستور if در پایتون
در این بخش به چند نکته و ترفند پیشرفته پیرامون ساختارهای شرطی در پایتون اشاره میکنیم که برای کدنویسان حرفهای مفید است:مقایسه if با match-case در پایتون ۳.۱۰ به بعد
ساختار شرطی سنتی if/elif/else تقریباً هر نوع منطق تصمیمگیری را پوشش میدهد، اما با افزایش موارد elif ممکن است کد طولانی و کمخوانا شود. در نسخه ۳.۱۰ پایتون سازوکاری به نام Structural Pattern Matching معرفی شد که با استفاده از کلمات کلیدی match و case امکان پیادهسازی الگوهای تصمیمگیری پیچیدهتر و در عین حال مرتبتر را میدهد.به طور خلاصه، یک دستور match یک expression (عبارت) را گرفته و مقدار آن را با چندین الگو (pattern) که توسط بلوکهای case تعریف شدهاند مقایسه میکند. اولین الگویی که با مقدار دادهشده سازگار باشد اجرا میشود و اجرای match تمام میشود. اگر هیچ الگویی سازگار نبود، میتوان یک case _ (خط تیره زیر) به عنوان حالت پیشفرض (معادل else) تعریف کرد که در آن صورت اجرا میشود.حالت سادهی استفاده از match-case زمانی است که میخواهیم مقدار یک متغیر را با چند مقدار ثابت مقایسه کنیم (دقیقاً مشابه کاری که با چندین elif x == … انجام میدهیم. برای مقایسه، یک مثال ساده را در نظر بگیرید. دو کد زیر را مقایسه کنید که عملکرد یکسانی دارند؛ یکی با if/elif/else و دیگری با match-case نوشته شده است:
# روش سنتی با if/elif/else
def http_status_message(code):
if code == 400:
return "Bad request"
elif code == 404:
return "Not found"
elif code == 418:
return "I'm a teapot"
else:
return "Something's wrong with the internet"
# روش جدید با match-case (پایتون 3.10+)
def http_status_message(code):
match code:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
در نسخهی if/elif هر شرط مقدار code را با یک مقدار مقایسه میکند و در نهایت else حالت پیشفرض را برمیگرداند. در نسخهی match-case نیز همین منطق پیاده شده است اما به صورت ساختاریافتهتر: دستور match code مقدار code را گرفته و هر case یک حالت ممکن را توصیف میکند. علامت _ در آخر به معنای “سایر موارد” است که شبیه بخش else عمل میکند. هر دوی این پیادهسازیها رفتار یکسانی دارند و مثلاً برای code = 404 رشتهی “Not found” را برمیگردانند.
مزیت match-case زمانی بیشتر نمایان میشود که الگوهای پیچیدهتری بخواهیم تعریف کنیم. مثلاً میتوان چندین مقدار را در یک case با علامت | مشخص کرد (معادل or) یا حتی ساختار درونی یک شیء (مثل یک تاپل یا لیست) را به عنوان الگو قرار داد و اجزای آن را استخراج کرد. این کارها با if/elifهای تودرتو بهمراتب پیچیدهتر و طولانیتر خواهند بود.
# Constants for error codes
ERROR_NOT_FOUND = 404
ERROR_SERVER = 500
ERROR_UNAUTHORIZED = 401
ERROR_BAD_REQUEST = 400
def handle_error(code):
match code:
case ERROR_NOT_FOUND:
print("Error 404: Resource not found.")
case ERROR_SERVER:
print("Error 500: Internal server error.")
case ERROR_UNAUTHORIZED | ERROR_BAD_REQUEST:
print("Access issue: Please check your credentials or request format.")
case _:
print("Unknown error occurred.")
# Test examples
handle_error(404) # Output: Error 404: Resource not found.
handle_error(500) # Output: Error 500: Internal server error.
handle_error(401) # Output: Access issue: Please check your credentials or request format.
handle_error(999) # Output: Unknown error occurred.
if یک خطی در پایتون
گاهی فقط به یک تصمیم ساده نیاز داریم و میخواهیم نتیجه را مستقیماً در یک متغیّر ذخیره کنیم. در این حالت میتوان از عبارت شرطی یکخطی استفاده کرد- مثال۱: آیا کاربر میتواند به محتوا دسترسی داشته باشد؟
status = "access" if age >= 18 else "denied"
این خط یک متغیر status تعریف میکند که اگر age حداقل ۱۸ باشد مقدار “مجاز” یا access میگیرد و در غیر این صورت “غیرمجاز” یا denied. عبارت سهتایی فوق معادل همین کد با if/else معمولی است اما به صورت خلاصه در یک خط نوشته شده است. از این روش میتوان برای تعیین مقدار پیشفرض یا انتخاب بین دو گزینه بر اساس یک شرط استفاده کرد.
- مثال ۲ :تعیین پیام خوشآمد بر اساس وجود نام کاربر
فرض کنید میخواهیم اگر کاربر نامی وارد نکرده باشد، به جای آن واژهی «مهمان» نمایش داده شود. با استفاده از عبارت شرطی یکخطی میتوان این کار را در کوتاهترین حالت انجام داد:
user_input = "" # کاربر نامی وارد نکرده است
username = user_input if user_input else "مهمان"
print(f"سلام {username}!") # خروجی: سلام مهمان!
اگر user_input رشتهای غیرخالی باشد، همان مقدار در username قرار میگیرد.
در غیر این صورت (user_input تهی یا Falsy است)، عبارت پس از else یعنی “مهمان” ذخیره میشود.
- مثال ۳: محاسبهٔ هزینهٔ ارسال بر اساس مبلغ سبد خرید
اگر مجموع خرید کاربر به حدّ مشخصی برسد، ارسال رایگان میشود؛ در غیر این صورت مبلغ ثابتی برای ارسال دریافت میشود. با عبارت شرطی یکخطی، این منطق در یک خط اجرا میشود.
cart_total = 75 # مبلغ سبد خرید (هزار تومان)
shipping_cost = 0 if cart_total >= 100 else 20
print(f"هزینهٔ ارسال: {shipping_cost} هزار تومان")
در غیر این صورت مقدار ۲۰ هزار تومان برای هزینهٔ ارسال در نظر گرفته میشود.
شرطهای تو در تو (Nested if) در پایتون
برای تصمیمگیریهای لایهای میتوان چند if را درون یکدیگر قرار داد. مثال زیر یک عدد را ابتدا از نظر مثبت یا منفی بودن بررسی میکند و در صورت مثبت بودن، زوج یا فرد بودن آن را نیز مشخص میکند.
number = 12
if number >= 0: # لایهٔ نخست
print("عدد مثبت است.")
if number % 2 == 0: # لایهٔ دوم
print("و همچنین زوج است.")
else:
print("و همچنین فرد است.")
else:
print("عدد منفی است.")
- شرط بیرونی (number >= 0) مشخص میکند عدد مثبت است یا منفی.
- اگر عدد مثبت باشد، شرط درونی (number % 2 == 0) تنها در همین مسیر اجرا میشود تا زوج یا فرد بودن را تعیین کند.
- در صورت منفی بودن عدد، برنامه مستقیماً به بخش else بیرونی میرود و پیام مناسب را چاپ میکند.







