مقدمه

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

گزاره‌های if و else

یک گزاره‌ی if در ساده‌ترین حالت، دارای فرم کلی زیر است.

if conditional_test: 
  do_something

در اینجا conditional_test عبارت شرطی است که باید بررسی شود. اگر این عبارت True باشد، دستور یا دستورات بلاک if که در اینجا با do_something مشخص شده، اجرا می‌شوند و در صورت False بودن عبارت شرطی، گزاره‌ی if نادیده گرفته شده و برنامه ادامه می‌یابد. بلاک یک گزاره‌ی if هم مثل آنچه در مورد حلقه‌ی for دیدیم، با استفاده از تورفتگی ایجاد می‌شود.

فرض کنید متغیری داریم که یک عدد صحیح در آن ذخیره شده و می‌خواهیم ببینیم آیا این عدد بر 3 بخشپذیر است یا خیر.

Copy Icon if_statements.py
number = 18 

if number % 3 == 0: 
  print(f"Yes, {number} is divisible by 3")

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

Yes, 18 is divisible by 3
          

اگر به جای 18 یک عدد غیر بخشپذیر بر 3 را به متغیر number اختصاص دهیم و برنامه را اجرا کنیم، خواهیم دید که چیزی در خروجی نمایش داده نمی‌شود؛ چون برنامه گزاره‌ی if را نادیده گرفته است. اما می‌توانیم با اضافه کردن یک بخش else به گزاره‌ی بالا، ترتیبی دهیم که در صورت False بودن عبارت شرطی هم یک عبارت مناسب در خروجی چاپ شود.

Copy Icon if_statements.py
number = 20 

if number % 3 == 0: 
  print(f"Yes, {number} is divisible by 3")
else: 
  print(f"No, {number} isn't divisible by 3")

20 بر 3 بخشپذیر نیست و بنابراین، اجرای برنامه‌ی بالا با خروجی زیر همراه است.

No, 20 isn't divisible by 3
          

پس، فرم کلی یک گزاره‌ی if-else به صورت زیر است.

if conditional_test: 
  do_something 
else: 
  do_another_something

بررسی چندین شرط با elif

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

Copy Icon if_statements.py
number = -5

if number > 0: 
  print(f"{number} is positive")
elif number < 0: 
  print(f"{number} is negative") 
else: 
  print(f"{number} is zero")

تأکید می‌کنم که در یک گزاره‌ی if-elif-else اولین عبارت شرطی که با True ارزیابی شود، دستورات بلاک متناظرش اجرا شده و سایر عبارت‌ها بررسی نمی‌شوند. به عبارت دیگر، فقط دستورات مربوط به یکی از عبارت‌ها اجرا می‌شوند. در مثال بالا، عدم توجه به این موضوع، مشکلی ایجاد نمی‌کند. چون شرط‌ها به گونه‌ای هستند که همواره فقط یکی از آنها برقرار است؛ یعنی یک عدد یا صفر است، یا بزرگتر از صفر و یا کوچکتر از صفر و نمی‌تواند همزمان دو تا از این شرایط را داشته باشد. اما حالا به مثال زیر دقت کنید.

Copy Icon if_statements.py
number = 18 

if number % 2 == 0: 
  print(f"{number} is divisible by 2") 
elif number % 3 == 0: 
  print(f"{number} is divisible by 3")
else: 
  print(f"{number} isn't divisible by 2 or 3")

18 هم بر 2 بخشپذیر است و هم بر 3 و بنابراین، دو تا از شرط‌های بالا برقرار هستند. اما وقتی پایتون به اولین عبارت True برسد، بلاک مربوط به آن عبارت را اجرا می‌کند و از ساختار if خارج می‌شود. بنابراین، خروجی برنامه‌ی بالا به صورت زیر خواهد بود.

18 is divisible by 2
          

اگر بخواهیم در این موارد، هر دو متد print() اجرا شوند، می‌توانیم دو گزاره‌ی if مجزا بنویسیم؛ یکی برای تست بخشپذیری بر 2 و دیگری برای تست بخشپذیری بر 3.

Copy Icon if_statements.py
number = 18 

if number % 2 == 0: 
  print(f"{number} is divisible by 2") 
            
if number % 3 == 0: 
  print(f"{number} is divisible by 3") 

و یا اینکه مانند زیر، از عبارات شرطی ترکیبی استفاده کنیم.

Copy Icon if_statements.py
number = 18 

if number % 2 == 0 and number % 3 == 0: 
  print(f"{number} is divisible by 2 and 3") 
elif number % 2 == 0: 
  print(f"{number} is divisible by 2")
elif number % 3 == 0: 
  print(f"{number} is divisible by 3")
else: 
  print(f"{number} isn't divisible by 2 or 3")            

عبارات غیر بولین برای if

در درس قبل هم اشاره کردیم که وقتی یک عبارت غیر بولین را برای if فراهم کنیم، آن عبارت به طور ضمنی به بولین تبدیل می‌شود. اگر عبارت مورد نظر به یک مقدار Falsy ارزیابی شود، به False تبدیل می‌شود و در غیر این صورت به True. مثال زیر را ببینید.

Copy Icon if_statements.py
x = 5

if x:
    print("x is non-zero")
else:
    print("x is zero")

در اینجا عبارت فراهم شده برای if با مقدار 5 ارزیابی می‌شود که می‌دانیم یک مقدار Truthy است. بنابراین، بلاک مربوط به if اجرا می‌شود. اما اگر به جای 5 مقدار صفر را به x بدهیم، بلاک مربوط به else اجرا می‌شود.