سطح مقدماتی (Beginner Level)
ماژول itertools در کتابخانه استاندارد پایتون، مجموعهای از ابزارهای قدرتمند برای کار با حلقهها و تکرارگرها (Iterators) است. این ماژول به ما کمک میکند تا با کد کمتر و سرعت بیشتر، عملیات پیچیده روی دادهها را انجام دهیم.
در سطح مقدماتی با مفهوم تکرارگرهای بینهایت و توابع سادهتر این ماژول آشنا میشویم.
۱. وارد کردن ماژول و مفهوم تکرارگرهای بینهایت
برخلاف لیستها که تمام حافظه را اشغال میکنند، توابع itertools مقادیر را به صورت تنبل (Lazy) و در لحظه تولید میکنند. سه تابع اصلی برای تولید حلقههای بینهایت وجود دارد: count، cycle و repeat.
تابع count (شمارنده بینهایت)
این تابع شبیه range است اما پایانی ندارد و تا بینهایت میشمارد.
# Example 2: استفاده در کنار zip (Static snippet)
# شمارش خودکار آیتمهای یک لیست بدون نیاز به len()
import itertools
data = ['a', 'b', 'c']
# (0, 'a'), (1, 'b'), (2, 'c') ...
indexed_data = list(zip(itertools.count(), data))
۲. توابع cycle و repeat
تابع cycle یک دنباله را بارها و بارها تکرار میکند و repeat یک مقدار ثابت را تکرار میکند.
۳. زنجیر کردن با chain
اگر بخواهیم چند لیست یا تکرارگر را پشت سر هم بچسبانیم و به عنوان یک حلقه واحد پردازش کنیم، chain بهترین گزینه است. این کار بسیار بهینهتر از جمع کردن لیستها (list1 + list2) است چون حافظه جدید اشغال نمیکند.
# Example 2: Chain Static Concept
# مناسب برای خواندن خطوط از چندین فایل مختلف به صورت پشت سر هم
def read_multiple_files(file_list):
# This is pseudo-code for logic demonstration
# return itertools.chain.from_iterable(open(f) for f in file_list)
pass
سطح پیشرفته (Professional Level)
در سطح حرفهای، itertools برای حل مسائل ریاضی (جایگشت و ترکیب)، گروهبندی دادهها و فیلترینگ پیشرفته استفاده میشود. این ابزارها در تحلیل داده و الگوریتمهای بهینهسازی بسیار کاربردی هستند.
۱. جایگشتها و ترکیبها (Combinatorics)
توابع permutations (جایگشت) و combinations (ترکیب) برای ساخت تمام حالات ممکن استفاده میشوند.
permutations: ترتیب مهم است (AB با BA فرق دارد).combinations: ترتیب مهم نیست (AB با BA یکی است).
# Example 2: product (محصول دکارتی)
# معادل حلقههای تو در تو (Nested Loops)
import itertools
colors = ['Red', 'Blue']
sizes = ['S', 'M']
# معادل:
# for c in colors:
# for s in sizes: ...
prod = itertools.product(colors, sizes)
# Output: [('Red', 'S'), ('Red', 'M'), ('Blue', 'S'), ('Blue', 'M')]
۲. گروهبندی دادهها با groupby
تابع groupby یکی از قدرتمندترین و البته فریبندهترین توابع است. نکته حیاتی: ورودی groupby حتماً باید بر اساس کلید گروهبندی مرتب (Sorted) شده باشد، وگرنه گروهها تکراری جداگانه ایجاد میشوند.
۳. فیلترینگ پیشرفته (compress, dropwhile, takewhile)
این توابع کنترل دقیقتری نسبت به filter() معمولی به ما میدهند.
compress: انتخاب آیتمها بر اساس یک لیست از مقادیر True/False (selector).dropwhile: نادیده گرفتن آیتمها تا زمانی که شرط برقرار است (به محض False شدن، بقیه را برمیگرداند).takewhile: برداشتن آیتمها تا زمانی که شرط برقرار است (عکس dropwhile).
۴. تابع accumulate (مجموع انباشته)
برخلاف reduce که یک مقدار نهایی میدهد، accumulate مراحل میانی عملیات را هم برمیگرداند. پیشفرض آن جمع است، اما میتوان تابع دیگری مثل max یا ضرب را به آن داد.