🐍 Python & Raspberry 🐍
8.19K subscribers
1.92K photos
125 videos
623 files
1.23K links
Python- Raspberry Pi-AI-IOT
ادمین : فرهاد ناصری زاده
@farhad_naserizadeh
@farhad3412

گروه پایتون
@Python_QA
تبادل
@mmtahmasbi
کانال مرتبط
@new_mathematical
@micropython_iot
@c_micro
اینستاگرام
http://Instagram.com/python_raspberry
Download Telegram
✔️ کلاس filter

کلاس filter یکی از تایپ‌های built-in پایتون هست.
در filter ما دوتا پارامتر داریم، اولین پارامتر یا یک تابع هست یا None، و دومین پارامتر یک iterable (مثلا لیست، تاپل و ...)؛ حالا filter چیکار میکنه با این‌ها؟ فیلتر میاد دونه دونه از اون iterable عضو میگیره و پاس میده به اون تابع؛
اما اون تابع باید چه شرایطی داشته باشه؟ اون تابع باید عضوی که از فیلتر دریافت میکنه رو بگیره و یک شرط رو برسی کنه و یک مقدار bool برگردونه! مثلا:
def is_too_long(elm) -> bool:
return len(elm) > 100

به اون تابعی که شما به عنوان آرگومان اول به filter پاس می‌دید اصطلاحا میگن predicate.
خب هدف این‌کار چیه؟ filter بر اساس مقدار bool عی که میگیره تصمیم میگیره که آیا اون عضو تایید میشه یا نه؟ چجور تایید میشه؟ وقتی که مقدار return شده به ازای اون عضو True باشه.
آبجکت filter یک iterable عه lazy هست، یعنی اینکه وقتی صداش می‌زنید فوری نتایج رو برنمی‌گردونه و رفتارش دقیقا مثل رفتار آبجکت range هست، برای مثال وقتی می‌نویسید
>>> range(10_000_000)

این ۱۰ میلیون عدد درست نمیشه و فقط یک آبجکت range درست میشه که هر بار که شما روش next میزنید آیتم بعدی رو بهتون میده

پس وقتی برای مثال می‌نویسید:
>>> even_filter = filter(lambda x: x % 2 == 0, range(1, 10))

یک آبجکت filter دریافت می‌کنید که هربار روش next میزنید اون عضوی که در اون تابع predicate نتیجه‌ش True شده رو برمیگردونه

>>> next(even_filter)
2
>>> next(even_filter)
4
>>> next(even_filter)
6
>>> next(even_filter)
8
>>> next(even_filter)
StopIteration

نکته‌ای که میمونه اینه که، پس اون None که گفتیم میشه به عنوان اولین آرگومان پاس داد، چیه؟ اگر شما اولین آرگومان رو None پاس بدی، حکم این رو داره که گفته باشید تمام اعضایی رو از اون iterable بگیر که مقدار truth value اونها True باشه! مثلا:

x = list(filter(None, ["", [], "Iliya", False, 0, 1]))

خروجی کد بالا با توجه به توضیحات:
["Iliya", 1]

پس در نهایت ساختاری که filter میگیره به شکل زیر هست:
filter(function or None, iterable) --> filter object

لازم به ذکر هست که در ماژول itertools یک تایپی وجود داره به اسم filterfalse که کاملا رفتار برعکسی نسبت به filter داره. 😁

#BuiltIn
🖋@Pygrammer
〰️〰️〰️〰️〰️〰️
©️@raspberry_python