خانه / آموزش‌ها / توابع Any و All در پایتون

توابع Any و All در پایتون

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

در برنامه‌نویسی پایتون، اغلب نیاز داریم بررسی کنیم که آیا در یک لیست یا مجموعه داده، "همه" مقادیر صحیح هستند یا "حداقل یکی" از آن‌ها صحیح است. به جای نوشتن حلقه‌های for طولانی، پایتون دو تابع داخلی (Built-in) بسیار کاربردی به نام‌های any() و all() در اختیار ما قرار می‌دهد.

تابع all()

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

این تابع مشابه عملگر منطقی AND عمل می‌کند اما روی مجموعه‌ای از داده‌ها.

Python

تابع any()

این تابع زمانی مقدار True برمی‌گرداند که حداقل یکی از اعضای ایتربل صحیح (True) باشد. تنها زمانی False می‌دهد که تمام اعضا False باشند.

این تابع مشابه عملگر منطقی OR عمل می‌کند.

Python
python
# ساختار کلی (Pseudo-code)
# اگر لیست خالی باشد، رفتار آن‌ها متفاوت است که در سطح پیشرفته بررسی می‌کنیم
result_all = all(iterable)
result_any = any(iterable)

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، استفاده از any و all تنها برای تمیز کردن کد نیست، بلکه بحث Performance (کارایی) و Short-circuiting (قطع کوتاه) و رفتار با داده‌های خالی مطرح می‌شود.

مفهوم Short-Circuiting (قطع کوتاه)

هر دو تابع any و all به صورت Lazy عمل می‌کنند. یعنی به محض اینکه نتیجه قطعی شود، پردازش را متوقف می‌کنند و ادامه لیست را بررسی نمی‌کنند.

  1. all(): به محض دیدن اولین False، متوقف شده و False برمی‌گرداند.
  2. any(): به محض دیدن اولین True، متوقف شده و True برمی‌گرداند.

این ویژگی زمانی که با توابع سنگین یا دیتابیس‌ها کار می‌کنید، بسیار حیاتی است.

Python

بهینه‌سازی حافظه با Generator Expression

یک اشتباه رایج بین برنامه‌نویسان متوسط، استفاده از List Comprehension درون all یا any است. این کار باعث می‌شود ابتدا کل لیست در حافظه ساخته شود و سپس بررسی شود، که ویژگی Short-circuiting را خنثی می‌کند (در مرحله ساخت لیست).

روش غلط (Memory Inefficient):

python
all([x > 0 for x in huge_list]) # براکت [] کل لیست را می‌سازد

روش صحیح (Memory Efficient):

python
all(x > 0 for x in huge_list) # بدون براکت، یک Generator است
Python

رفتار با ایتربل‌های خالی (Vacuous Truth)

یک نکته بسیار مهم در منطق ریاضی و پایتون، خروجی این توابع روی لیست خالی [] است:

  • all([]) برابر است با True. (چون هیچ عضوی وجود ندارد که شرط را نقض کند - حقیقتی توخالی).
  • any([]) برابر است با False. (چون هیچ عضوی وجود ندارد که True باشد).

نمودار منطقی رفتار Any و All

Python

Truthiness مقادیر غیر بولین

این توابع روی هر نوع داده‌ای کار می‌کنند و از قانون Truthy/Falsy پایتون پیروی می‌کنند.

  • اعداد غیر صفر، رشته‌های غیر خالی، لیست‌های پر -> True
  • عدد ۰، None، رشته خالی، لیست خالی -> False
Python