как сделать итераторы Python более выразительными? точно так же, как итератор C++

Во-первых, я быстро просматриваю итераторы в стиле 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 неэффективно. Однако в С++ у нас есть «случайный итератор», «двунаправленный итератор». Как мне получить лучшее решение? Спасибо.

5
задан 6 April 2012 в 12:51
поделиться