Po pierwsze, przegląd iteratory C++ stylu quickly.for przykład:jak tworzyć bardziej ekspresyjne iteratory Pythona? podobnie jak C++ iteracyjnej
//--- Iterating over vector with iterator.
vector<int> v;
. . .
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
Jest elastyczny. Łatwo zmienić podstawowe typy kontenerów. Na przykład możesz później zdecydować, że liczba wstawień i usunięć jest tak wysoka, że lista byłaby bardziej wydajna niż wektor. Ma także wiele przydatnych funkcji składowych. Wiele funkcji składowych wektora używa iteratorów, na przykład przypisywania, wstawiania lub kasowania. Ponadto możemy użyć iteratora (jeśli jest obsługiwany) dwukierunkowo, na przykład ++, -. Jest to przydatne do analizowania strumienia, np. Obiektów.
Problemy z pythonem: 1: Obecnie python dla składni pętli jest mniej elastyczny niż dla języka C++. (no, safer) 2: zamiast "it! = iter.end()" styl, python rzuci wyjątek, gdy next() nie ma więcej. Nie jest elastyczny.
Pytanie 1: Czy mój pomysł jest powyżej prawidłowy?
OK. Nadchodzi moje pytanie, jak zaimplementować potężniejszy iterator Pythona tak potężny jak iteratory C++? Obecnie Python dla składni pętli jest mniej elastyczny niż dla C++. Znajduję również kilka możliwych rozwiązań, takich jak http://www.velocityreviews.com/forums/t684406-pushback-iterator.html. ale prosi użytkownika o push_back rzeczy zamiast zadawania iteratora -.
Pytanie 2: Jaki jest najlepszy sposób na zastosowanie dwukierunkowego Iteratora w pythonie? Podobnie jak http://www.cplusplus.com/reference/std/iterator/BidirectionalIterator/. Pseudo-kod jest następujący:
it = v.begin();
while(it!=v.end()) {
//do sth here
if (condition1)
++it;//suppose this iterator supports ++
if(condition2)
--it;//suppose this iterator supports --
}
Główne cechy to: 1) dwukierunkowy, 2) prostsze "koniec" sprawdzanie. Operatory "++" lub "-" lub typowe funkcje nie mają znaczenia (i tak nie ma żadnej różnicy semantycznej).
Dzięki,
Aktualizacja: Mam kilka możliwych rozwiązań z odpowiedzi:
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)
Jednak w przeciwieństwie do tablicy, random access listy powinny być O (n). Przypuszczam, że obiekt "list" w pythonie wewnętrznie jest zaimplementowany przy użyciu podobnych obiektów. Tak więc to rozwiązanie pętli while nie jest wydajne. Jednak w języku C++ mamy "losowy iterator", "dwukierunkowy iterator". Jak mam uzyskać lepsze rozwiązanie? Dzięki.
Czy możesz podać konkretny przykład czegoś, czego nie możesz zrobić w 'Pythonie', który możesz łatwo zrobić w' C++ '? –
Mechanizm 'yield' + exception w Pythonie jest niesamowicie elastyczny (to, co nazywamy" kontynuacjami "w programowaniu funkcjonalnym). Naucz się ich właściwie używać, a otrzymasz nagrodę. Znacznie łatwiej jest definiować iteratory złożone w Pythonie niż w C++. –
To pytanie jest zbyt ogólnikowe i nie ma prawdziwej odpowiedzi na pytanie w obecnej formie. –