# जेनरेटर और yield — पायथन

Source: https://www.geekswithgeeks.com/hi/python/py-generators

> वे फ़ंक्शन जो मान एक-एक करके, आलसी तरीके से बनाते हैं, मेमोरी बचाते हुए।

## एक जेनरेटर फ़ंक्शन

`yield` किसी फ़ंक्शन को रोकता है और मान वापस देता है; अगली कॉल पर फ़ंक्शन वहीं से फिर शुरू होता है — पूरी लिस्ट मेमोरी में बनाने की ज़रूरत नहीं।

```python
def count_up_to(n):
    i = 1
    while i <= n:
        yield i
        i += 1

for num in count_up_to(5):
    print(num)          # 1 2 3 4 5, one at a time
```

## जेनरेटर एक्सप्रेशन

**जेनरेटर एक्सप्रेशन** `[]` की जगह `()` वाला list comprehension जैसा दिखता है, और यह भी मान आलसी तरीके से बनाता है।

```python
squares = (n * n for n in range(1_000_000))  # nothing computed yet
print(next(squares))   # 0
print(next(squares))   # 1
print(sum(n * n for n in range(10)))   # 285
```

**Quiz:** विशाल अनुक्रम के लिए list की बजाय generator क्यों बेहतर है?

- [ ] यह हर स्थिति में तेज़ चलता है
- [x] यह सभी को मेमोरी में रखने के बजाय आइटम आलसी तरीके से बनाता है
- [ ] यह अपने-आप आइटम क्रमबद्ध करता है

*Answer:* यह सभी को मेमोरी में रखने के बजाय आइटम आलसी तरीके से बनाता है. जेनरेटर माँग पर एक-एक मान बनाता है, इसलिए विशाल या अनंत अनुक्रम को मेमोरी में फ़िट होने की ज़रूरत नहीं।
