سرنخ — خودآموز برنامه‌نویسی برای هوش مصنوعی (مقدماتی)

فصل ۵ از ۱۱

پیشرفت ترم
۰٪

ترم ۱ · پایتون از صفر، داخلِ Colab

شرط: کد تصمیم می‌گیرد

فصل ۵پیش‌نمایش رایگان
۹ دقیقه مطالعه فصل ۵

در این فصل چه یاد می‌گیری#

تا اینجا کدت همیشه یک مسیر را می‌رفت: از بالا تا پایین، بی‌چون‌وچرا. ولی هر برنامهٔ واقعی باید تصمیم بگیرد — این ردیفِ داده سالم است یا خراب؟ این پیش‌بینی درست بود یا غلط؟ این مقدار گم‌شده است یا صفر؟ در این فصل if را می‌بینی، اولین ابزارِ تصمیم‌گیری، و همان‌جا می‌فهمی چرا تورفتگیِ خط در پایتون یک سلیقهٔ ظاهری نیست بلکه بخشی از خودِ زبان است.

یک لولهٔ آبی که به یک دوراهی می‌رسد و یک دریچهٔ متحرک مسیر را به یکی از دو شاخه هدایت می‌کند

آخر این فصل می‌توانی:

  • با if و else و elif کد را وادار به تصمیم‌گیری کنی
  • بگویی تورفتگی در پایتون چه کاری می‌کند و IndentationError را رفع کنی
  • شرط‌ها را با and و or و not ترکیب کنی
  • با in بپرسی که یک مقدار در یک فهرست هست یا نه
  • بگویی چرا فهرستِ خالی و رشتهٔ خالی در شرط مثلِ False رفتار می‌کنند، و کجا این میان‌بر خطرناک است

قبل از شروع#

از فصل ۲: عملگرهای مقایسه (>، ==، !=) جوابشان True یا False است.

از فصل ۳: list و اینکه len() طولش را می‌دهد.

📓 نوت‌بوک: نوت‌بوک این فصل را در Colab باز کن — همهٔ کدهای این فصل آماده و به‌ترتیب داخلش هست.

۱. اولین شرط#

score = 78

if score >= 60:
    print("قبول")
قبول

ساختارش سه تکه دارد: کلمهٔ if، یک شرط که جوابش True یا False است، و یک دونقطه. بعدش خطی که تورفته نوشته شده — و همان تورفتگی است که به پایتون می‌گوید «این خط مالِ آن if است».

اگر شرط True باشد آن خط اجرا می‌شود؛ اگر False باشد پایتون کاملاً از رویش می‌پرد. مقدارِ score را به 40 عوض کن و دوباره اجرا کن: هیچ خروجی‌ای نمی‌گیری. این «هیچ خروجی» خودش نتیجه است، نه خرابی.

۲. else و elif#

معمولاً «اگر نه» هم لازم داری:

score = 45

if score >= 60:
    print("قبول")
else:
    print("مردود")
مردود

و وقتی بیش از دو حالت داری، elif (کوتاه‌شدهٔ else if) زنجیره می‌سازد:

score = 85

if score >= 90:
    grade = "عالی"
elif score >= 75:
    grade = "خوب"
elif score >= 60:
    grade = "قابل قبول"
else:
    grade = "نیاز به تلاش بیشتر"

print(f"نمره {score} → {grade}")
نمره 85 → خوب

نکتهٔ مهم: پایتون از بالا شرط‌ها را یکی‌یکی امتحان می‌کند و به اولین شرطِ درست که رسید، همان را اجرا می‌کند و بقیه را کاملاً نادیده می‌گیرد. عددِ 85 هم در >= 75 صدق می‌کند و هم در >= 60، ولی فقط اولی اجرا شد.

قبل از ادامه، جواب بده: اگر ترتیبِ شرط‌ها را برعکس بنویسی — یعنی >= 60 را اول بگذاری — چه می‌شود؟ جواب: همه‌چیز خراب می‌شود. نمرهٔ ۹۵ هم به شرطِ اول می‌خورد و «قابل قبول» می‌گیرد، چون هیچ‌وقت به شرط‌های بعدی نمی‌رسد. در زنجیرهٔ elif همیشه از سخت‌گیرانه‌ترین شرط شروع کن. این یکی از رایج‌ترین باگ‌های منطقی است و پایتون هیچ خطایی هم نمی‌دهد.

چک کن: مقدارِ score را روی 95، 70 و 30 امتحان کن و هر بار خروجی را ببین. هر چهار شاخه باید یک بار اجرا شوند. اگر شاخه‌ای هیچ‌وقت اجرا نشد، یعنی شرطش غیرقابلِ‌دسترس است.

۳. تورفتگی: بخشی از زبان، نه تزئین#

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

یک سلولِ خالی بساز و این را امتحان کن:

if score >= 60:
print("قبول")
  Cell In[1], line 2
    print("قبول")
    ^
IndentationError: expected an indented block after 'if' statement on line 1

پیام دقیقاً می‌گوید چه می‌خواهد: «بعد از دستورِ if در خطِ ۱، یک بلوکِ تورفته انتظار می‌رفت». پایتون نمی‌داند آن print مالِ if است یا خط بعدیِ مستقل، و به‌جای حدس‌زدن می‌ایستد.

قاعده ساده است: بعد از هر دونقطه، خطِ بعدی تورفته می‌شود. استاندارد چهار فاصله است و Colab خودش این کار را می‌کند.

🔧 اگر کار نکرد: IndentationError: unexpected indent یعنی خطی را تورفته نوشته‌ای که نباید. TabError: inconsistent use of tabs and spaces یعنی بعضی خط‌ها با Tab و بعضی با فاصله تورفته شده‌اند — از بیرون کد کپی کرده‌ای. راهِ رفعش: خطِ مشکل‌دار را کامل پاک کن و دوباره تایپش کن.

۴. ترکیب شرط‌ها#

age = 22
has_ticket = True

if age >= 18 and has_ticket:
    print("اجازهٔ ورود دارد")

if not has_ticket:
    print("بلیت ندارد")

city = "شیراز"
if city == "تهران" or city == "شیراز":
    print("در فهرست شهرهای هدف است")
اجازهٔ ورود دارد
در فهرست شهرهای هدف است

سه عملگرِ منطقی داری:

  • and — هر دو طرف باید True باشند.
  • or — کافی است یکی True باشد.
  • not — جواب را برعکس می‌کند.

دقت کن if not has_ticket: هیچ خروجی نداد، چون has_ticket مقدارش True بود و not True می‌شود False.

⚠️ مواظب باش: این رایج‌ترین اشتباهِ منطقیِ تازه‌کارهاست: if city == "تهران" or "شیراز": کار نمی‌کند — ولی خطا هم نمی‌دهد. پایتون آن را این‌طور می‌خواند: «اگر city برابرِ تهران است، یا اگر متنِ "شیراز" مقداری درست‌مانند دارد». و هر متنِ ناخالی درست‌مانند است، پس این شرط همیشه True می‌شود. هر طرفِ or باید یک شرطِ کامل باشد.

۵. in: عضویت در یک فهرست#

نوشتنِ زنجیرهٔ طولانیِ or هم زشت است و هم مستعدِ همان باگِ بالا. راهِ درست:

target_cities = ["تهران", "شیراز", "تبریز"]

if city in target_cities:
    print(f"{city} در فهرست است")

if "اصفهان" not in target_cities:
    print("اصفهان در فهرست نیست")
شیراز در فهرست است
اصفهان در فهرست نیست

in را در فصل ۴ روی dict دیدی (که کلیدها را می‌گشت). روی list عنصرها را می‌گردد و روی متن، زیررشته را. این یکی از خواناترین دستورهای پایتون است و در ترمِ ۲ مرتب به‌کارش می‌بری.

۶. مقدارهای «درست‌مانند»: خالی یعنی False#

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

results = []

if results:
    print("نتیجه داریم")
else:
    print("هیچ نتیجه‌ای پیدا نشد")

print(bool(""), bool("سارا"), bool(0), bool(3), bool([]), bool([1]))
هیچ نتیجه‌ای پیدا نشد
False True False True False True

دو چیز در خطِ آخر تازه است. اول اینکه print می‌تواند چند چیز را با هم بگیرد: هر چه داخلِ پرانتز با ویرگول جدا کنی، پشتِ سرِ هم و با یک فاصله بینشان چاپ می‌شود — برای همین شش مقدار در یک خط آمدند. و دوم، تابعِ bool() هر مقداری را می‌گیرد و می‌گوید پایتون آن را درست‌مانند می‌بیند یا نه؛ دقیقاً همان قضاوتی که if پشتِ پرده می‌کند، این بار قابلِ دیدن.

این خیلی به‌کار می‌آید: به‌جای if len(results) > 0: می‌نویسی if results: که هم کوتاه‌تر است و هم خواناتر.

📏 اندازه بگیر: ولی یک تلهٔ جدی هم دارد که در ترمِ ۲ بارها به آن می‌خوری. if count: وقتی count صفرِ واقعی باشد هم رد می‌شود، درست مثلِ وقتی که اصلاً وجود نداشته باشد. «صفر فروش» و «داده‌ای نداریم» دو چیزِ کاملاً متفاوت‌اند و این کد هر دو را یکی می‌بیند. وقتی تفاوتِ «صفر» و «هیچ» مهم است — و در کارِ داده تقریباً همیشه مهم است — صریح بنویس: if count is not None:.

آن is عملگرِ تازه‌ای است و کارش را با یک جمله بدان: x is None می‌پرسد «آیا x دقیقاً همان مقدارِ None است؟» — نه «آیا برابرِ چیزی است»، نه «آیا خالی است». برای None همیشه از is استفاده کن و نه از ==؛ این قراردادِ رسمیِ پایتون است و در هر کدی که بخوانی همین‌طور نوشته شده. و is not None هم دقیقاً برعکسش است: «مقداری وجود دارد».

🤖 از دستیارت بپرس: «در پایتون چه مقدارهایی falsy هستند؟ فهرستِ کامل را بده و برای هرکدام یک مثال بزن.» بعد هر مورد را خودت با bool() در نوت‌بوک امتحان کن. یکی‌دو موردش احتمالاً غافلگیرت می‌کند.

واژه‌های تازهٔ این فصل#

کلمه تلفظ به حروف فارسی یعنی چه
if / elif / else ایف / اِل‌ایف / اِلس اگر / وگرنه اگر / وگرنه — سه تکهٔ یک تصمیم
indentation ایندِنتِیشِن تورفتگیِ خط؛ در پایتون تعیین می‌کند خط مالِ کدام بلوک است
and / or / not اَند / اُر / نات ترکیبِ منطقیِ شرط‌ها
truthy / falsy تروثی / فالسی مقداری که در شرط مثلِ درست یا نادرست رفتار می‌کند
is None ایز نان «آیا این مقدار دقیقاً None است؟» — راهِ درستِ سنجشِ «هیچ»
IndentationError ایندِنتِیشِن اِرور تورفتگی سرِ جایش نیست

تمرین‌ها

اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.

در فصل بعد#

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

به آخر این فصل رسیدی!

اگر ساختی و جواب داد، این دکمه مال توست.