درست، نادرست و «هیچ»
نوع bool فقط دو مقدار دارد: True و False (با حرف بزرگ). نتیجهی هر مقایسه یک bool است: 5 > 3 برابر True و "فرش" == "گلیم" برابر False. اما نکتهی مهمتر این است که در پایتون هر شیئی را میتوان در شرط گذاشت؛ به این ویژگی truthiness میگویند.
چه چیزهایی «نادرست» حساب میشوند؟
| نوع | مقدار falsy | هر چیز دیگر |
|---|---|---|
| عدد | 0، 0.0، Decimal("0") | truthy |
| رشته | "" (رشتهی خالی) | حتی "0" و "False" truthy هستند |
| مجموعهها | []، ()، {}، set() | truthy اگر حداقل یک عضو داشته باشند |
| ویژه | None، False | — |
بنابراین بهجای if len(orders) > 0: بنویسید if orders:. این سبک پایتونیک است و روی هر نوع مجموعهای کار میکند.
and، or، not: فقط True/False برنمیگردانند
and و or «میانبری» (short-circuit) هستند و یکی از خود عملوندها را برمیگردانند، نه لزوماً True یا False:
name = input("نام مشتری: ") or "مشتری ناشناس"
print(name) # اگر Enter خالی بزنید: مشتری ناشناس
print(0 or 5) # 5
print(3 and 7) # 7
print([] and 10) # []
orders = []
if orders and orders[0] > 10: # اگر لیست خالی باشد، بخش دوم اجرا نمیشود
print("سفارش بزرگ")
در مثال آخر، اگر لیست خالی باشد orders[0] خطای IndexError میداد؛ اما چون and با دیدن اولین مقدار falsy متوقف میشود، بخش دوم هرگز اجرا نمیشود. از این رفتار آگاهانه برای «نگهبان» استفاده کنید.
None: «هنوز مقداری ندارد»
None تنها شیء از نوع NoneType است و معنی «نبودِ مقدار» را دارد: تخفیفی که هنوز تعیین نشده، مشتریای که پیدا نشد، تابعی که چیزی برنمیگرداند. برای بررسی آن همیشه از is استفاده کنید:
discount = None
if discount is None:
print("تخفیف تعیین نشده")
# خطرناک: اگر تخفیف 0 باشد هم وارد این شرط میشود
if not discount:
print("تخفیف ندارد یا صفر است")
تفاوت ظریف ولی مهم: not discount صفر را هم «خالی» میداند. اگر صفر یک مقدار معتبر است (تخفیف صفر درصد)، فقط is None درست است.
نکتههایی که کمتر کسی میداند
boolزیرکلاسintاست:True + Trueبرابر 2 است. پسsum(x > 10 for x in sizes)تعداد اعضای بزرگتر از ۱۰ را میشمارد.bool("False")برابر True است؛ هر رشتهی غیرخالی truthy است. مقادیر «بله/خیر» ورودی کاربر یا فایل را خودتان با مقایسهی رشته تبدیل کنید.if x == 1 or 2:همیشه درست است، چون بهصورت(x == 1) or 2خوانده میشود و 2 truthy است. درستشif x in (1, 2):است.x or defaultبرای مقادیری که صفر یا رشتهی خالیشان معتبر است خطرناک است؛ آنجا بنویسیدdefault if x is None else x.notاولویت پایینتری از مقایسه دارد:not a == bیعنیnot (a == b). برای وضوح بنویسیدa != b.