تکرارگر در پایتون «Iterator» شیای است که دنبالهای از مقادیر را نگه میدارد و امکان پیمایش ترتیبی در مجموعهای از آیتمها مانند لیستها، تاپلها و دیکشنریها را فراهم میکند. شی تکرارگر در پایتون با استفاده از متد ()iter مقداردهی اولیه میشود و سپس از متد ()next برای پیمایش در مجموعه استفاده میشود. متد ()next هر بار که فراخوانی میشود، به ترتیب آیتمهای موجود در مجموعه را برمیگرداند و زمانی که به انتهای دنباله برسد، خطای StopIteration را ایجاد میکند. این ویژگی در پایتون برای پردازش دادههای بزرگ و کار با مجموعههای مختلف دادهای بهطور کارآمد و بهینه مفید است.
مقدمه
در برنامهنویسی، تکرارگر یکی از مفاهیم اساسی است که به ما این امکان را میدهد که یک یا چند دستور را چندین بار اجرا کنیم. در زبان برنامهنویسی پایتون، تکرارگر به وسیلهی دستورات for و while انجام میشود که هرکدام بهصورت متفاوتی برای اهداف خاص مورد استفاده قرار میگیرند. استفاده از این دستورات به ما کمک میکند تا بتوانیم بهراحتی با مجموعههای داده، شرایط پویا و نیازهای خاص در برنامههایمان کار کنیم. در این مقاله، از سری مقالههای مجله پی استور، با مفهوم تکرارگر در پایتون و نحوه استفاده از آن آشنا خواهیم شد.
مفهوم تکرارگر در پایتون
- یک تکرارگر در پایتون تعداد قابل شمارش از مقادیر را در خود دارد.
- یک تکرارگر در پایتون شیای است که میتواند پیمایش شود، به این معنی که میتوان از طریق تمام مقادیر آن عبور کرد.
- از نظر فنی، تکرارگر در پایتون شیای است که پروتکل Iterator را پیادهسازی میکند، که شامل متدهای ()__iter__ و ()__next__ است.
تفاوت بین Iterator و Iterable در پایتون
- Iterable: شیای است که میتواند یک Iterator برگرداند. این شامل ساختارهای داده داخلی مانند لیستها، دیکشنریها و مجموعهها میشود. به طور کلی، هر چیزی که بتوان آن را با استفاده از یک حلقه for پیمایش کرد، یک Iterable است. Iterable متد ()__iter__ را پیادهسازی میکند که انتظار میرود یک شی Iterator را برگرداند.
- Iterator: شیای است که عمل پیمایش را انجام میدهد. Iterator دو متد را پیادهسازی میکند: ()__iter__ و ()__next__ ، متد ()__iter__ شی Iterator خودش را برمیگرداند و به همین دلیل، Iteratorها نیز Iterable محسوب میشوند.
مثال برای ()python iter
s = "PS" it = iter(s) print(next(it)) print(next(it))
خروجی:
P S
ایجاد یک Iterator سفارشی در پایتون
- تعریف کلاس: ابتدا یک کلاس تعریف کنید که نقش Iterator را ایفا کند.
- مقداردهی اولیه ویژگیها: در متد ()__init__ ، ویژگیهای مورد نیاز برای فرآیند پیمایش را مقداردهی کنید.
- پیادهسازی ()__iter_: این متد باید خود شی Iterator را برگرداند. معمولاً به سادگی self را برمیگرداند.
- پیادهسازی ()__next__: این متد باید هر بار که فراخوانی میشود، آیتم بعدی دنباله را فراهم کند. اگر دنباله به پایان رسیده باشد، باید استثنای StopIteration ایجاد کند.
برای ایجاد یک کلاس سفارشی به نام EvenNumbers که از شماره ۲ شروع به پیمایش اعداد زوج کند، باید کلاس را با پیادهسازی متدهای ()__iter__ و ()__next__ تعریف کنیم.
class EvenNumbers: def __iter__(self): self.n = 2 # Start from the first even number return self def __next__(self): x = self.n self.n += 2 # Increment by 2 to get the next even number return x # Create an instance of EvenNumbers even = EvenNumbers() it = iter(even) # Print the first five even numbers print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it))
خروجی:
۲ ۴ ۶ ۸ ۱۰
در اینجا، متد ()__iter__ شمارنده را از ۲ آغاز میکند که اولین عدد زوج است. سپس، متد ()__next__ عدد فعلی را برمیدارد و آن را ۲ واحد افزایش میدهد تا شماره زوج بعدی به دست آید. برای استفاده از این کلاس، یک نمونه از EvenNumbers ساخته میشود، آن را به یک Iterator تبدیل کرده و سپس از تابع ()next برای دریافت اعداد زوج یکی یکی استفاده میکنیم.
استثنا StopIteration
استثنای StopIteration بخشی از پروتکل iterator در پایتون است که نشان میدهد دیگر آیتمی برای بازگشت از Iterator وجود ندارد. زمانی که این استثنا پرتاب میشود، فراخوانیهای بعدی به ()next روی همان Iterator همچنان استثنای StopIteration را ایجاد خواهند کرد.
li = [100, 200, 300] it = iter(li) # Iterate until StopIteration is raised while True: try: print(next(it)) except StopIteration: print("End of iteration") break
خروجی:
۱۰۰ ۲۰۰ ۳۰۰ End of iteration
در این مثال، استثنای StopIteration به طور دستی در حلقه while مدیریت میشود، که امکان مدیریت سفارشی زمانی که Iterator تمام میشود را فراهم میکند.
نتیجه گیری
استفاده از ساختارهای تکرارگر مانند for و while ابزارهای قدرتمندی برای اجرای چندباره دستورات در کد هستند. این ساختارها به برنامهنویسان امکان میدهند که بهصورت کارآمد و انعطافپذیر، برنامههایی بنویسند که به راحتی با مجموعههای داده بزرگ یا شرایط پویا کار کنند. با استفاده از این دستورات میتوان به راحتی عملیاتهای مختلف را بر روی مجموعهها، شمارش تعداد تکرارگر یا انجام اقدامات تا زمانی که شرطی برقرار باشد، انجام داد. در نهایت، تکرارگر در پایتون بهخوبی با سایر ویژگیهای زبان ترکیب میشود و به سادهسازی و بهینهسازی کدنویسی کمک میکند.