🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی صادقیان آذر
فرق for loop با generator
جامعه پایتون (وب) ایجاد شده در ۲۸ تیر ۱۴۰۲

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

یعنی حلقه for هم طبق ایتریتور برمیگردونه دیتارو و هم جنریتور

فرقشون چیه؟ لطفا واضح بهم توضیح بدید

درود علی جان

در واقع فرق اصلی در مصرف حافظه هستش

generator حافظه کمتری رو مشغول نگه میداره و زمانی که نیاز به اون مقدار داشته باشی اونو بهت برمیگردونه.

به طور کلی:

حلقه for:

حلقه for برای تکرار روی یک دنباله از عناصر استفاده میشه. شما میتونید از حلقه for برای اجرای یک بلاک کد بر روی هر عنصر در دنباله استفاده کنید. این حلقه به صورت خودکار از ابتدا تا انتهای دنباله حرکت میکنه و برای هر عنصر در دنباله، بلاک کد مربوطه را اجرا میکنه. حلقه for به طور معمول با لیست‌ها، رشته‌ها، تاپل‌ها و دیکشنری‌ها استفاده میشه.

generator:

generator یک نوع ویژه از تابع است که مقادیر را به صورت لایه‌لایه و تنها در لحظه نیاز تولید میکنه. در واقع، generator یک منبع داده هستش که در زمان اجرا، مقادیر را به ترتیب یکی‌یکی تولید میکنه. از اونجایی که generator در لحظه نیاز به مقادیر تولید میکنه، میشه از اون برای کاهش حافظه مصرفی و بهبود عملکرد در مواردی که داده‌ها بسیار بزرگ هستند استفاده کرد.همچنین، با استفاده از ژنراتورها می‌توانید کدهایتان را خواناتر و کمتر پیچیده کنید

تفاوت اصلی بین حلقه for و ژنراتور در نحوه تولید مقادیر هست. حلقه for در هر تکرار به صورت کامل دنباله را بارگیری و حافظه را به طور کامل اشغال میکنه. از طرفی، generator مقدارها را به صورت لایه‌لایه تولید میکنه و در هر مرحله تنها یک مقدار را در حافظه نگه می‌دارد، که باعث بهبود کارایی و کاهش مصرف حافظه می‌شود. .

حلقه for:

بیایید برای مثال، یک حلقه for برای تکرار روی یک لیست اعداد از 1 تا 5 بسازیم و هر عدد را چاپ کنیم:

numbers = [1, 2, 3, 4, 5]
for number in numbers:
  print(number)

این کد با استفاده از حلقه for بر روی لیست numbers تمام عناصر را چاپ می‌کند. خروجی آن به شکل زیر است:

1
2
3
4
5

generator:

حالا یک generator میسازیم که مقادیر فیبوناچی را تولید کنه. مقادیر فیبوناچی توسط ژنراتور به ترتیب تولید میشن و تا زمانی که به آن‌ها نیاز داریم، مقادیر بیشتر تولید نمیشن:

def fibonacci_generator():
  a, b = 0, 1
  while True:
    yield a
    a, b = b, a + b
fibonacci = fibonacci_generator()
for i in range(10):
  print(next(fibonacci))
```


این کد از generator برای تولید مقادیر فیبوناچی استفاده می‌کند. در هر مرحله، تابع next برای دریافت مقدار جدید از ژنراتور فراخوانی می‌شود و مقدار مربوطه چاپ می‌شود. خروجی آن به شکل زیر است:

0
1
1
2
3
5
8
13
21
34


توی این مثال، ژنراتور به صورت تنها در هنگام نیاز به مقادیر فیبوناچی، مقادیر را تولید میکنه و به حافظه نگهداری نمیکه. این باعث میشه که بتونیم برای تعداد بسیار زیادی از مقادیر فیبوناچی از طریق ژنراتور استفاده کنیم بدون این که حافظه سیستم را بیش از حد استفاده کنیم.


موفق باشید ?

Reza Mobaraki ۲۸ تیر ۱۴۰۲، ۱۶:۰۹

من هنوز متومه نشدم

دقیقا میدونم فرقشون تووی memory managment هست

اما چطوریشو نمیدونم



فرض کنیم یه تابع داریم با جنریتور اعداد ۱ تا ۱۰۰ رو بنویسه

یه حلقه for هم داریم که اون هم اعداد ۱ تا ۱۰۰ رو پرینت میکنه


فرقشون باهم چیه؟ مگه جفتشون on by one پرینت نمیکنن؟ پس چطور جنریتور بهینه است؟

علی صادقیان آذر ۲۸ تیر ۱۴۰۲، ۲۱:۱۲

درود برای اینکه قضیه برات شفافتر بشه

پیشنهاد میکنم این مقاله رو بخونی : لینک


Reza Mobaraki ۲۸ تیر ۱۴۰۲، ۲۱:۲۶