सबसे पहले, मैं C++ शैली iterators उदाहरण quickly.for की समीक्षा:अधिक अभिव्यक्तिपूर्ण पायथन इटरेटर्स कैसे बनाएं? बस C++ इटरेटर तरह
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
यह लचीला है। अंतर्निहित कंटेनर प्रकारों को आसानी से बदलना आसान है। उदाहरण के लिए, आप बाद में निर्णय ले सकते हैं कि सम्मिलन और हटाने की संख्या इतनी अधिक है कि एक सूची वेक्टर की तुलना में अधिक कुशल होगी। इसमें कई उपयोगी सदस्य कार्य भी हैं। वेक्टर के लिए कई सदस्य फ़ंक्शन इटरेटर का उपयोग करते हैं, उदाहरण के लिए, असाइन करें, डालें या मिटाना। इसके अलावा, हम इटरेटर (यदि समर्थित है) बिडरेक्शनली का उपयोग कर सकते हैं, जैसे ++, -। वस्तुओं की तरह एक धारा पार्स करने के लिए यह उपयोगी है।
पायथन की समस्याएं हैं: 1: वर्तमान में, पाश वाक्यविन्यास के लिए पायथन सी ++ के मुकाबले कम लचीला है। (अच्छी तरह से, सुरक्षित) 2: "it! = iter.end()" शैली की बजाय, पाइथन अपवाद फेंक देगा जब अगला() में और नहीं होगा। यह लचीला नहीं है।
प्रश्न 1: क्या मेरा विचार सही से ऊपर है?
ठीक है। यहां मेरा प्रश्न आता है, सी ++ इटरेटर के रूप में शक्तिशाली के रूप में अधिक शक्तिशाली पायथन इटरेटर को कैसे कार्यान्वित किया जाए? वर्तमान में, लूप सिंटैक्स के लिए पायथन सी ++ के मुकाबले कम लचीला है। मुझे कुछ संभावित समाधान भी मिलते हैं, जैसे http://www.velocityreviews.com/forums/t684406-pushback-iterator.html। लेकिन यह उपयोगकर्ता को यह पूछने के बजाय सामान को पुश_बैक करने के लिए कहता है -।
प्रश्न 2: पाइथन में बिडरेक्शनल इटरेटर को लागू करने के लिए सबसे अच्छा क्या है? बस http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/ की तरह।
it = v.begin();
while(it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
मुख्य सुविधाएँ हैं:: 1) द्विदिश, 2) सरल "अंत" जाँच छद्म कोड निम्नलिखित है। "++" या "-" ऑपरेटर या सामान्य कार्य कोई फर्क नहीं पड़ता (इसके बावजूद इसमें कोई अर्थपूर्ण अंतर नहीं है)।
धन्यवाद,
अद्यतन: मैं जवाब से कुछ संभव समाधान मिल गया:
हेi = 0
while i < len(sequence): # or i < len and some_other_condition
star_it = sequence[i]
if condition_one(star_it):
i += 1
if condition_two(star_it):
i = max(i - 1, 0)
हालांकि, सरणी के विपरीत, इस सूची के रैंडम एक्सेस होना चाहिए (एन)। मुझे लगता है कि आंतरिक रूप से पायथन में "सूची" ऑब्जेक्ट को सामान जैसी लिंक्ड-लिस्ट का उपयोग करके कार्यान्वित किया जाता है। इस प्रकार, यह जबकि लूप समाधान कुशल नहीं है। हालांकि, सी ++ में, हमारे पास "यादृच्छिक पुनरावर्तक", "बिडरेक्शनल इटरेटर" है। मुझे बेहतर समाधान कैसे प्राप्त करना चाहिए? धन्यवाद।
क्या आप उस चीज़ का ठोस उदाहरण दे सकते हैं जो आप 'पायथन' में नहीं कर सकते हैं जिसे आप आसानी से 'सी ++' में कर सकते हैं? –
पायथन 'उपज' + अपवाद तंत्र आश्चर्यजनक रूप से लचीला है (यह वही है जिसे हम कार्यात्मक प्रोग्रामिंग में "निरंतरता" कहते हैं)। उन्हें सही तरीके से उपयोग करना सीखें और आपको पुरस्कृत किया जाएगा। सी ++ की तुलना में पाइथन में कंपाउंड इटरेटर्स को परिभाषित करना बहुत आसान है। –
यह प्रश्न बहुत अस्पष्ट है, और वर्तमान फॉर्म में प्रश्न का कोई वास्तविक जवाब नहीं है। –