مقدمه

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

نگاهی دوباره به عملگرهای مقایسه‌ای

عملگرهای مقایسه‌ای (comparisional operators) فارغ از نوع عملوندهایشان، همواره یک مقدار بولین برمی‌گردانند. یعنی حاصل یک عبارت مقایسه‌ای، همیشه یا True است یا False.

>>> 5 > 2 
True 
>>> 5 < 2
False 
>>> 5 == 2
False 
>>> 5 != 2
True 
>>> 5 >= 2
True 
>>> 5 <= 2
False 
>>> True > 0
True 
>>> "Hello" > "Bye"
True 
>>> int("12") >= 7
True
          

یادآوری می‌کنم که عملوندهای بولین False و True برای عملگرهای مقایسه‌ای حکم اعداد صفر و 1 را دارند و مقایسه‌ی رشته‌ها هم به صورت کاراکتر به کاراکتر و بر اساس کد یونیکد کاراکترها صورت می‌گیرد.

برنامه‌نویسان جاوااسکریپت باید توجه داشته باشند که در پایتون، رشته‌ها را نمی‌توان با اعداد مقایسه کرد. چون بر خلاف جاوااسکریپت، در پایتون، رشته‌ها در عبارات محاسباتی و مقایسه‌ای به عدد تبدیل نمی‌شوند. اما مقادیر بولین True و False را در هر عمل مقایسه‌ای (و محاسباتی) می‌توانیم معادل اعداد 1 و صفر بدانیم.

قوانین تبدیل برای مقادیر بولین

تبدیل نوع (type conversion) در پایتون می‌تواند به یکی از دو روش ضمنی (implicit) و صریح (explicit) رخ دهد. تبدیل ضمنی توسط خود پایتون و بدون دخالت ما انجام می‌شود اما تبدیل صریح، تبدیلی است که برنامه‌نویس انجام می‌دهد. تا جایی که ابهامی وجود نداشته باشد یا امکان از دست رفتن اطلاعات وجود نداشته باشد، پایتون تبدیلات مورد نیاز را به صورت ضمنی انجام می‌دهد. برای مثال، وقتی پایتون به عبارتی مثل 2 == 2.0 برمی‌خورد، مقدار سمت راست را هم از نوع float در نظر می‌گیرد تا بتواند مقایسه را انجام دهد.

برای تبدیل صریح، همانطور که دیدیم، از توابعی که همنام با نوع‌ها هستند، استفاده می‌شود. پس، برای تبدیل صریح مقادیر به بولین، از تابع bool() استفاده می‌شود. تبدیل به بولین در پایتون، چه ضمنی باشد و چه صریح، بر اساس این قاعده صورت می‌گیرد که مقادیر زیر به False و هر مقدار دیگر به True تبدیل می‌شوند.

  • مقدار None
  • مقدار False
  • مقدار صفر صحیح یا اعشاری
  • کالکشن‌های خالی مانند ''، ()، {}، [] و set()

توجه داشته باشید که آکلادهای خالی باعث ایجاد یک دیکشنری می‌شوند نه مجموعه. به هر حال، این مقادیر را از این‌رو که به False تبدیل می‌شوند، مقادیر Falsy می‌نامند و سایر مقادیر Truthy گفته می‌شوند.

حالا مثال زیر را ببینید.

>>> bool(0)
False 
>>> bool(-1) 
True 
>>> bool(float('nan')) 
True 
>>> bool('') 
False 
>>> bool(' ')
True 
>>> bool({})
False 
>>> bool([1, 2])
True 
          

یک نمونه از تبدیلات ضمنی به بولین، زمانی رخ می‌دهد که یک مقدار غیر بولین را به گزاره‌ی if بدهیم. در درس بعد خواهیم دید که در این موارد، عبارت مورد نظر به مقدار بولین متناظر خود تبدیل می‌شود.

عملگرهای منطقی

در دنیای منطق ریاضی ما سه عملگر با نام‌های AND، OR و NOT داریم که برای ترکیب عبارات منطقی به کار می‌روند. این عملگرهای منطقی (logical operators) در پایتون با همین نام‌ها پیاده‌سازی شده‌اند و امکان ترکیب عبارات شرطی یا بولین را فراهم کرده‌اند.

  • عبارت منطقی exp1 and exp2 که در آن exp1 و exp2 عبارات بولین هستند، فقط در صورتی با مقدار True ارزیابی می‌شود که هر دو عبارت exp1 و exp2 دارای مقدار True باشند.
  • عبارت منطقی exp1 or exp2 در صورتی با True ارزیابی می‌شود که لااقل یکی از دو عبارت exp1 و exp2 برابر با True باشند.
  • عبارت منطقی not exp مقدار خلاف exp را برمی‌گرداند.

کارکرد این عملگرها را در مثال زیر می‌بینید.

Copy Icon python_conditionals.py
a = 5
b = 10
            
# Logical AND
print(a > 3 and b < 15)  # True
            
# Logical OR
print(a > 7 or b > 8)    # True
            
# Logical NOT
print(not a > 7)         # True

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

  • عملگر and عملوندهای خود را ارزیابی کرده و اولین مقدار Falsy را برمی‌گرداند.
  • عملگر or عملوندهایش را ارزیابی کرده و اولین مقدار Truthy را برمی‌گرداند.

حالا اول دقت کنید که آنچه که در بالا از نقش عملگرهای منطقی گفتیم، همچنان صادق است و در واقع، یک حالت خاص از تعریف کلی است و بعد، به مثال زیر نگاه کنید.

>>> 1 and "Hi" and 0 and ''
0
>>> "Hi" and 2.0 and [1, 2, 3] and 0.0 and 5
0.0
>>> 0 or 2 or 'Hi'
2
>>> 0 or '' or True
True
          

عملگرهای in و is

عملگر in که قبلاً هم آن را دیده‌ایم، وجود یا عدم وجود یک مقدار را در یک کالکشن بررسی می‌کند و عملگر is بررسی می‌کند که آیا عملوندهایش به شیء یکسانی اشاره می‌کنند یا خیر. هر دوی این عملگرها می‌توانند به همراه عملگر not هم به کار گرفته شوند و نتیجتاً عملکردشان معکوس شود.

Copy Icon python_conditionals.py
x = [1, 2, 3]
y = x
z = [1, 2, 3]

print(2 in x)       # True
print(4 not in x)   # True

print(x is y)       # True
print(x is z)       # False