در پایتون، `generator` یک نوع خاص از توابع است که با استفاده از کلمه کلیدی `yield` به جای `return`، مقداری را به صورت فشرده و به صورت دینامیک تولید میکنند. با استفاده از `generator` میتوانیم دنبالهای از مقادیر را تولید کنیم، به جای اینکه تمام مقادیر را در یک لیست یا تاپل ذخیره کنیم.
برای تعریف یک `generator`، کافیست تابع مورد نظر را به صورت معمول تعریف کنید و در هر جایی که میخواهید مقدار تولید کنید، از `yield` استفاده کنید. به عنوان مثال، فرض کنید میخواهید یک تابع `fibonacci` بسازید که مقادیر دنباله فيبوناتچی را تولید کند:
```python
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
```
در این تابع، ابتدا دو متغیر `a` و `b` را با مقدار صفر و یک مقداردهی اولیه میکنیم. سپس در هر مرحله، مقدار `a` را با استفاده از `yield` تولید میکنیم و سپس مقدار `a` و `b` را به ترتیب برابر مقدار `b` و جمع دو مقدار قبلی تنظیم میکنیم.
اکنون میتوانیم با استفاده از `for` یا `next` از `generator` تولید شده، مقادیر دنباله فيبوناتچی را به ترتیب خوانده و استفاده کنیم. به عنوان مثال:
```python
>>> fib = fibonacci()
>>> next(fib)
0
>>> next(fib)
1
>>> next(fib)
1
>>> next(fib)
2
>>> next(fib)
3
>>> next(fib)
5
>>> for i in range(10):
... print(next(fib))
...
8
13
21
34
55
89
144
233
377
610
```
با استفاده از `generator` میتوانیم کدهایی با بهره بیشتری نوشته و مصرف حافظه را کاهش دهیم، زیرا فقط مقادیر لازم را تولید میکنیم و تمام دنباله را به صورت یکجا در حافظه نگه نمیداریم.