✔️ کلاس zip
ببینید zip یک کلاس هست که میاد به عنوان پارامتر های ورودی خودش،
شاید بگید
خوب حالا این zip چطوری کار میکنه 🤔
این کلاس میاد و از
نکته مهم ❗️
کلاس zip هم مثل filter و map و ... یک
مثال 🧪
پس
ببینید zip یک کلاس هست که میاد به عنوان پارامتر های ورودی خودش،
iterable
(یا iterable
هایی) رو به صورت postional argument
میگیره و یک zip object
به ما برمیگردونه!شاید بگید
iterable
چیه؟ iterable
میشه چیزی که شما توی پایتون بتونی مثلا روش for
بزنی و به اصطلاح iterate
کنی! مثل چی؟ مثل list - str - tuple و ...خوب حالا این zip چطوری کار میکنه 🤔
این کلاس میاد و از
iterable
هایی که بهش داده شده، به تعداد اون Iterable
ها (فرض کنیم n
تا) tuple (هایی) به سایز n
برامون yield
میکنه! حالا اعضای اون tuple که سایزش n
هست (یعنی n
تا عضو داره) چی هستن؟ zip میاد و اولین عضو رو از اولین iterable
و دومین عضو رو از دومین iterable
و همینطوری تا آخر میگیره! این تا کی ادامه داره؟ تا زمانی که اعضای کوتاه ترین iterable
تمام بشه!نکته مهم ❗️
کلاس zip هم مثل filter و map و ... یک
lazy iterator
هست، یعنی چی؟ یعنی جواب رو درجا برای ما محاسبه نمیکنه و هر بار که روش next زده بشه، به ما یک چیزی yield میکنه.مثال 🧪
names = [الان هر بار که روی z ما
"Ali",
"Mohsen",
"Hassan",
]
last_names = [
"Hassanzadeh",
"Mohammadi",
]
z = zip(names, last_names)
next
بزنیم به ما یک tuple به سایز 2 میده (چرا 2 ؟ چون 2 تا iterable
بهش دادیم)>>> next(z)به همین صورت میتونید به لیست، ست و ... این
('Ali', 'Hassanzadeh')
zip object
رو تبدیل کنید:>>> list(z)چرا هر tuple دوتا عضو بیشتر نداره؟ چون همونطور که بالا گفتم تعداد به اندازه کوتاه ترین
[('Ali', 'Hassanzadeh'), ('Mohsen', 'Mohammadi')]
iterable
هست که در اینجا last_names
کوتاه تر هست و فقط 2 عضو داره!پس
signature
کلی کلاس zip به شکل زیر هست (از پایتون 3.10 پارامتر strict
بهش اضافه شده که توضیحش میدم)zip(*iterables, strict=False) —> zip objectخوب ی نکته میمونه، اینکه از پایتون 3.10 به این کلاس یک پارامتری اضافه شده به اسم
strict
! کارش چیه؟ مقدارش به صورت پیشفرض False
هست، ولی زمانی که شما اون رو True کنید، چک میکنه که همه iterable
هایی که بهش دادید آیا طول یکسان دارند یا نه و اگر این شرایط برقرار نبود یک خطای ValueError
به شما میده! مثال:names = [خروجی:
"Ali",
"Mohsen",
"Hassan",
]
last_names = [
"Hassanzadeh",
"Mohammadi",
]
print(list(zip(names, last_names, strict=True)))
ValueError: zip() argument 2 is shorter than argument 1
#builtins✔️ کلاس map
کلاس
این تایپ برای اولین پارامتر یک
اول از همه تایپ مپ درست مانند
کاری که
چند مثال کاربردی 🧪
تبدیل همه اعداد یک لیست به مربع خودشان:
اگر به
کلاس
map
یکی دیگه از تایپهای built-in پایتون است.این تایپ برای اولین پارامتر یک
Callable
دریافت میکنه (مثلا یک تابع یا یک کلاس که داندر ____call____ رو پیادهسازی میکنه) و پارامتر بعدیش تعداد متغیری iterable
هست که بعد از callable
بهش پاس میدیم. signature
عه تابع مپ به این شکل هست:map(callable, *iterables) —> map objectاما
map
چه کاری انجام میده؟ 🤔اول از همه تایپ مپ درست مانند
range
و فیلتر lazy iterator
هست، یعنی فوری نتایج رو محاسبه نمیکنه،کاری که
map
میکنه اینه که میاد دونه دونه از اون iterable
(یا iterable
هایی) که بهش داده شده، به اون callable
پاس میده و نتیجه ای که اون callable
بهش داده (در واقع مقداری که از callable
ما return
شده) رو هر بار که ما next
میزنیم به ما برمیگردونه!چند مثال کاربردی 🧪
تبدیل همه اعداد یک لیست به مربع خودشان:
lst = [2, 4, 6, 8]Output:
print(list(map(lambda x: x ** 2, lst)))
[4, 16, 36, 64]
تبدیل تمام استرینگهای یک لیست به شکل Uppercase خودشان:lst = ["John", "David", "Mike"]Output:
print(list(map(str.upper, lst)))
['JOHN', 'DAVID', 'MIKE']
نکته مهم ❗️اگر به
map
چند تا iterable
میدید، باید حواستون باشه که اون callable
باید به تعداد iterable
ها پارامتر داشته باشه! مثال:x = list(map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6]))Output:
print(x)
[5, 7, 9]
در مثال بالا دو تا iterable
به مپ پاس دادیم پس باید تابعی که به map
میدیم دوتا آرگومان بگیره. حالا map
میاد پارامتر اول (یعنی x) رو از اولین iterable
و دومی رو (یعنی y) از دومین iterable
میگیره! نکته قابل توجه دیگه اینکه، این فرایند توی تابع (یعنی جمع x و y) به تعداد اعضای کوتاه ترین iterable
انجام میشه! یعنی اگر یکی از iterable
ها 2 عضو داشت و بقیه 5 عضو، فقط روی 2 عضو اول هر iterable
مپ کار انجام میده! مثال:x = list(map(lambda x, y: x + y, [2, 3], [4, 5, 6, 4]))Output:
print(x)
[6, 8]
#builtins🔥1