درس آموزشی درس ۳ از ۵

شرط‌ها در پایتون

با if، elif و else یاد بگیر چطور به برنامه‌ات قدرت تصمیم‌گیری بدی؛ از مقایسه و عملگرهای منطقی تا شرط‌های تو در تو و پیدا کردن باگ‌های رایج، همه رو با مثال تمرین می‌کنیم.

مقدماتی ۲۹ دقیقه مطالعه بروزرسانی ۲۳ مهر ۱۴۰۵
فهرست این درس

ببین، تا اینجا یاد گرفتیم چطور با متغیرها در پایتون داده نگه داریم و با انواع داده در پایتون کار کنیم. اما یه برنامه واقعی همیشه قرار نیست همه خط‌ها رو پشت‌سرهم اجرا کنه. بعضی وقت‌ها باید تصمیم بگیره؛ مثلاً به دانشجویی که دوره رو خریده دسترسی بده، یا اگر پرداخت کامل نشده، پیام مناسب نشون بده. اینجاست که شرط در پایتون وارد ماجرا می‌شه.

توی این درس از صفر سراغ دستورات شرطی در پایتون می‌ریم: if، elif و else رو با مثال واقعی تمرین می‌کنیم، بعد چند باگ منطقی رو با هم پیدا می‌کنیم. قرار نیست فقط شکل نوشتن شرط‌ها رو حفظ کنی؛ می‌خوام خودت بفهمی برنامه چرا یک مسیر رو انتخاب کرده و مسیر دیگه رو نه.

Data
↓
Condition
↓
True / False
↓
Branch
↓
Action

مدل ذهنی شرط خیلی ساده‌ست: داده رو بررسی می‌کنی، نتیجه رو از نظر درست یا نادرست بودن می‌سنجی و با توجه به اون، یک مسیر اجرا می‌شه. مثلاً برای شروع آموزش if در پایتون لازم نیست وارد پروژه پیچیده بشیم؛ همین بررسی سن رو ببین.

age = 20

if age >= 18:
    print("Access granted")

خروجی برنامه، وقتی سن ۲۰ باشه:

Access granted

چون مقدار age برابر ۲۰ هست، مقایسه age >= 18 نتیجه درست می‌ده و دستور داخل if اجرا می‌شه. حالا خودت سن رو بذار ۱۶ و دوباره اجرا کن؛ هیچ پیامی چاپ نمی‌شه، چون در این مثال برای حالت نادرست مسیر جایگزینی ننوشته‌ایم. همین رفتار پایه شرط در پایتون و شیوه انتخاب شاخه‌هاست.

شرط در پایتون

شرط در پایتون چیه و چه کاری انجام می‌ده؟

در حالت عادی، پایتون دستورها رو به ترتیب اجرا می‌کنه. اما تصور کن قرار باشه یک کد تخفیف فقط برای خریدهای بالای مبلغ مشخص اعمال بشه. اجرای بی‌قیدوشرط اون دستور منطقی نیست. ساختار شرطی در پایتون بهت اجازه می‌ده چنین تصمیمی رو شفاف بنویسی؛ اول وضعیت رو می‌سنجی، بعد فقط دستورهای مربوط به همون وضعیت اجرا می‌شن.

حواست باشه اینجا داریم جریان اجرای برنامه رو کنترل می‌کنیم، نه اینکه صرفاً یک مقدار True یا False روی صفحه چاپ کنیم. شرط می‌تونه روی خروجی نهایی، دسترسی کاربر یا حتی ادامه کار یک برنامه اثر بذاره.

temperature = 31

if temperature > 30:
    print("It is hot")

print("Program finished")

چون دما بیشتر از ۳۰ هست، هر دو پیام چاپ می‌شن: یکی داخل بلوک شرط و یکی بیرون از اون. اگر دما رو کم کنی، فقط پیام آخر می‌مونه. این مثال یه نکته مهم داره: تورفتگی مشخص می‌کنه کد متعلق به کدوم شاخه‌ست؛ هر چیزی که بیرون از بلوک if نوشته شده، صرفاً به‌خاطر نادرست شدن شرط کنار گذاشته نمی‌شه.

آموزش if در پایتون؛ اولین دستور شرطی

برای نوشتن دستور شرطی در پایتون از ساده‌ترین شکل if در پایتون شروع می‌کنیم. این الگو رو ببین؛ condition و code_to_run در اینجا فقط اسم‌های نمونه‌ان، نه متغیرهای تعریف‌شده در برنامه تو.

if condition:
    code_to_run

اول عبارت شرطی رو می‌نویسی؛ بعد علامت : و در خط بعد دستورهایی که باید هنگام برقرار بودن شرط اجرا بشن. این دستورها باید تورفتگی داشته باشن. لازم نیست شرط حتماً خودش یک متغیر bool باشه؛ پایتون نتیجه عبارت رو از نظر Truth Value بررسی می‌کنه. حالا ساختار واقعی if در پایتون رو با نمره امتحان کنیم.

score = 18

if score >= 10:
    print("Passed")

برای نمره ۱۸، مقایسه score >= 10 درست می‌شه و Passed چاپ می‌شه. نمره ۹ رو هم امتحان کن؛ چون بلوک جایگزین نداریم، پیام چاپ نمی‌شه. توی اولین تمرین‌های شرط در پایتون بهتره همین تغییرهای کوچک رو انجام بدی تا رفتار کد رو با چشم خودت ببینی.

Indentation در شرط در پایتون چه نقشی داره؟

ببین، خیلی وقت‌ها برنامه‌نویس تازه‌کار منطق if رو درست فهمیده، ولی کدش به‌خاطر تورفتگی اجرا نمی‌شه. پایتون برای مشخص کردن بلوک‌ها از Indentation استفاده می‌کنه؛ یعنی فاصله ابتدای خط بخشی از ساختار زبانه، نه یک انتخاب ظاهری. نمونه بعدی عمداً اشتباه نوشته شده و خطای IndentationError می‌ده.

age = 20

if age >= 18:
print("Access granted")

برای درست کردنش، دستور print() رو یک سطح جلو می‌بریم تا داخل بلوک شرط قرار بگیره. حالا کد معتبره و می‌تونی بدون تغییر منطق اجراش کنی.

age = 20

if age >= 18:
    print("Access granted")

قرارداد رایج اینه که برای هر سطح تورفتگی از چهار فاصله استفاده کنیم. وقتی دو یا سه شرط تو در تو داری، این موضوع خیلی مهم‌تر می‌شه؛ چون مشخص می‌کنه هر دستور و هر else به کدوم بخش تعلق داره. پیشنهاد من اینه که از همون اول Tab و Space رو بی‌دلیل مخلوط نکنی و تورفتگی‌ها رو با ابزار ویرایشگرت یکدست نگه داری.

عملگرهای مقایسه‌ای برای ساخت شرط در پایتون

بخش بزرگی از عملگرهای شرطی در پایتون از مقایسه مقدارها شروع می‌شه. مثلاً می‌خوای ببینی سن از ۱۸ بیشتره، وضعیت حساب برابر blocked نیست یا قیمت داخل بودجه کاربر قرار می‌گیره. جدول پایین عملگرهایی رو نشون می‌ده که بیشتر باهاشون کار می‌کنی؛ از همین اول تفاوت = و == رو جدی بگیر.

عملگرمعنیمثال
==برابر بودن مقدارهاage == 18
!=نابرابر بودن مقدارهاstatus != "blocked"
>بزرگ‌تر بودنscore > 10
<کوچک‌تر بودنprice < 500000
>=بزرگ‌تر یا مساویage >= 18
<=کوچک‌تر یا مساویattempts <= 3

مثلاً فرض کن یک دانشجو برای خرید پکیج یک میلیون تومان بودجه داره و قیمت دوره کمتر از این مقداره. با یک مقایسه ساده می‌تونی بررسی کنی که خرید توی محدوده بودجه‌اش قرار می‌گیره یا نه.

price = 850000
budget = 1000000

if price <= budget:
    print("You can buy this course")

یادت باشه = برای مقداردهیه؛ یعنی یک اسم رو به مقدار وصل می‌کنی. اما == برای مقایسه برابریه. این تفاوت شاید ساده به نظر بیاد، ولی قاطی کردنشون از رایج‌ترین خطاهای شروع یادگیری دستورات شرطی در پایتون محسوب می‌شه.

آموزش if else در پایتون؛ وقتی شرط برقرار نیست

تا اینجا فقط می‌گفتیم «اگر شرط درست بود، این کار رو انجام بده». حالا اگر شرط درست نبود چی؟ برای همین حالت، if else در پایتون به کار میاد. با else مسیر جایگزین می‌سازی، بدون اینکه مجبور باشی همان شرط رو برعکسش کنی و دوباره بنویسی.

age = 16

if age >= 18:
    print("Access granted")
else:
    print("Access denied")

وقتی سن ۱۶ باشه، خروجی اینه:

Access denied

برای else شرط جداگانه نمی‌نویسی؛ این شاخه زمانی اجرا می‌شه که هیچ‌کدوم از شرط‌های قبلی همین زنجیره انتخاب نشده باشن. توی مثال سن، یا پیام پذیرش نمایش داده می‌شه یا پیام رد دسترسی. همین الگوی if در پایتون در حالت دوشاخه‌ای برای خیلی از کارهای ساده، از وضعیت پرداخت تا بررسی موجودی، کافیه.

آموزش elif در پایتون؛ تصمیم‌گیری بین چند حالت

وقتی انتخاب‌ها بیشتر از دو حالت باشن، نوبت elif در پایتون می‌رسه. فرض کن نمره دانشجو باید به یکی از سطح‌های A، B، C یا D تبدیل بشه. پایتون شرط‌ها رو از بالا به پایین بررسی می‌کنه و اولین شاخه‌ای که شرطش برقرار باشه اجرا می‌شه؛ بقیه شاخه‌های همان زنجیره دیگه بررسی نمی‌شن.

به همین دلیل ترتیب elifها فقط سلیقه نوشتاری نیست. اگه شرط عمومی رو زودتر بیاری، ممکنه یک شرط دقیق‌تر هیچ‌وقت فرصت اجرا پیدا نکنه.

score = 87

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "D"

print(grade)

برای مقدار ۸۷، خروجی برابر این حرفه:

B

چون نمره به ۹۰ نرسیده، شرط اول رد می‌شه؛ ولی شرط دوم، یعنی ۸۰ و بیشتر، برقرار می‌شه. پس حرف B چاپ می‌شه و برنامه دیگه سراغ شاخه C نمی‌ره. برای تمرین بیشتر elif در پایتون نمره رو ۷۲ یا ۹۵ بذار، خیلی راحت می‌بینی که ترتیب if و elif چطور نتیجه رو تعیین می‌کنه.

شرط در پایتون

تفاوت چند if مستقل با if / elif

این دو شکل شرط در پایتون رو رو با هم قاطی نکن. وقتی چند if مستقل می‌نویسی، هرکدوم جداگانه بررسی می‌شه و حتی ممکنه همه‌شون اجرا بشن. اما یک زنجیره if / elif / else فقط یک شاخه انتخاب می‌کنه. برای دسته‌بندی نمره‌ها، معمولاً همین تفاوت تعیین می‌کنه برنامه خروجی درست بده یا دو پیام متناقض چاپ کنه.

score = 95

if score >= 90:
    print("Excellent")

if score >= 80:
    print("Good")

نتیجه دو شرط مستقل رو ببین:

Excellent
Good

برای نمره ۹۵، هر دو مقایسه درستن؛ بنابراین Excellent و Good با هم چاپ می‌شن. اگر قرار باشه فقط یک برچسب نهایی داشته باشیم، این رفتار مناسب نیست. کد بعدی رو ببین که همون مسئله رو با elif حل می‌کنه.

score = 95

if score >= 90:
    print("Excellent")
elif score >= 80:
    print("Good")

این بار فقط Excellent چاپ می‌شه. پس قبل از انتخاب ساختار، از خودت بپرس: «این شرط‌ها مستقلن یا فقط یکی باید برنده بشه؟» جواب همین سؤال مشخص می‌کنه چند if می‌خوای یا یک زنجیره if / elif. موقع تمرین elif در پایتون همین سؤال مهمه؛ خیلی از باگ‌های منطقی دقیقاً از همین انتخاب اشتباه شروع می‌شن.

Boundaryها؛ فرق کوچک بین > و >=

یکی از جاهایی که دستور شرطی در پایتون بی‌سروصدا اشتباه جواب می‌ده، مرز بازه‌هاست. فرض کن قانون ثبت‌نام می‌گه سن باید حداقل ۱۸ سال باشه؛ اگر از > استفاده کنی، کاربر دقیقاً ۱۸ساله هم رد می‌شه. نمونه اول رو عمداً با همین اشتباه می‌بینیم.

age = 18
if age > 18:
    print("Allowed")

اینجا باید شرط شامل خود عدد ۱۸ هم باشه؛ بنابراین عملگر درست >= هست. مثال بعدی نسخه اصلاح‌شده‌ست.

age = 18
if age >= 18:
    print("Allowed")

برای شرط‌های مربوط به سن، تاریخ، تعداد تلاش و محدوده قیمت، فقط عددهای وسط بازه رو آزمایش نکن. اگر دامنه مجاز ۱ تا ۵ هست، مقادیر ۰، ۱، ۵ و ۶ رو هم تست کن. به این کار بررسی مقدارهای مرزی می‌گیم و کمک می‌کنه خطاهایی رو پیدا کنی که با ورودی‌های معمولی دیده نمی‌شن.

مقایسه‌های زنجیره‌ای برای شرط در پایتون

برای بررسی اینکه یک مقدار داخل بازه مشخصی هست یا نه، پایتون مقایسه زنجیره‌ای داره. مثلاً سن بین ۱۸ تا کمتر از ۶۵ سال رو می‌تونی با دو مقایسه و عملگر and بنویسی.

age = 23
if age >= 18 and age < 65:
    print("Working age range")

اما شکل کوتاه‌تر و خواناتر همین شرط رو هم می‌تونی بنویسی:

age = 23
if 18 <= age < 65:
    print("Working age range")

این حالت بهش Chained Comparison می‌گن. علاوه بر کوتاه‌تر شدن، بازه هم یک‌جا دیده می‌شه؛ یعنی می‌فهمی حد پایین شامل ۱۸ و حد بالا شامل ۶۵ نیست. از همین الگو برای اعتبارسنجی نمره هم می‌شه استفاده کرد.

score = 17

if 0 <= score <= 20:
    print("Valid score")

توی مثال نمره، شرط 0 <= score <= 20 یعنی مقدار باید بین صفر و بیست، با احتساب هر دو سر بازه باشه. اگر خواستی این روش رو تمرین کنی، مقدار نمره رو از ۲۰ به ۲۱ تغییر بده و تفاوت خروجی رو ببین.

Truthy و Falsey در پایتون؛ کدوم مقدارها درست حساب می‌شن؟

اینجا یکی از قسمت‌های مهم ساختار شرطی در پایتون رو می‌رسیم که خیلی از دانشجوها اول کار درست متوجه نمی‌شن. داخل if لازم نیست حتماً مقایسه‌ای بنویسی که نتیجه‌اش صریحاً True یا False باشه. پایتون می‌تونه خود یک مقدار رو در موقعیت شرطی ارزیابی کنه؛ به این رفتار Truth Value Testing می‌گن؛ این همون بخش مهم Truthy و Falsey در پایتون هست.

مثلاً صفر، رشته خالی، لیست خالی و None معمولاً Falsey هستن. در مقابل، بسیاری از مقدارهای غیرخالی Truthy محسوب می‌شن. حالا ببین وقتی نام کاربری خالیه چه اتفاقی می‌افته.

username = ""

if username:
    print("Username entered")
else:
    print("Username is empty")

چون رشته خالی Falsey هست، برنامه وارد else می‌شه. Truthy و Falsey در پایتون باعث می‌شن بعضی شرط‌ها رو مستقیم‌تر بنویسیم؛ مثلاً وقتی فقط می‌خوای ببینی یک لیست عضوی داره یا نه، if items: معمولاً از if len(items) > 0: خواناتر می‌شه. البته باید معنای واقعی داده رو هم در نظر بگیری.

چند مقدار Falsey مهم

مقدارارزیابی شرطی
FalseFalse
NoneFalse
0False
0.0False
""False
[]False
{}False
set()False
()False

یه دام مهم اینه که Falsey بودن دو مقدار به معنی یکسان بودن معنای اون‌ها نیست. صفر ممکنه موجودی حساب باشه، رشته خالی ممکنه یعنی کاربر هنوز چیزی وارد نکرده، و None یعنی اصلاً مقدار مشخصی نداریم. پس کوتاه‌نویسی خوبه، اما نه وقتی باعث می‌شه دو حالت متفاوت رو اشتباهی یکی فرض کنی.

عملگرهای شرطی در پایتون؛ and، or و not

گاهی یک مقایسه برای تصمیم‌گیری کافی نیست. مثلاً کاربر باید هم وارد حساب شده باشه و هم دوره رو خریده باشه. اینجا سه عملگر منطقی and، or و not رو داریم. برای یادگیری دستورات شرطی در پایتون و عملگرهاشون اول معنی هر کدوم رو بفهم و بعد سراغ ترکیب چند شرط برو.

عملگرمعنی سادهنمونه
andهر دو شرط لازم‌اندage >= 18 and has_ticket
orحداقل یکی کافی استrole == "admin" or role == "editor"
notبرعکس کردن Truth Valuenot is_blocked

برای نمونه، این شرط تنها وقتی پیام ورود رو چاپ می‌کنه که هم شرط سن و هم داشتن بلیت برقرار باشه.

age = 22
has_ticket = True

if age >= 18 and has_ticket:
    print("Entry allowed")

حالا اگر بخوای مطمئن بشی کاربر مسدود نشده، می‌تونی با not وضعیت مسدود بودن رو برعکس کنی.

is_blocked = False

if not is_blocked:
    print("Account can continue")

Short-circuit یعنی چی؟

نکته مهم بعدی Short-circuit هست. در and اگر سمت اول Falsey بشه، پایتون دیگه نیازی نمی‌بینه سمت دوم رو بررسی کنه. در or هم اگر سمت اول Truthy باشه، ارزیابی همون‌جا تموم می‌شه. این رفتار فقط برای سرعت نیست؛ بعضی وقت‌ها جلوی اجرای یک محاسبه خطرناک یا بی‌معنی رو هم می‌گیره.

number = 0

if number != 0 and 10 / number > 2:
    print("Condition passed")

اینجا چون number صفره، عبارت number != 0 نادرست می‌شه و تقسیم 10 / number اصلاً اجرا نمی‌شه. بنابراین ZeroDivisionError نمی‌گیری. اگر جای دو طرف شرط رو بدون فکر عوض کنی، همین مثال ممکنه خطا بده؛ پس ترتیب ارزیابی اهمیت داره.

and و or همیشه Boolean برنمی‌گردونن

یه نکته کمی دقیق‌تر هم وجود داره: and و or همیشه نتیجه رو به شکل True یا False برنمی‌گردونن؛ گاهی یکی از خود مقدارها رو برمی‌گردونن. این دو خط رو اجرا کن تا ببینی منظورم چیه.

print("" or "guest")
print("Python" and 42)

خروجی این دو عبارت:

guest
42

در خط اول رشته خالی Falsey هست، پس or مقدار دوم یعنی guest رو برمی‌گردونه. در خط دوم رشته Python Truthy هست، پس and سراغ مقدار دوم می‌ره و ۴۲ رو برمی‌گردونه. لازم نیست همین حالا شرط‌های خیلی فشرده بنویسی؛ فقط بدون که نتیجه این دو عملگر الزاماً یک Boolean نیست.

یک اشتباه معروف با or که شرط رو خراب می‌کنه

یکی از خطرناک‌ترین اشتباه‌های شرط در پایتون اینه که کد بدون هیچ خطای Syntax اجرا بشه، ولی دسترسی اشتباه بده. نمونه زیر ظاهراً می‌گه «اگر نقش کاربر ادمین یا ویرایشگر بود»، اما نتیجه‌اش چیزی نیست که فکر می‌کنی.

role = "student"

if role == "admin" or "editor":
    print("Access granted")

پایتون این عبارت رو در عمل مثل دو بخش مستقل می‌بینه: role == "admin" و رشته غیرخالی "editor". چون رشته دوم Truthy هست، شرط حتی برای کاربر student هم برقرار می‌شه. نسخه درست رو می‌تونی با تکرار مقایسه هر دو نقش بنویسی.

role = "student"
if role == "admin" or role == "editor":
    print("Access granted")

برای این مسئله یک شکل خواناتر هم هست: بررسی کنیم مقدار نقش داخل یک مجموعه مجاز وجود داره یا نه. اینجا عملگر in به کارمون میاد.

role = "student"
if role in ("admin", "editor"):
    print("Access granted")

این باگ بهت یاد می‌ده که اجرا شدن برنامه لزوماً به معنی درست بودن منطقش نیست. مخصوصاً در کنترل دسترسی، شرط‌ها رو با ورودی مجاز و غیرمجاز آزمایش کن؛ حتی یک or اشتباه می‌تونه تصمیم برنامه رو کاملاً عوض کنه.

Truthy و Falsey در پایتون

استفاده از in و not in در شرط در پایتون

وقتی می‌خوای وجود یک مقدار داخل لیست، مجموعه یا رشته رو بررسی کنی، in و not in معمولاً از چند مقایسه پشت‌سرهم خواناتر هستن. برای مثال می‌تونیم فهرست نقش‌های مجاز رو تعریف کنیم و بپرسیم نقش فعلی داخل اون هست یا نه.

allowed_roles = {"admin", "editor"}
role = "editor"

if role in allowed_roles:
    print("Access granted")

به همین شکل می‌شه بررسی کرد که پسوند یک فایل داخل فهرست پسوندهای مسدودشده قرار داره یا نه. البته این یک مثال آموزشی درباره شرطه؛ اعتبارسنجی واقعی آپلود فایل به بررسی محتوای فایل، سطح دسترسی و کنترل‌های امنیتی بیشتری نیاز داره.

blocked_extensions = {".exe", ".bat", ".cmd"}
extension = ".jpg"

if extension not in blocked_extensions:
    print("Extension accepted")

وقتی تعداد نقش‌ها یا گزینه‌ها بیشتر شد، لازم نیست برای هرکدوم یک or جدا بنویسی. استفاده از Collection مناسب کد رو خواناتر می‌کنه و بعداً تغییر دادن فهرست مجازها هم راحت‌تر می‌شه. این یکی از کاربردهای روزمره if در پایتون و تست عضویت هست.

تفاوت == و is در شرط در پایتون

دو عملگر == و is ظاهر مشابهی دارن، اما سؤال متفاوتی می‌پرسن. اولی معمولاً برابری مقدارها رو بررسی می‌کنه و دومی می‌پرسه دو اسم دقیقاً به یک Object اشاره می‌کنن یا نه. برای مقایسه متن، عدد یا وضعیت معمولاً سراغ == می‌ریم؛ مثلاً بررسی عنوان یک دوره.

name = "Python"

if name == "Python":
    print("Matched")

برای مقدار خاص None، شکل رایج و پیشنهادی در پایتون استفاده از is None یا is not None هست.

result = None

if result is None:
    print("No result yet")

این موضوع رو با تفاوت «مقدار برابر» و «خود همان شیء» به خاطر بسپار. اینکه دو رشته یا عدد در یک موقعیت خاص با is نتیجه درستی بدن، دلیل خوبی برای جایگزین کردن اون با == نیست. در کد واقعی از عملگر متناسب با منظورت استفاده کن.

شرط در پایتون و Nested if

گاهی یک تصمیم چند مرحله داره. مثلاً فقط اگر کاربر وارد حساب شده بود، تازه بررسی کنیم دوره موردنظر رو هم خریده یا نه. برای چنین حالتی می‌تونی یک if داخل if دیگه بنویسی؛ بهش Nested if می‌گن.

is_logged_in = True
has_access = True

if is_logged_in:
    if has_access:
        print("Show course content")

کد تو در تو اشتباه نیست، ولی وقتی تعداد لایه‌ها زیاد بشه دنبال کردن مسیرها سخت می‌شه. اگر دو شرط واقعاً یک تصمیم مشترک می‌سازن، شاید بشه اون‌ها رو با and ترکیب کرد و کد رو ساده‌تر نوشت.

is_logged_in = True
has_access = True
if is_logged_in and has_access:
    print("Show course content")

با این حال قرار نیست هر شرط تو در تویی رو حذف کنیم. بعضی وقت‌ها شرط دوم فقط بعد از برقرار شدن شرط اول معنی داره یا لازم داریم برای هر مرحله پیام متفاوتی نشون بدیم. در شرط در پایتون ملاک اصلی اینه که دانشجو یا هم‌تیمی تو بتونه مسیر تصمیم‌گیری برنامه رو راحت دنبال کنه.

شرط یک خطی در پایتون؛ چه زمانی به درد می‌خوره؟

حالا برسیم به شرط یک خطی در پایتون. وقتی فقط می‌خوای بین دو مقدار ساده انتخاب کنی، Conditional Expression می‌تونه کد رو کوتاه‌تر کنه. شکل کلی‌اش رو ببین؛ این یک الگوی مفهومی هست و باید جای بخش‌ها مقدار یا عبارت واقعی بذاری.

value_if_true if condition else value_if_false

مثلاً بر اساس سن، وضعیت کاربر رو در یک خط داخل متغیر status قرار می‌دیم.

age = 20
status = "adult" if age >= 18 else "minor"

print(status)

در این مثال خروجی اینه:

adult

استفاده از شرط یک‌خطی برای انتخاب یک مقدار کوتاه خوبه، اما برای چند دستور، پیام خطا یا منطق چندمرحله‌ای من همچنان if / else چندخطی رو ترجیح می‌دم. هدف خواناتر شدن کده، نه اینکه به هر قیمتی تعداد خط‌ها رو کم کنیم.

pass داخل if چه کاربردی داره؟

پایتون بلوک کاملاً خالی رو قبول نمی‌کنه. اگر در مرحله طراحی هنوز تصمیم نگرفتی داخل شرط چه کاری انجام بدی، می‌تونی موقتاً pass بذاری تا ساختار کد معتبر بمونه.

is_admin = True

if is_admin:
    pass

دستور pass هیچ کاری انجام نمی‌ده و فقط یک Statement معتبره. حواست باشه در برنامه نهایی، باقی موندن pass ممکنه یعنی یک مسیر مهم رو هنوز پیاده‌سازی نکرده‌ای. پس ازش به‌عنوان جای‌نگهدار آگاهانه استفاده کن، نه راهی برای مخفی کردن کار ناتمام.

شرط در پایتون و input؛ جایی که Type دوباره مهم میشه

یه مثال مهم برای وصل کردن این درس به درس انواع داده در پایتون داریم: تابع input() حتی وقتی کاربر عدد تایپ می‌کنه، رشته برمی‌گردونه. اگر مستقیم بخوای اون رو با عدد صحیح مقایسه کنی، با خطا روبه‌رو می‌شی. کد بعدی عمداً خطاداره.

age = input("Age: ")

if age >= 18:
    print("Allowed")

چون age از نوع str هست و عدد ۱۸ از نوع int، مقایسه ترتیبی اون‌ها خطای TypeError می‌ده. نسخه بعدی ورودی رو با int() تبدیل می‌کنه و بعد شرط رو بررسی می‌کنه. یادت باشه اگر کاربر متن نامعتبر وارد کنه، همین تبدیل هم ممکنه ValueError بده؛ اعتبارسنجی ورودی موضوع مهمیه که بعداً بیشتر تمرینش می‌کنیم.

age = int(input("Age: "))

if age >= 18:
    print("Allowed")
else:
    print("Not allowed")

ببین چطور سه مبحث به هم وصل شدن: داده رو از کاربر گرفتیم، نوعش رو اصلاح کردیم و بعد بر اساس مقایسه تصمیم گرفتیم. این یعنی برای نوشتن دستورات شرطی در پایتون فقط بلد بودن if کافی نیست؛ باید بدونی داده‌ای که وارد شرط شده واقعاً چه نوعیه.

کاربرد دستورات شرطی در پایتون؛ دسترسی دانشجو به دوره

فرض کن توی یک سامانه آموزشی، نمایش درس پولی سه شرط داشته باشه: کاربر وارد حساب شده باشه، دوره رو خریده باشه و حسابش مسدود نباشه. اینجا می‌تونیم همه شرایط رو با and کنار هم بذاریم. فقط یادت باشه این یک مثال ساده از منطق تصمیم‌گیریه، نه پیاده‌سازی کامل امنیت و احراز هویت یک وب‌سایت.

is_logged_in = True
has_course = True
is_blocked = False

if is_logged_in and has_course and not is_blocked:
    print("Show course content")
else:
    print("Access denied")

گاهی فقط اجازه دادن یا ندادن کافی نیست؛ می‌خوای بفهمی چرا درخواست رد شده. در این حالت elif کمک می‌کنه وضعیت‌ها رو به ترتیب بررسی کنی و برای هرکدوم پیام متفاوتی نمایش بدی.

if not is_logged_in:
    print("Please log in")
elif is_blocked:
    print("Account is blocked")
elif not has_course:
    print("Course access is not available")
else:
    print("Show course content")

توی سیستم واقعی باید مراقب باشی چه پیام‌هایی برای کاربر مناسبن و چه اطلاعاتی نباید لو بره. این مثال فقط نشان می‌ده چطور elif در پایتون و سایر دستورهای شرطی می‌تونن روی تجربه کاربر اثر بذارن. ترتیب شرط‌ها هم مهمه، چون اولین شاخه برقرارشده اجرا می‌شه.

ترتیب شرط در پایتون می‌تونه نتیجه برنامه رو عوض کنه

یه مثال دیگه برای اهمیت ترتیب elif بزنیم. فرض کن برای خریدهای بالای دو میلیون تومان تخفیف ۲۰ درصد و برای خریدهای بالای یک میلیون، تخفیف ۱۰ درصد در نظر گرفته‌ایم. اگر شرط عمومی‌تر رو بالا بذاری، سفارش‌های بزرگ‌تر همون تخفیف کمتر رو می‌گیرن.

total = 2500000

if total >= 1000000:
    discount = 10
elif total >= 2000000:
    discount = 20

مبلغ سفارش اینجا دو میلیون و پانصد هزار تومنه، ولی چون شرط یک میلیون و بیشتر زودتر بررسی می‌شه، نتیجه اشتباهاً ۱۰ درصده. برای اصلاح، شرط دقیق‌تر یعنی دو میلیون و بیشتر رو بالاتر می‌آریم.

total = 2500000

if total >= 2000000:
    discount = 20
elif total >= 1000000:
    discount = 10
else:
    discount = 0

این باگ هیچ خطای قرمزی توی کنسول نمی‌ده؛ برنامه کاملاً اجرا می‌شه، اما خروجی تجاریش اشتباهه. برای همین در شرط در پایتون کنار تست خطاهای Syntax، همیشه مقدارهای مرزی و ترتیب شاخه‌های شرطی رو هم آزمایش کن.

دستورات شرطی در پایتون

چند اشتباه رایج هنگام نوشتن شرط در پایتون

اشتباه اول : استفاده از = به‌جای ==

بیایم شش اشتباه رایج در شرط‌ها در پایتون رو یک‌جا مرور کنیم. اولی استفاده از = به‌جای == برای مقایسه‌ست. مثال زیر عمداً اشتباه نوشته شده و قابل اجرا نیست.

if age = 18:
    print("Matched")

نسخه درست باید از دو علامت مساوی استفاده کنه تا برابری مقدارها رو مقایسه کنه. این بار کد از نظر Syntax معتبره؛ البته متغیر age هم باید قبلاً مقداردهی شده باشه.

age = 18
if age == 18:
    print("Matched")

اشتباه دوم : فراموش کردن : بعد از شرط

در ساختار if، elif و else علامت دونقطه در انتهای خط لازم هست. برای اینکه تفاوت رو ببینی، اول کد بدون دونقطه رو که عمداً خطاداره نگاه کن، بعد نسخه درست همون شرط رو اجرا کن.

if score >= 10
    print("Passed")

نسخه درست این مثال، با دونقطه و تورفتگی مناسب، اینه:

score = 12
if score >= 10:
    print("Passed")

اشتباه سوم : شرطی که همیشه True میشه

اشتباه سوم یک باگ منطقیه: عبارت if x == 1 or 2: تقریباً همیشه درست ارزیابی می‌شه، چون عدد ۲ خودش Truthy هست. همین مسئله درباره if role == "admin" or "editor": هم وجود داره. راه درست اینه که هر مقایسه رو کامل بنویسی یا از in استفاده کنی.

اشتباه چهارم : انتخاب if به‌جای elif

اگه چند دسته رقیب داری و فقط یکی باید انتخاب بشه، استفاده از ifهای مستقل ممکنه چند شاخه رو اجرا کنه. برای نمره، سطح دسترسی یا تخفیف پلکانی، اول بررسی کن آیا یک زنجیره دستورات شرطی در پایتون با if / elif / else انتخاب مناسب‌تری نیست.

اشتباه پنجم : تست نکردن مرزها

فرض کن حداقل سن مجاز ۱۸ ساله. آزمون با سن‌های ۱۵ و ۲۵ به‌تنهایی کافی نیست؛ حتماً ۱۷، ۱۸ و ۱۹ رو هم آزمایش کن. خطاهای مربوط به > و >= معمولاً روی همین مرزها خودشون رو نشون می‌دن.

اشتباه ششم : استفاده از is برای مقایسه مقدار

آخرین اشتباه استفاده از is برای مقایسه معمول مقدارهاست. شاید برای بعضی عددها یا رشته‌ها ظاهراً نتیجه درست ببینی، اما اون رفتار قابل اتکا برای مقایسه مقدار نیست. برای برابری مقدارها == و برای بررسی هویت، مثل is None، از is استفاده کن.

۵ مثال شرط در پایتون؛ قبل از اجرا خروجی رو حدس بزن

حالا قبل از اجرا، نتیجه هر کد رو خودت حدس بزن. می‌خوام فقط جواب درست رو نبینی؛ دلیل انتخاب شاخه رو هم بتونی توضیح بدی. برای مسلط شدن به شرط در پایتون این پنج نمونه رو به ترتیب جلو برو و هر بار فقط بعد از حدس زدن، برنامه رو اجرا کن.

تمرین اول

x = 10

if x > 5:
    print("A")

if x > 8:
    print("B")

برای تمرین اول، خروجی این دو خطه:

A
B

چون دو if مستقل داریم و x برابر ۱۰ هست، هر دو شرط برقرار می‌شن. پس هر دو پیام چاپ می‌شن. اگر قرار بود تنها یک پیام چاپ بشه، باید ساختار تصمیم رو تغییر می‌دادیم.

تمرین دوم

x = 10

if x > 5:
    print("A")
elif x > 8:
    print("B")

تمرین دوم این بار فقط یک پیام چاپ می‌کنه:

A

در این نمونه اولین شرط برقرار شده و بنابراین elif دیگه بررسی نمی‌شه؛ حتی اگر مقایسه دوم به‌تنهایی درست باشه. تفاوت این تمرین با نمونه قبلی رو خوب به خاطر بسپار.

تمرین سوم

items = []

if items:
    print("Has items")
else:
    print("Empty")

خروجی شرط روی لیست خالی:

Empty

چون لیست items خالیه، Falsey محسوب می‌شه و وارد شاخه else می‌شیم. اگر یک عضو به لیست اضافه کنی، نتیجه برعکس می‌شه.

تمرین چهارم

role = "student"

if role == "admin" or "editor":
    print("Allowed")
else:
    print("Denied")

این مثال عمداً یک باگ منطقی داره و خروجی‌اش اینه:

Allowed

با اینکه نقش student هست، متن Allowed چاپ می‌شه؛ چون رشته "editor" همیشه Truthy هست. نسخه امن‌تر همین بررسی با in و فهرست نقش‌های مجازه.

تمرین پنجم

number = 0

if number != 0 and 100 / number > 5:
    print("A")
else:
    print("B")

خروجی آخرین نمونه اینه:

B

چون بخش اول شرط and نادرسته، تقسیم بر صفر اصلاً انجام نمی‌شه و برنامه به else می‌ره. این نمونه به‌خوبی Short-circuit رو نشون می‌ده.

۵ تمرین شرط در پایتون برای دست‌به‌کد شدن

تمرین ۱ : مثبت، منفی یا صفر

این یکی رو دیگه خودت بنویس: یک عدد از کاربر بگیر و با if / elif / else مشخص کن مثبته، منفیه یا صفر. قبل از مقایسه، ورودی input() رو به عدد تبدیل کن. بعد برنامه رو با هر سه نوع ورودی آزمایش کن.

تمرین ۲ : اعتبار نمره

یک نمره از کاربر بگیر و اول معتبر بودن بازه صفر تا بیست رو بررسی کن. اگر معتبر بود، نتیجه قبولی یا مردودی رو مشخص کن؛ اگر خارج از بازه بود پیام خطا بده. برای تمرین if در پایتون، برای بازه معتبر می‌تونی از مقایسه زنجیره‌ای استفاده کنی.

تمرین ۳ : سطح دسترسی

سه متغیر is_logged_in، is_admin و is_blocked بساز. برنامه فقط وقتی باید اجازه دسترسی بده که دو شرط اول درست و مسدود بودن نادرست باشه. حداقل چهار ترکیب متفاوت رو تست کن و ببین خروجی همونیه که انتظار داری یا نه.

تمرین ۴ : پیدا کردن Bug

این بار قراره خودت باگ رو پیدا کنی. کد پایین باید فقط نقش‌های Admin یا Editor رو قبول کنه، ولی نقش Student رو هم راه می‌ده. دو نسخه درست بنویس: یکی با or و یکی با in. بعد هر دو رو روی نقش‌های مجاز و غیرمجاز تست کن.

role = "student"

if role == "admin" or "editor":
    print("Access granted")

تمرین ۵ : تخفیف پلکانی

برای یک فروشگاه آزمایشی سه سطح تخفیف بذار: از دو میلیون به بالا ۲۰ درصد، از یک میلیون به بالا ۱۰ درصد و کمتر از اون بدون تخفیف. این تمرین elif در پایتون رو با ترتیب شرط‌ها طوری بنویس که خرید دو میلیون و پانصد هزار تومنی داخل دسته ۱۰ درصد نیفته. عددهای دقیقاً یک و دو میلیون رو هم امتحان کن.

سؤالات متداول درباره شرط در پایتون

شرط در پایتون چیست؟

ببین، وقتی می‌خوای برنامه بر اساس یک وضعیت تصمیم بگیره، از if استفاده می‌کنی. اگر شرط برقرار باشه، بلوک مربوط به اون اجرا می‌شه؛ با elif و else هم می‌تونی مسیرهای جایگزین بذاری.

تفاوت if و elif در پایتون چیه؟

با چند if مستقل، ممکنه چند بلوک پشت‌سرهم اجرا بشن. اما elif به یک زنجیره if متصله و فقط وقتی نوبتش می‌رسه که شرط‌های قبل رد شده باشن. در هر زنجیره، اولین شاخه درست اجرا می‌شه.

آیا else در پایتون اجباریه؟

نه، اصلاً. می‌تونی فقط if داشته باشی. اگر چند حالت داری از elif کمک بگیر و وقتی برای هیچ‌کدوم از شرط‌ها جواب درست پیدا نشد، در صورت نیاز else بذار.

Truthy و Falsey یعنی چی؟

یعنی پایتون می‌تونه مقدارها رو در یک شرط، از نظر درست یا نادرست بودن ارزیابی کنه. مثلاً صفر، None و لیست خالی Falsey هستن. خیلی از مقدارهای دیگه Truthy محسوب می‌شن؛ ولی حواست باشه Falsey بودن همیشه معنی یکسانی نداره.

تفاوت and و or چیه؟

برای and باید هر دو طرف از نظر شرط برقرار باشن؛ برای or برقرار بودن یکی می‌تونه کافی باشه. ضمن اینکه هر دو Short-circuit دارن؛ یعنی ممکنه سمت دوم اصلاً ارزیابی نشه.

فرق == و is در شرط چیه؟

با == معمولاً برابری مقدارها رو بررسی می‌کنی. اما is به هویت Object مربوطه؛ یعنی دو اسم به همون شیء اشاره می‌کنن یا نه. برای مقدار خاص None بهتره از is None استفاده کنی.

شرط یک‌خطی در پایتون چطوری نوشته میشه؟

برای انتخاب یک مقدار ساده می‌تونی بنویسی status = "adult" if age >= 18 else "minor". اما اگر چند کار مختلف داری یا شرط طولانی شده، کد چندخطی معمولاً خواناتر و بهتره.

برای مطالعه بیشتر از منبع رسمی Python

اگه خواستی بعد از تمرین‌ها جزئیات فنی رو از مرجع اصلی بررسی کنی، آموزش رسمی ساختار if جای خوبی برای شروعه. برای معنی دقیق Truthy و Falsey و عملگرهای منطقی به مستندات Python سر بزن. توضیح Conditional Expression هم برای شرط یک‌خطی مفیده. این‌ها لینک‌های معمولی به منبع اصلی‌ان، نه لینک تبلیغاتی.

جمع‌بندی

اگه بخوام همه این درس رو در یک مسیر خلاصه کنم، می‌شه: داده رو بگیر، شرط رو بررسی کن، یک شاخه رو انتخاب کن و بعد نتیجه رو با ورودی‌های متفاوت آزمایش کن. نمودار کوتاه پایین فقط همین مسیر رو یادآوری می‌کنه.

Data
↓
Condition
↓
Truth Value
↓
Branch
↓
Action

حالا با شرط در پایتون می‌تونی از if، elif و else برای انتخاب مسیر درست استفاده کنی. یاد گرفتی چرا چند if با یک زنجیره شرطی فرق دارن، مرزها چطور روی نتیجه اثر می‌ذارن و چرا شرط‌هایی مثل if role == "admin" or "editor": خطرناک هستن. پیشنهاد من اینه که پنج تمرین آخر درس رو بدون نگاه کردن به جواب‌ها یک‌بار خودت حل کنی.

اگه خواستی درس‌های قبلی رو مرور کنی، مسیر آموزش پایتون نابغه‌ها رو ببین. بعد از شرط‌ها، درس حلقه‌ها در پایتون قدم بعدیه و جلوتر در توابع پایتون هم از همین منطق استفاده می‌کنی. اگر دنبال آموزش ویدیویی کامل و تمرین‌های بیشتر هستی، پکیج جامع آموزش پایتون هم جداگانه در دسترسه.

می‌خواهی عمیق‌تر جلو بروی؟

این درس فقط یک بخش از مسیر کامل است

اگر می‌خواهی مباحث را به‌ترتیب، همراه تمرین و پروژه دنبال کنی، مسیر کامل دوره را ببین.

دوره پایتون از صفر