Get Mystery Box with random crypto!

کلاس zip ببینید zip یک کلاس هست که میاد به عنوان پارامتر های | بنیاد پایتون کاران فارسی

کلاس zip

ببینید 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 = [
"Ali",
"Mohsen",
"Hassan",
]

last_names = [
"Hassanzadeh",
"Mohammadi",
]

z = zip(names, last_names)

الان هر بار که روی z ما next بزنیم به ما یک tuple به سایز 2 میده (چرا 2 ؟ چون 2 تا iterable بهش دادیم)

>>> next(z)
('Ali', 'Hassanzadeh')

به همین صورت میتونید به لیست، ست و ... این zip object رو تبدیل کنید:

>>> list(z)
[('Ali', 'Hassanzadeh'), ('Mohsen', 'Mohammadi')]

چرا هر tuple دوتا عضو بیشتر نداره؟ چون همونطور که بالا گفتم تعداد به اندازه کوتاه ترین 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


@PSFarsi