अजगर 2.5 के बाद से, yield <value>
एक अभिव्यक्ति है, न कि एक बयान है। PEP 342 देखें।
कोड घोर रूप से और अनावश्यक रूप से बदसूरत है, लेकिन यह कानूनी है। इसकी केंद्रीय चाल जनरेटर अभिव्यक्ति के अंदर f((yield x))
का उपयोग कर रही है। यह इस तरह का एक सरल उदाहरण है:
>>> def f(val):
... return "Hi"
>>> x = [1, 2, 3]
>>> list(f((yield a)) for a in x)
[1, 'Hi', 2, 'Hi', 3, 'Hi']
मूल रूप से, में जनरेटर अभिव्यक्ति यह कारण बनता है स्रोत iterable में हर मूल्य के लिए दो मानों का उत्पादन करने के yield
का उपयोग कर। चूंकि जनरेटर अभिव्यक्ति तारों की सूची में पुनरावृत्त होती है, प्रत्येक पुनरावृत्ति पर, yield x
पहले सूची से एक स्ट्रिंग उत्पन्न करता है। जीनएक्सपी की लक्षित अभिव्यक्ति f((yield x))
है, इसलिए सूची में प्रत्येक मूल्य के लिए, जनरेटर अभिव्यक्ति का "परिणाम" f((yield x))
का मान है। लेकिन f
सिर्फ इसके तर्क को अनदेखा करता है और हमेशा विकल्प स्ट्रिंग "-o"
देता है। तो जनरेटर के माध्यम से हर कदम पर, यह पहले कुंजी-मूल्य स्ट्रिंग उत्पन्न करता है (उदा।, "x=1"
), फिर "-o"
। बाहरी list(reversed(list(...)))
सिर्फ इस जनरेटर से एक सूची बनाता है और फिर इसे उलट देता है ताकि "-o"
एस इसके बजाय प्रत्येक विकल्प से पहले आएगा।
हालांकि, वहाँ यह इस तरह से करने के लिए कोई कारण नहीं है। कई और अधिक पठनीय विकल्प हैं। शायद सबसे स्पष्ट बस है:
kvs = [...] # same list comprehension can be used for this part
result = []
for keyval in kvs:
result.append("-o")
result.append(keyval)
return result
भले ही आप संक्षिप्त पसंद है, "चालाक" कोड, आप अभी भी सिर्फ
return sum([["-o", keyval] for keyval in kvs], [])
kvs
सूची समझ ही प्रयास किया पठनीयता का एक विचित्र मिश्रण है कर सकता है और unreadability। यह अधिक सरल लिखा गया है:
kvs = [str(optName) + separator + str(optValue) for optName, optValue in options.items()]
आपको इसे अपने कोडबेस में रखने के लिए "हस्तक्षेप" की व्यवस्था करने पर विचार करना चाहिए।
डैंग किया गया है हो सकता है। अपठनीय कोड के बारे में बात करो। – BenDundee
सबसे मजेदार हिस्सा 'सूची है (' (('स्विच सही करने के लिए' सूची ('भाग' है, हालांकि – ch3ka
भी सभी लैम्बडा बस '((लैम्ब्डा _: '-o') (उपज एक्स)) एक्स केवीएस में एक्स के लिए) ' –