Во-первых, я быстро просматриваю итераторы в стиле C++. Например:
//--- Iterating over vector with iterator.
vector v;
. . .
for (vector::iterator it = v.begin(); it!=v.end(); ++it) {
cout << *it << endl;
}
Он гибкий. Базовые типы контейнеров легко изменить. Например, позже вы можете решить, что количество вставок и удалений настолько велико, что список будет более эффективным, чем вектор. Он также имеет много полезных функций-членов. Многие функции-члены для вектора используют итераторы, например присваивание, вставка или стирание. Более того, мы можем использовать итератор (если он поддерживается) двунаправленно, например, ++, --. Это полезно для анализа потока, подобного объектам.
Проблемы Python: 1: В настоящее время синтаксис цикла для Python менее гибкий, чем для C++. (ну безопаснее) 2: вместо стиля «it != iter.end()» python выдает исключение, когда у next() больше нет. Это не гибко.
Вопрос 1: Верна ли моя идея выше?
Хорошо. Вот мой вопрос: как реализовать более мощный итератор Python, такой же мощный, как итераторы C++? В настоящее время синтаксис цикла для Python менее гибкий, чем для C++. Я также нахожу некоторые возможные решения, такие как http://www.velocityreviews.com/forums/t684406-pushback-iterator.html. но он просит пользователя push_back что-то, а не спрашивать итератор --.
Вопрос 2: Как лучше всего реализовать двунаправленный итератор в python? Так же, как 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)
Однако, в отличие от массива, произвольный доступ к списку должен быть O(n). Я полагаю, что объект «список» в python внутренне реализован с использованием связанных списков, подобных вещам. Таким образом, это решение цикла while неэффективно. Однако в С++ у нас есть «случайный итератор», «двунаправленный итератор». Как мне получить лучшее решение? Спасибо.