فصل ۲: داده‌ها — متغیر، عدد، پول، متن فارسی و ورودی

bool، truthiness، None و عملگرهای منطقی

درست، نادرست و «هیچ»

نوع 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.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.