बस डालें, yield
आपको जनरेटर देता है। आप इसका उपयोग करेंगे जहां आप आमतौर पर फ़ंक्शन में return
का उपयोग करेंगे। एक वास्तव में काल्पनिक उदाहरण को कट करके शीघ्र से चिपकाया ...
>>> def get_odd_numbers(i):
... return range(1, i, 2)
...
>>> def yield_odd_numbers(i):
... for x in range(1, i, 2):
... yield x
...
>>> foo = get_odd_numbers(10)
>>> bar = yield_odd_numbers(10)
>>> foo
[1, 3, 5, 7, 9]
>>> bar
<generator object yield_odd_numbers at 0x1029c6f50>
>>> bar.next()
1
>>> bar.next()
3
>>> bar.next()
5
आप देख सकते हैं, पहले मामले में foo
एक ही बार में स्मृति में पूरी सूची रखता है के रूप में। यह 5 तत्वों वाली सूची के लिए एक बड़ा सौदा नहीं है, लेकिन यदि आप 5 मिलियन की सूची चाहते हैं तो क्या होगा? न केवल यह एक बड़ी स्मृति खाने वाला है, बल्कि उस समारोह को बनाने के लिए बहुत समय लगता है जब समारोह कहा जाता है। दूसरे मामले में, bar
बस आपको जनरेटर देता है। एक जनरेटर एक पुनरावृत्ति है - जिसका अर्थ है कि आप इसे लूप, आदि में उपयोग कर सकते हैं, लेकिन प्रत्येक मान को केवल एक बार एक्सेस किया जा सकता है। सभी मान एक ही समय में स्मृति में संग्रहीत नहीं होते हैं; जेनरेटर ऑब्जेक्ट "याद करता है" जहां यह आखिरी बार आपको लूपिंग में था - इस तरह, यदि आप 50 अरब तक गिनने के लिए एक अचूक उपयोग कर रहे हैं, तो आपको 50 बिलियन तक गिनने की ज़रूरत नहीं है एक बार में और 50 अरब संख्याओं को गिनने के लिए स्टोर करें। दोबारा, यह एक सुंदर योगदान उदाहरण है, यदि आप वास्तव में 50 अरब तक गिनना चाहते हैं तो आप शायद itertools
का उपयोग करेंगे। :)
जेनरेटर का यह सबसे आसान उपयोग मामला है। जैसा कि आपने कहा था, इसका उपयोग कुछ प्रकार के स्टैक वैरिएबल का उपयोग करने के बजाय कॉल स्टैक के माध्यम से चीजों को धक्का देने के लिए yield
का उपयोग करके कुशल क्रमपरिवर्तन लिखने के लिए किया जा सकता है। जेनरेटर का इस्तेमाल विशेष पेड़ ट्रैवर्सल और अन्य सभी चीजों के लिए भी किया जा सकता है।
अतिरिक्त पठन:
स्रोत
2011-10-25 02:55:25
[पाइथन उपज कीवर्ड समझाया गया] के संभावित डुप्लिकेट [http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained) – JBernardo