शीघ्र जवाब:
list()एक जनरेटर अभिव्यक्ति के आसपास करना लगभग (लगभग) []इसके चारों ओर ब्रैकेट होने के बराबर है। तो हाँ, आप कर सकते हैं
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
लेकिन आप बस भी कर सकते हैं
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
हां, यह जनरेटर की अभिव्यक्ति को एक सूची समझ में बदल देगा। यह एक ही बात और कॉलिंग सूची () है। तो एक सूची में एक जनरेटर अभिव्यक्ति बनाने का तरीका है कि इसके चारों ओर कोष्ठक लगाए जाएं।
विस्तृत विवरण:
एक जनरेटर अभिव्यक्ति एक "नग्न" forअभिव्यक्ति है। इस तरह:
x*x for x in range(10)
अब, आप इसे अपने आप एक पंक्ति में नहीं रख सकते, आपको एक सिंटैक्स त्रुटि मिलेगी। लेकिन आप इसके चारों ओर कोष्ठक लगा सकते हैं।
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
इसे कभी-कभी जनरेटर समझ भी कहा जाता है, हालांकि मुझे लगता है कि आधिकारिक नाम अभी भी जनरेटर अभिव्यक्ति है, वास्तव में कोई अंतर नहीं है, कोष्ठक केवल वाक्यविन्यास को वैध बनाने के लिए हैं। उदाहरण के लिए किसी फ़ंक्शन के एकमात्र पैरामीटर के रूप में इसे पारित करने पर आपको उनकी आवश्यकता नहीं है:
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
मूल रूप से पायथन 3 और पायथन 2.7 में उपलब्ध अन्य सभी समझ एक जनरेटर अभिव्यक्ति के आसपास सिंटैक्टिक चीनी है। समझ स्थापित करें:
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
ताना बोध:
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
और पायथन 3 के तहत समझ की सूची:
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
पायथन 2 के तहत, सूची की समझ केवल वाक्यगत चीनी नहीं है। लेकिन अंतर केवल इतना है कि x नामस्थान में पायथन 2 लीक के तहत होगा।
>>> x
9
जबकि पायथन 3 के तहत आपको मिलेगा
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
इसका मतलब यह है कि पायथन में अपनी जनरेटर अभिव्यक्ति की सामग्री का एक अच्छा प्रिंटआउट प्राप्त करने का सबसे अच्छा तरीका एक सूची से बाहर समझ बनाना है! हालांकि, यह स्पष्ट रूप से काम नहीं करेगा यदि आपके पास पहले से ही जनरेटर ऑब्जेक्ट है। ऐसा करने से बस एक जनरेटर की सूची बन जाएगी:
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
उस स्थिति में आपको कॉल करना होगा list():
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
हालांकि यह काम करता है, लेकिन थोड़े बेवकूफ है:
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]