پایتون عملگرهای منطقی را برای انجام عملیات منطقی (بولی) فراهم می کند.(and
،or
،not
)
برای توصیف رابطه بین چند شرط در یک دستور if استفاده می شود.
این بخش موارد زیر را شرح می دهد.
- تقاطع:
and
- اضافه کردن منطقی:
or
- انکار:
not
and
،or
،not
تقدم اپراتور
ضمناً نکات زیر به عنوان احتیاط توضیح داده شده است.
- عملگرهای منطقی برای اشیا از نوع دیگری غیر از bool
and
،or
این مقادیر بازگشتی لزوماً از نوع bool نیستند.- اتصال کوتاه (ارزیابی اتصال کوتاه)
تقاطع:and
و حاصلضرب منطقی دو مقدار را برمی گرداند.
print(True and True)
# True
print(True and False)
# False
print(False and True)
# False
print(False and False)
# False
در واقع، اغلب نه برای درست یا نادرست، بلکه برای عبارات شرطی با استفاده از عملگرهای مقایسه استفاده می شود. برای اطلاع شما عملگرهای مقایسه به شرح زیر است.
<
>
a = 10
print(0 < a)
# True
print(a < 100)
# True
print(0 < a and a < 100)
# True
و به صورت زیر قابل الحاق است.
print(0 < a < 100)
# True
اضافه کردن منطقی:or
یا OR منطقی دو مقدار را برمی گرداند.
print(True or True)
# True
print(True or False)
# True
print(False or True)
# True
print(False or False)
# False
انکار:not
not” نفی مقدار را برمی گرداند؛ true و false معکوس می شوند.
print(not True)
# False
print(not False)
# True
and،or،notتقدم اپراتور
ترتیب تقدم این عملگرهای منطقی به شرح زیر است: not بالاترین است.
not
and
or
در کد نمونه زیر، عبارت فوق طوری تفسیر می شود که گویی عبارت زیر است. از آنجایی که هیچ مشکلی با پرانتزهای اضافی وجود ندارد، ممکن است در مواردی مانند این مثال، توضیح واضح آنها آسانتر باشد.
print(True or True and False)
# True
print(True or (True and False))
# True
اگر می خواهید عمل کنید یا قبل از و، از () پرانتز استفاده کنید.
print((True or True) and False)
# False
<
،>
این عملگرهای مقایسه حتی اولویت بالاتری نسبت به نداشتن دارند. بنابراین، همانطور که در مثال بالا وجود داشت، برای هر عملیات مقایسه نیازی به پرانتز نیست.
print(0 < a and a < 100)
# True
برای خلاصه ای از اولویت عملگر در پایتون به مستندات رسمی زیر مراجعه کنید.
عملگرهای منطقی برای اشیا از نوع دیگری غیر از bool
With these logical operators, not only bool types (true, false), but also numbers, strings, lists, etc. are processed as boolean values.
اشیاء زیر در عملیات منطقی پایتون نادرست در نظر گرفته می شوند.
- ثابت هایی که به صورت نادرست تعریف شده اند:
None
،false
- صفر در انواع عددی:
0
،0
،0j
،Decimal(0)
،Fraction(0, 1)
- دنباله یا مجموعه خالی:
'
،()
،[]
،{}
،set()
،range(0)
تمام مقادیر دیگر درست در نظر گرفته می شوند.
تابع bool() می تواند برای بدست آوردن مقدار بولی یک شی استفاده شود. توجه داشته باشید که رشته ‘0’ یا ‘False’ درست در نظر گرفته می شود.
print(bool(10))
# True
print(bool(0))
# False
print(bool(''))
# False
print(bool('0'))
# True
print(bool('False'))
# True
print(bool([]))
# False
print(bool([False]))
# True
برای در نظر گرفتن «0» یا «false» در یک رشته به عنوان false، از ()distutils.util.strtobool استفاده کنید.
and،orاین مقادیر بازگشتی لزوماً از نوع bool نیستند.
در اینجا مثالی از یک شی غیر از نوع bool آورده شده است که نتیجه هر عملگر را روی یک مقدار عددی نشان می دهد.
x = 10 # True
y = 0 # False
print(x and y)
# 0
print(x or y)
# 10
print(not x)
# False
همانطور که از مثال بالا می بینید، و و یا در پایتون، true یا false را از نوع bool برمی گردانند، بلکه بسته به درست یا نادرست بودن مقدار سمت چپ یا راست را برمی گردانند. مثال عددی است، اما همین امر در مورد انواع دیگر مانند رشته ها و لیست ها صدق می کند. در ضمن، not true یا false از نوع bool را برمی گرداند.
تعاریف مقادیر بازگشتی و و یا به شرح زیر است.
The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.
The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
6.11. Boolean operations — Expressions — Python 3.10.1 Documentation
وقتی مقادیر عبارات چپ و راست به طور جداگانه درست و نادرست باشند، مقادیر بازگشتی به راحتی قابل درک هستند. از طرف دیگر، اگر هر دو درست یا نادرست باشند، مقدار بازگشتی بسته به ترتیب متفاوت خواهد بود.
اگر از آن به عنوان یک عبارت شرطی در یک دستور if و غیره استفاده کنید، نتیجه به عنوان یک مقدار بولی ارزیابی می شود و پردازش می شود، بنابراین لازم نیست نگران آن باشید، اما اگر از مقدار بازگشتی برای پردازش بیشتر استفاده کنید، شما باید مراقب بود
x = 10 # True
y = 100 # True
print(x and y)
# 100
print(y and x)
# 10
print(x or y)
# 10
print(y or x)
# 100
x = 0 # False
y = 0.0 # False
print(x and y)
# 0
print(y and x)
# 0.0
print(x or y)
# 0.0
print(y or x)
# 0
print(bool(x and y))
# False
اگر می خواهید آن را درست یا نادرست در نظر بگیرید، می توانید مانند مثال آخر عمل کنید.bool(x and y)
مقادیر بازگشتی و و یا در جدول زیر خلاصه شده است.
x | y | x and y | x or y |
---|---|---|---|
true | false | y | x |
false | true | x | y |
true | true | y | x |
false | false | x | y |
اتصال کوتاه (ارزیابی اتصال کوتاه)
همانطور که از جدول بالا می بینید، اگر x در x و y نادرست باشد، یا اگر x در x یا y درست باشد، بدون توجه به مقدار y، مقدار بازگشتی x خواهد بود.
در چنین حالتی y ارزیابی نمی شود.
and
،or
توجه داشته باشید که اگر تابع یا متدی را در سمت راست این فرآیندها فراخوانی کنید تا مقداری پردازش انجام شود، بسته به نتیجه سمت چپ، ممکن است فرآیند اجرا نشود.
def test():
print('function is called')
return True
print(True and test())
# function is called
# True
print(False and test())
# False
print(True or test())
# True
print(False or test())
# function is called
# True