✔️ کلاس
در
اما اون تابع باید چه شرایطی داشته باشه؟ اون تابع باید عضوی که از فیلتر دریافت میکنه رو بگیره و یک شرط رو برسی کنه و یک مقدار
خب هدف اینکار چیه؟
آبجکت
پس وقتی برای مثال مینویسید:
#BuiltIn
🖋@Pygrammer
〰️〰️〰️〰️〰️〰️
©️@raspberry_python
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