✔️ کلاس 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