برنامه نویسی

انجام تکرار موازی با استفاده از zip() در پایتون

آیا تا به حال کلمه “تکرار موازی” را شنیده اید یا زمانی که در پایتون برنامه نویسی می کردید سعی کرده اید “روی چندین تکرار به صورت موازی حلقه بزنید”؟

این آموزش یک پایتون را نشان می دهد zip() عملکردی که به ما کمک می کند تا a تکرار موازی بر روی چندین تکرار.

تعریف

zip() تابع تکرارپذیرها را می گیرد و به صورت موازی روی آنها تکرار می کند، که منجر به تولید تاپلی از هر آیتم از تکرارپذیر می شود.

items = ["Computer", "Keyboard", "CPU", "Mouse"]
units = [3, 2, 4, 6]

mapping = zip(items, units)

print(tuple(mapping))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

(('Computer', 3), ('Keyboard', 2), ('CPU', 4), ('Mouse', 6))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به عبارت دیگر، آن را برمی گرداند تکرار کننده تاپل ها جایی که اولین مورد در هر تکرار کننده پاس شده با هم جفت می شود و سپس مورد دوم در هر تکرار کننده پاس شده با هم جفت می شود و آن تا زمانی که کوتاه ترین تکرار کننده تمام شود، ادامه می یابد.

راه دیگری برای فکر کردن zip() این است که ردیف ها را به ستون و ستون ها را به ردیف تبدیل می کند. این شبیه به جابجایی یک ماتریس. منبع است

نحو

سینتکس پایتون zip() تابع است:

zip(*iterables) یا zip(iterator1, iterator2, ...)

در پایتون 3.10، strict استدلال اضافه شد

zip(*iterables, strict=False)

استفاده از آن را خواهیم دید strict پیش در این آموزش

zip() مولفه های:

iterables: آنها می توانند لیست ها، تاپل ها، دیکشنری ها یا اشیایی باشند که می توانند تکرار شوند.

مثال

languages = ["Python", "JavaScript", "C", "C++"]
founded = [1991, 1995, 1972, 1985]

mapping = zip(languages, founded)

print(list(mapping))

print(type(list(mapping)))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[('Python', 1991), ('JavaScript', 1995), ('C', 1972), ('C++', 1985)]
<class 'list'>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کارکردن تابع zip().

چگونه zip() تابع یک تکرار کننده از تاپل ایجاد می کند؟

در واقع می توان گفت که زیپ به معنای جمع کردن دو چیز مجزا در یک چیز است.

درست مثل آن، پایتون zip() تابع با گرفتن دو ورودی کار می کند A1 و A2، و سپس تجمیع آیتم از همان شماره شاخص از A1 و A2.

از طریق تصویر زیر بهتر متوجه خواهیم شد

عملکرد zip کار می کند

  • ما به وضوح می‌توانیم در سمت راست ببینیم – تاپلی در شاخص 0 شامل هر مورد از است A1 و A2 به ترتیب در شاخص 0.

  • همین امر در مورد موارد در شاخص 1 صدق می کند A1 و A2.

  • به طور کلی، تاپل در شاخص i شامل مواردی در فهرست است i که در A1 و A2.

به طور رسمی تر: zip() یک تکرار کننده از تاپل ها را برمی گرداند، که در آن تاپل i-ام حاوی عنصر i-ام از هر یک از تکرارپذیرهای آرگومان است.منبع

تکرار شونده با طول های مختلف

چه اتفاقی می افتد اگر تکرار شونده ها دارای طول های مختلف باشند؟

هیچ اتفاقی نمی افتد اگر تکرارها به آن منتقل شوند zip() تابع طول های مختلفی دارد زیرا اگر به اسناد رسمی پایتون مراجعه کنیم، آن را بیان می کند “تکرارگر زمانی متوقف می شود که کوتاه ترین تکرار تمام شود”.

مثال

languages = ["Python", "JavaScript", "C", "C++"]
founded = [1991, 1995, 1972]

mapping = zip(languages, founded)

print(list(mapping))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[('Python', 1991), ('JavaScript', 1995), ('C', 1972)]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اینجا C++ حذف شد زیرا founded متغیر فقط شامل سه آرگومان است.

اگر پایتون در زمانی که تکرارپذیرها با طول های مختلف هستند، خطایی ایجاد کند چه؟

بیایید با یک مثال بفهمیم

languages = ["Python", "JavaScript", "C", "C++"]
founded = [1991, 1995, 1972]

mapping = zip(languages, founded, strict=True)

print(list(mapping))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Traceback (most recent call last):
  ....
ValueError: zip() argument 2 is shorter than argument 1
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آیا متوجه شدید که یک استدلال اضافی وجود دارد strict=True در کد؟

را strict آرگومان اضافه شده است پایتون نسخه 3.10

اگر تکرار شونده ها طول های متفاوتی داشته باشند و از آن استفاده کنیم strict آرگومان، کد a را پرتاب می کند ValueError. می تواند برای رفع اشکال مفید باشد.

ارسال یک یا هیچ تکراری به zip()

را zip() اگر هیچ پارامتری ارسال نشود، تابع یک تکرار کننده خالی برمی گرداند.

no_iterable = zip()
print(list(no_iterable))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

اگر فقط یک تکرار را پاس کنیم، zip() تابع یک تکرار کننده از تاپل ها را برمی گرداند که هر کدام فقط یک عنصر دارند.

languages = ["Python", "JavaScript", "C", "C++"]

mapping = zip(languages)

print(list(mapping))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[('Python',), ('JavaScript',), ('C',), ('C++',)]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال های زیپ() پایتون

مثال: استفاده از شمارش () تابع با zip()

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]

result = zip(characters, real_names)

for num, results in enumerate(result):
    print(num, results)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

0 ('Iron Man', 'RDJ')
1 ('Thor', 'Chris Hemsworth')
2 ('Spiderman', 'Andrew Garfield')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال: استفاده از تابع range().

name = ["Sachin", "Rishu", "Yashwant", "Abhishek"]

values = zip(range(4), name)

print(tuple(values))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

((0, 'Sachin'), (1, 'Rishu'), (2, 'Yashwant'), (3, 'Abhishek'))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال: داشتن چندین تکرار

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]
reel_names = ["Tony Stark", "Thor", "Peter Parker"]

result = zip(characters, real_names, reel_names)

print(list(result))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

[('Iron Man', 'RDJ', 'Tony Stark'), ('Thor', 'Chris Hemsworth', 'Thor'), ('Spiderman', 'Andrew Garfield', 'Peter Parker')]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

مثال: Typecasting به انواع داده های مختلف

تایپ کست کردن در لیست

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]

result = zip(characters, real_names)

print(f"List: {list(result)} and type is {type(list(result))}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

List: [('Iron Man', 'RDJ'), ('Thor', 'Chris Hemsworth'), ('Spiderman', 'Andrew Garfield')] and type is <class 'list'>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تایپ کست به دیکشنری

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]

result = zip(characters, real_names)

print(f"Dictionary: {dict(result)} and type is {type(dict(result))}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Dictionary: {'Iron Man': 'RDJ', 'Thor': 'Chris Hemsworth', 'Spiderman': 'Andrew Garfield'} and type is <class 'dict'>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تایپ کست کردن در مجموعه

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]

result = zip(characters, real_names)

print(f"Set: {set(result)} and type is {type(set(result))}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Set: {('Iron Man', 'RDJ'), ('Spiderman', 'Andrew Garfield'), ('Thor', 'Chris Hemsworth')} and type is <class 'set'>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تایپ کست به تاپل

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]

result = zip(characters, real_names)

print(f"Tuple: {tuple(result)} and type is {type(tuple(result))}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Tuple: (('Iron Man', 'RDJ'), ('Thor', 'Chris Hemsworth'), ('Spiderman', 'Andrew Garfield')) and type is <class 'tuple'>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

باز کردن زیپ مقادیر

ما در واقع می توانیم مقادیر را از حالت فشرده خارج کنید آن بود قبلا زیپ شده. بیایید ببینیم چگونه این کار را انجام دهیم.

این را می توان با کمک انجام داد * عملگر ستاره

بیایید با یک مثال بفهمیم.

characters = ["Iron Man", "Thor", "Spiderman"]
real_names = ["RDJ", "Chris Hemsworth", "Andrew Garfield"]
reel_names = ["Tony Stark", "Thor", "Peter Parker"]

mapping = zip(characters, real_names, reel_names)

mapped = list(mapping)

print(f"Zipped result: {mapped}", end="")

print("\n")

# unzipping values
char, real, reel = zip(*mapped)

print("Unzipped result:")

print(f"The characters list is : {char}")

print(f"The real_names list is : {real}")

print(f"The reel_names list is : {reel}")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خروجی

Zipped result: [('Iron Man', 'RDJ', 'Tony Stark'), ('Thor', 'Chris Hemsworth', 'Thor'), ('Spiderman', 'Andrew Garfield', 'Peter Parker')]

Unzipped result:
The characters list is : ('Iron Man', 'Thor', 'Spiderman')
The real_names list is : ('RDJ', 'Chris Hemsworth', 'Andrew Garfield')
The reel_names list is : ('Tony Stark', 'Thor', 'Peter Parker')
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه کنید که چگونه مقادیر متغیر را از حالت فشرده خارج کردیم mapped استفاده كردن * و برای ذخیره مقادیر زیپ نشده سه متغیر اعلام کردیم char، real و reel

نتیجه

در این آموزش، شما یاد گرفتید که با استفاده از Python یک تکرار موازی انجام دهید zip() عملکرد و امیدوارم نحوه استفاده از آن را درک کرده باشید.

شما اکنون درک می کنید که چگونه zip() تابع در پشت صحنه برای تولید یک تکرار کننده چندگانه کار می کند.

برای درک بهتر کد، تکه های کد نوشته شده در بالا در IDE های خود را امتحان کنید.


🏆اگر این مقاله را دوست داشتید، ممکن است به مقالات دیگری علاقه مند شوید

✅چگونه بایت ها را در پایتون به رشته تبدیل کنیم؟

✅f-string: روشی پیشرفته و مدرن برای قالب بندی رشته ها.

✅چگونه به مقادیر لیست در دیکشنری در پایتون دسترسی پیدا کنیم؟

✅چگونه از __str__ و __repr__ برای تغییر نمایش رشته اشیاء در پایتون استفاده کنیم؟

✅توابع sort() و sorted() چه تفاوتی با یکدیگر دارند؟

✅تفاوت seek() و tell() در پایتون چیست؟

✅چگونه از ماژول tempfile برای ایجاد فایل های موقت و dirs در پایتون استفاده کنیم؟


فعلاً همین است.

به کدنویسی ادامه دهید✌✌

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا