जेनरेटर समझ क्या करती है? यह कैसे काम करता है? मुझे इसके बारे में एक ट्यूटोरियल नहीं मिला।जनरेटर समझ वास्तव में कैसे काम करता है?
उत्तर
आप सूची comprehensions समझ रहे हो? यदि ऐसा है, तो जनरेटर अभिव्यक्ति एक सूची समझ की तरह है, लेकिन उन सभी वस्तुओं को ढूंढने के बजाय जिन्हें आप रुचि रखते हैं और उन्हें सूची में पैक करते हैं, यह प्रतीक्षा करता है, और अभिव्यक्ति से प्रत्येक आइटम को एक-एक करके उत्पन्न करता है।
>>> my_list = [1, 3, 5, 9, 2, 6]
>>> filtered_list = [item for item in my_list if item > 3]
>>> print filtered_list
[5, 9, 6]
>>> len(filtered_list)
3
>>> # compare to generator expression
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> print filtered_gen # notice it's a generator object
<generator object at 0xb7d5e02c>
>>> len(filtered_gen) # So technically, it has no length
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'generator' has no len()
>>> # We extract each item out individually. We'll do it manually first.
...
>>> filtered_gen.next()
5
>>> filtered_gen.next()
9
>>> filtered_gen.next()
6
>>> filtered_gen.next() # Should be all out of items and give an error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> # Yup, the generator is spent. No values for you!
...
>>> # Let's prove it gives the same results as our list comprehension
...
>>> filtered_gen = (item for item in my_list if item > 3)
>>> gen_to_list = list(filtered_gen)
>>> print gen_to_list
[5, 9, 6]
>>> filtered_list == gen_to_list
True
>>>
क्योंकि एक जनरेटर अभिव्यक्ति एक बार में केवल एक आइटम की उपज के लिए है, यह स्मृति के उपयोग में बड़ी बचत हो सकती है। जनरेटर अभिव्यक्ति परिदृश्यों में सबसे अधिक समझदारी बनाती है जहां आपको एक समय में एक आइटम लेने की आवश्यकता होती है, उस आइटम के आधार पर बहुत सी गणनाएं करें और फिर अगले आइटम पर जाएं। यदि आपको एक से अधिक मूल्य की आवश्यकता है, तो आप एक जनरेटर अभिव्यक्ति का भी उपयोग कर सकते हैं और एक समय में कुछ पकड़ सकते हैं। यदि आपको अपने कार्यक्रम की आय से पहले सभी मूल्यों की आवश्यकता है, तो इसके बजाय एक सूची समझ का उपयोग करें।
सूची/जनरेटर समझ एक निर्माण जो आपको एक मौजूदा एक से एक नई सूची/जनरेटर बनाने के लिए उपयोग कर सकते हैं।
मान लीजिए कि आप 10 1 से प्रत्येक संख्या के वर्गों की सूची आप अजगर में यह कर सकते हैं उत्पन्न करने के लिए चाहते हैं:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
यहाँ
, range(1,11)
सूची [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
उत्पन्न करता है लेकिन range
कार्य नहीं है पायथन 3.0 से पहले जनरेटर, और इसलिए मैंने जो निर्माण किया है वह एक सूची समझ है।
अगर मैं एक जनरेटर वही चीज़ बनाना चाहता था, मैं इसे इस तरह कर सकता है:
>>> (x**2 for x in xrange(1,11))
<generator object at 0x7f0a79273488>
अजगर 3 में, हालांकि, range
एक जनरेटर है, इसलिए परिणाम वाक्य रचना पर ही निर्भर करता है आप (स्क्वायर ब्रैकेट या राउंड ब्रैकेट्स) का उपयोग करते हैं।
जेनरेटर समझ एक निश्चित संरचना के साथ जनरेटर बनाने का एक आसान तरीका है। मान लें कि आप generator
चाहते हैं जो your_list
में सभी को एक-एक करके आउटपुट करता है। आप समारोह शैली का उपयोग करके इसे बनाते हैं तो वह ऐसा होगा:
def allEvens(L):
for number in L:
if number % 2 is 0:
yield number
evens = allEvens(yourList)
आप इस जनरेटर समझ अभिव्यक्ति के साथ एक ही परिणाम प्राप्त कर सकते थे:
evens = (number for number in your_list if number % 2 == 0)
दोनों ही मामलों में, जब आप next(evens)
आप कॉल your_list
में अगला नंबर भी प्राप्त करें।
जेनरेटर समझ, iterables बनाने के लिए एक कर्सर जो एक संसाधन पर ले जाता है की तरह कुछ एक दृष्टिकोण है। यदि आप mysql कर्सर या mongodb कर्सर को जानते हैं, तो आप इस बात से अवगत हो सकते हैं कि पूरे वास्तविक डेटा को स्मृति में कभी भी लोड नहीं किया जाता है, लेकिन एक समय में। आपका कर्सर आगे और पीछे चलता है, लेकिन स्मृति में हमेशा एक पंक्ति/सूची तत्व होता है।
संक्षेप में, जेनरेटर समझ का उपयोग करके आप पाइथन में आसानी से कर्सर बना सकते हैं।
जेनरेटर समझ का एक और उदाहरण:
print 'Generator comprehensions'
def sq_num(n):
for num in (x**2 for x in range(n)):
yield num
for x in sq_num(10):
print x
- 1. बाध्यकारी वास्तव में कैसे काम करता है?
- 2. बहुआयामी वास्तव में कैसे काम करता है?
- 3. यादृच्छिक() वास्तव में कैसे काम करता है?
- 4. AsParallel वास्तव में कैसे काम करता है?
- 5. फ़ोनगैप वास्तव में कैसे काम करता है?
- 6. सूची :: कैसे 'शफल' वास्तव में काम करता है?
- 7. मेक "-j" विकल्प वास्तव में कैसे काम करता है?
- 8. मैक्सटेनिंग थ्रेसहोल्ड - यह वास्तव में कैसे काम करता है?
- 9. 'अगर (टेस्ट-पथ ...) वास्तव में कैसे काम करता है?
- 10. संग्रहों के लिए बाध्यकारी वास्तव में कैसे काम करता है?
- 11. यह पर्ल एक-लाइनर वास्तव में कैसे काम करता है?
- 12. Jinja2 "रिकर्सिव" टैग वास्तव में कैसे काम करता है?
- 13. पोर्ट नंबर वास्तव में टीसीपी में कैसे काम करता है?
- 14. वैल्यू प्रकार वास्तव में .NET में कैसे काम करता है?
- 15. सिस्टम() वास्तव में लिनक्स में कैसे काम करता है?
- 16. रूबी में, कॉरर्स() वास्तव में कैसे काम करता है?
- 17. विरासत कक्षाओं में 'स्वयं' वास्तव में कैसे काम करता है?
- 18. मैवेन में अद्यतन पॉलिसी वास्तव में कैसे काम करता है?
- 19. डाटा एन्नोटेशन वास्तव में एमवीसी में कैसे काम करता है?
- 20. जनरेटर अभिव्यक्ति बनाम सूची समझ
- 21. apache PHP मेमोरी उपयोग वास्तव में कैसे काम करता है?
- 22. रेक डीबी :: माइग्रेट वास्तव में कैसे काम करता है
- 23. अमेज़ॅन आरडीएस बैकअप/स्नैपशॉट वास्तव में कैसे काम करता है?
- 24. सर्वर सॉकेट वास्तव में कैसे काम करता है?
- 25. जावा हीप स्पेस - एक्सएक्सएक्स वास्तव में कैसे काम करता है?
- 26. एफ # एसिंक वास्तव में कैसे काम करता है?
- 27. सिंक्रोनस और असिंक्रोनस संचार वास्तव में कैसे काम करता है
- 28. एसएसआईएस डेटाफ्लो वास्तव में कैसे काम करता है?
- 29. .NET ExecutionContext वास्तव में कैसे काम करता है?
- 30. जीसीसी विकल्प -फस्टैक-चेक वास्तव में कैसे काम करता है?
यह गलत है। बाहरी अभिव्यक्ति एक जनरेटर के साथ आंतरिक अभिव्यक्ति है या नहीं, इसके साथ कुछ भी नहीं है। हालांकि जाहिर है, आमतौर पर एक सूची से तत्व लेने वाले जनरेटर अभिव्यक्ति में अधिक बिंदु नहीं है, आप इसे कर सकते हैं। – Antimony
क्या इसे और अधिक स्पष्ट रूप से लिखा जा सकता है? मैं जो कह रहा हूं उसे प्राप्त करता हूं, लेकिन एंटीमोनी कहता है, ऐसा लगता है कि आप कुछ और कह रहे हैं। (और ऐसा लगता है कि आप कह रहे हैं कि गलत है) –