(उत्तर 23 नवंबर 10 को 19:48 बजे)
मैं वास्तव में एक बड़ा अजगर नहीं हूं - लेकिन मैंने एक बार इस वाक्यविन्यास को पाया, जहां से भूल गया था, इसलिए मैंने सोचा कि मैं इसे दस्तावेज करूंगा:
यदि आप sys.stdout.write
इसके बजाय उपयोग करते हैं print
( अंतर होने के नाते, sys.stdout.write
एक फ़ंक्शन के रूप में, कोष्ठक में तर्क लेता है - जबकि print
नहीं ), तो एक-लाइनर के लिए, आप कमांड के आदेश for
को निकालने और अर्धविराम को हटाने के साथ दूर हो सकते हैं , और वर्गाकार कोष्ठक में कमांड संलग्न करना, अर्थात:
python -c "import sys; [sys.stdout.write('rob\n') for r in range(10)]"
पता नहीं कैसे इस वाक्यविन्यास को पायथन में कहा जाएगा :)
उम्मीद है की यह मदद करेगा,
चीयर्स!
(EDIT Tue Apr 9 20:57:30 2013) ठीक है, मुझे लगता है कि मैंने आखिरकार वन-लाइनर्स में इन वर्ग कोष्ठकों के बारे में क्या पाया है; वे "सूची समझ" (जाहिरा तौर पर) हैं; पहले पायथन 2.7 में इस पर ध्यान दें:
$ STR=abc
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); print a"
<generator object <genexpr> at 0xb771461c>
तो राउंड ब्रैकेट्स / कोष्ठक में कमांड को "जनरेटर ऑब्जेक्ट" के रूप में देखा जाता है; यदि हम कॉल करके इसके माध्यम से "पुनरावृति" करते हैं next()
- तो कोष्ठक के अंदर की कमांड निष्पादित की जाएगी (आउटपुट में "एबीसी" पर ध्यान दें):
$ echo $STR | python -c "import sys,re; a=(sys.stdout.write(line) for line in sys.stdin); a.next() ; print a"
abc
<generator object <genexpr> at 0xb777b734>
अगर हम अब वर्ग कोष्ठक का उपयोग करते हैं - ध्यान दें कि हमें next()
कमांड निष्पादित करने के लिए कॉल करने की आवश्यकता नहीं है , यह असाइनमेंट पर तुरंत निष्पादित करता है; हालांकि, बाद में निरीक्षण से पता चलता है कि a
है None
:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; print a"
abc
[None]
यह वर्ग ब्रैकेट मामले के लिए देखने के लिए बहुत जानकारी नहीं छोड़ता है - लेकिन मैं इस पृष्ठ पर ठोकर खाई, जो मुझे लगता है कि समझाता है:
पायथन टिप्स एंड ट्रिक्स - पहला संस्करण - पायथन ट्यूटोरियल | ड्रीम.इनकोड :
यदि आप याद करते हैं, तो एकल पंक्ति जनरेटर का मानक प्रारूप 'ब्रैकेट के अंदर लूप' के लिए एक तरह की एक लाइन है। यह एक 'वन-शॉट' iterable ऑब्जेक्ट का उत्पादन करेगा, जो एक ऐसी वस्तु है जिसे आप केवल एक दिशा में ओवररेट कर सकते हैं और जिसे आप अंत तक पहुंचने के बाद फिर से उपयोग नहीं कर सकते हैं।
एक 'लिस्ट कॉम्प्रिहेंशन' एक नियमित वन-लाइन जनरेटर के समान ही दिखता है, सिवाय इसके कि नियमित कोष्ठक - () - को वर्ग कोष्ठक द्वारा प्रतिस्थापित किया जाता है - []। एलिस्ट कॉम्प्रिहेंशन का प्रमुख एडवांटेज यह है कि 'वन-शॉट' इट्रिजेबल ऑब्जेक्ट के बजाय एक 'लिस्ट' तैयार करता है, ताकि आप इसके माध्यम से आगे-पीछे जा सकें, एलिमेंट्स, सॉर्ट आदि जोड़ सकें।
और वास्तव में यह एक सूची है - यह बस इसका पहला तत्व बन जाता है जैसे ही इसे निष्पादित किया जाता है:
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin].__class__"
abc
<type 'list'>
$ echo $STR | python -c "import sys,re; print [sys.stdout.write(line) for line in sys.stdin][0]"
abc
None
सूची की समझ को अन्यथा 5. दस्तावेज़ों में शामिल किया गया है : डेटा संरचनाएं: 5.1.4। सूची समझ - पायथन v2.7.4 प्रलेखन "सूची समझ सूची बनाने के लिए एक संक्षिप्त तरीका प्रदान करता है" के रूप में; संभवतः, यह वह जगह है जहाँ सूचियों की सीमित "निष्पादन" एक-लाइनरों में खेल में आती है।
खैर, आशा है कि मैं यहाँ बहुत निशान नहीं हूँ ...
EDIT2: और यहां एक नॉन-लाइनर कमांड लाइन है जिसमें दो नॉन-नेस्टेड फॉर-लूप्स हैं; दोनों "सूची बोध" वर्ग कोष्ठक के भीतर संलग्न:
$ echo $STR | python -c "import sys,re; a=[sys.stdout.write(line) for line in sys.stdin]; b=[sys.stdout.write(str(x)) for x in range(2)] ; print a ; print b"
abc
01[None]
[None, None]
ध्यान दें कि दूसरी "सूची" में b
अब दो तत्व हैं, क्योंकि इसके लूप के लिए स्पष्ट रूप से दो बार भाग लिया गया है; हालाँकि, sys.stdout.write()
दोनों मामलों का परिणाम (जाहिरा तौर पर) था None
।