درک عمیق در مورد تکرارکنندههای پایتون: پیمایش دادهها با «__iter__» و «__next__»

Summarize this content to 400 words in Persian Lang
یک تکرار کننده هر شیئی است که دو روش را پیاده سازی می کند:
__iter__(): خود شی تکرار کننده را برمی گرداند.
__next__(): مورد بعدی را در دنباله برمی گرداند. وقتی آیتم دیگری در دسترس نباشد، a را افزایش می دهد StopIteration استثنا
ایجاد یک تکرار کننده پایه:
class Counter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # Returns itself as an iterator
def __next__(self):
if self.current >= self.end:
raise StopIteration
self.current += 1
return self.current – 1
counter = Counter(1, 4)
for number in counter:
print(number) # Outputs: 1, 2, 3
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این کلاس به صورت دستی کنترل می کند next() تماس بگیرید، وقتی به پایان رسید متوقف می شود. تکرار کننده ها برای کار با دنباله هایی که هر عنصر بر حسب تقاضا پردازش می شود مفید هستند.
2. مولد پایتون: مدیریت کارآمد داده های بزرگ
الف ژنراتور یک راه ساده تر برای ایجاد یک تکرار کننده است. با تابعی که از yield کلمه کلیدی، اجرای تابع را به حالت تعلیق در می آورد yield و زمانی که آن را از سر می گیرد next() نامیده می شود. هر کدام yield بیانیه وضعیت تابع را ذخیره می کند، به این معنی که می تواند از جایی که متوقف شد ادامه دهد.
مثال پایه ژنراتور:
def countdown(num):
while num > 0:
yield num
num -= 1
for n in countdown(3):
print(n) # Outputs: 3, 2, 1
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
چه زمانی yield فراخوانی می شود، تابع مقدار فعلی را برمی گرداند و در انتظار مکث می کند next() برای از سرگیری.
3. چرا ژنراتورها از نظر حافظه کارآمد هستند
ژنراتورها مقادیر را در لحظه محاسبه می کنند که نامیده می شود ارزیابی تنبل. برخلاف لیستها که همه موارد را در حافظه ذخیره میکنند، ژنراتورها فقط در صورت نیاز آیتمها را تولید میکنند که برای موارد زیر ایدهآل است:
جریان داده ها (به عنوان مثال، خواندن خطوط از یک فایل بزرگ).
پردازش دنباله های بزرگ یا بی نهایت بدون اضافه بار حافظه
مثال: خواندن فایل های بزرگ با ژنراتورها:
def read_large_file(file_path):
with open(file_path) as file:
for line in file:
yield line # Only processes one line at a time
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
این رویکرد از بارگیری کل فایل در حافظه جلوگیری می کند، که به ویژه برای فایل های حجیم مفید است.
4. عبارات ژنراتور: نحو فشرده
الف بیان ژنراتور روشی مختصر برای ایجاد ژنراتورها، با استفاده از پرانتز به جای پرانتز مانند درک لیست است.
مثال:
squares = (x * x for x in range(5))
print(next(squares)) # Outputs: 0
print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
اینجا، squares فقط در صورت درخواست، مقادیر را محاسبه می کند، که باعث می شود حافظه کارآمد باشد.
5. ژنراتورهای پیشرفته با yield from
این yield from عبارت برای واگذاری بخشی از عملیات یک ژنراتور به ژنراتور دیگر مفید است. این زمانی مفید است که بخواهید یک ژنراتور را برای ماژولار بودن به زیر ژنراتور تقسیم کنید.
مثال:
def generator_a():
yield 1
yield 2
def generator_b():
yield from generator_a()
yield 3
for val in generator_b():
print(val) # Outputs: 1, 2, 3
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
yield from کد را ساده می کند، به ویژه در زنجیره های ژنراتور پیچیده یا تو در تو.
6. ملاحظات عملکرد: ژنراتورها در مقابل لیست ها
ژنراتورها به ویژه زمانی مفید هستند که:
داده ها خیلی بزرگ هستند که به یکباره در حافظه قرار نمی گیرند.
ممکن است فقط بخشی از داده ها مورد نیاز باشد.
شما می خواهید از هزینه های اولیه اولیه یک لیست بزرگ جلوگیری کنید.
از سوی دیگر، لیست ها زمانی بهتر هستند که:
شما نیاز به دسترسی مکرر به داده ها دارید.
مجموعه داده به اندازهای کوچک است که بهطور همزمان بارگیری شود.
دسترسی تصادفی ضروری است (مولدها از نمایه سازی پشتیبانی نمی کنند).
نتیجه گیری: تکرار کننده ها و مولدها به عنوان ابزار قدرتمند داده
پایتون با تکرارکننده ها و مولدها به شما کنترل پردازش داده ها را با کارایی و انعطاف پذیری حافظه می دهد. آنها برای مدیریت مجموعه داده های بزرگ، جریان داده ها، و ساخت اشیاء قابل تکرار سفارشی ضروری هستند. به اینها مسلط شوید و مانند یک حرفه ای پایتون، داده ها را مدیریت خواهید کرد! 🥂
یک تکرار کننده هر شیئی است که دو روش را پیاده سازی می کند:
-
__iter__()
: خود شی تکرار کننده را برمی گرداند. -
__next__()
: مورد بعدی را در دنباله برمی گرداند. وقتی آیتم دیگری در دسترس نباشد، a را افزایش می دهدStopIteration
استثنا
ایجاد یک تکرار کننده پایه:
class Counter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self # Returns itself as an iterator
def __next__(self):
if self.current >= self.end:
raise StopIteration
self.current += 1
return self.current - 1
counter = Counter(1, 4)
for number in counter:
print(number) # Outputs: 1, 2, 3
این کلاس به صورت دستی کنترل می کند next()
تماس بگیرید، وقتی به پایان رسید متوقف می شود. تکرار کننده ها برای کار با دنباله هایی که هر عنصر بر حسب تقاضا پردازش می شود مفید هستند.
2. مولد پایتون: مدیریت کارآمد داده های بزرگ
الف ژنراتور یک راه ساده تر برای ایجاد یک تکرار کننده است. با تابعی که از yield
کلمه کلیدی، اجرای تابع را به حالت تعلیق در می آورد yield
و زمانی که آن را از سر می گیرد next()
نامیده می شود. هر کدام yield
بیانیه وضعیت تابع را ذخیره می کند، به این معنی که می تواند از جایی که متوقف شد ادامه دهد.
مثال پایه ژنراتور:
def countdown(num):
while num > 0:
yield num
num -= 1
for n in countdown(3):
print(n) # Outputs: 3, 2, 1
چه زمانی yield
فراخوانی می شود، تابع مقدار فعلی را برمی گرداند و در انتظار مکث می کند next()
برای از سرگیری.
3. چرا ژنراتورها از نظر حافظه کارآمد هستند
ژنراتورها مقادیر را در لحظه محاسبه می کنند که نامیده می شود ارزیابی تنبل. برخلاف لیستها که همه موارد را در حافظه ذخیره میکنند، ژنراتورها فقط در صورت نیاز آیتمها را تولید میکنند که برای موارد زیر ایدهآل است:
- جریان داده ها (به عنوان مثال، خواندن خطوط از یک فایل بزرگ).
- پردازش دنباله های بزرگ یا بی نهایت بدون اضافه بار حافظه
مثال: خواندن فایل های بزرگ با ژنراتورها:
def read_large_file(file_path):
with open(file_path) as file:
for line in file:
yield line # Only processes one line at a time
این رویکرد از بارگیری کل فایل در حافظه جلوگیری می کند، که به ویژه برای فایل های حجیم مفید است.
4. عبارات ژنراتور: نحو فشرده
الف بیان ژنراتور روشی مختصر برای ایجاد ژنراتورها، با استفاده از پرانتز به جای پرانتز مانند درک لیست است.
مثال:
squares = (x * x for x in range(5))
print(next(squares)) # Outputs: 0
print(list(squares)) # Outputs remaining: [1, 4, 9, 16]
اینجا، squares
فقط در صورت درخواست، مقادیر را محاسبه می کند، که باعث می شود حافظه کارآمد باشد.
5. ژنراتورهای پیشرفته با yield from
این yield from
عبارت برای واگذاری بخشی از عملیات یک ژنراتور به ژنراتور دیگر مفید است. این زمانی مفید است که بخواهید یک ژنراتور را برای ماژولار بودن به زیر ژنراتور تقسیم کنید.
مثال:
def generator_a():
yield 1
yield 2
def generator_b():
yield from generator_a()
yield 3
for val in generator_b():
print(val) # Outputs: 1, 2, 3
yield from
کد را ساده می کند، به ویژه در زنجیره های ژنراتور پیچیده یا تو در تو.
6. ملاحظات عملکرد: ژنراتورها در مقابل لیست ها
ژنراتورها به ویژه زمانی مفید هستند که:
- داده ها خیلی بزرگ هستند که به یکباره در حافظه قرار نمی گیرند.
- ممکن است فقط بخشی از داده ها مورد نیاز باشد.
- شما می خواهید از هزینه های اولیه اولیه یک لیست بزرگ جلوگیری کنید.
از سوی دیگر، لیست ها زمانی بهتر هستند که:
- شما نیاز به دسترسی مکرر به داده ها دارید.
- مجموعه داده به اندازهای کوچک است که بهطور همزمان بارگیری شود.
- دسترسی تصادفی ضروری است (مولدها از نمایه سازی پشتیبانی نمی کنند).
نتیجه گیری: تکرار کننده ها و مولدها به عنوان ابزار قدرتمند داده
پایتون با تکرارکننده ها و مولدها به شما کنترل پردازش داده ها را با کارایی و انعطاف پذیری حافظه می دهد. آنها برای مدیریت مجموعه داده های بزرگ، جریان داده ها، و ساخت اشیاء قابل تکرار سفارشی ضروری هستند.
به اینها مسلط شوید و مانند یک حرفه ای پایتون، داده ها را مدیریت خواهید کرد! 🥂