Создайте базовый итератор Python

Что касается сообщений Уильяма Бренделя и dbconfessions , в отношении случая 2. Вот пример:

public class Window {

  private Window parent;

  public Window (Window parent) {
    this.parent = parent;
  }

  public void addSubWindow() {
    Window child = new Window(this);
    list.add(child);
  }

  public void printInfo() {
    if (parent == null) {
      System.out.println("root");
    } else {
      System.out.println("child");
    }
  }

}

I ' Видно, что это использовалось при построении отношений родитель-ребенок с объектами. Однако, пожалуйста, учтите, что для краткости это упрощено.

531
задан user2357112 27 July 2016 в 21:57
поделиться

2 ответа

Объекты итератора в Python соответствуют протоколу итератора, который в основном означает, что они предоставляют два метода: __iter__() и __next__(). __iter__ возвраты итератор возражает, и неявно назван в начале циклов. __next__() метод возвращает следующее значение и неявно назван в каждом инкременте цикла. __next__() повышения исключение StopIteration, когда больше нет значения для возврата, который неявно получен конструкциями цикличного выполнения, чтобы прекратить выполнять итерации.

Вот простой пример счетчика:

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def __next__(self): # Python 2: def next(self)
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


for c in Counter(3, 8):
    print c

Это распечатает:

3
4
5
6
7
8

Это легче записать использование генератора, как покрыто в предыдущий ответ:

def counter(low, high):
    current = low
    while current <= high:
        yield current
        current += 1

for c in counter(3, 8):
    print c

печатный вывод будет тем же. Под капотом объект генератора поддерживает протокол итератора и делает что-то примерно подобное классу Счетчик.

статья David Mertz, Итераторы и Простые Генераторы , является довольно хорошим введением.

610
ответ дан Ben Gartner 27 July 2016 в 21:57
поделиться

В первую очередь, itertools модуль невероятно полезен для всех видов случаев, в которых итератор был бы полезен, но здесь является всем, что необходимо создать итератор в Python:

урожай

, который не прохладен? Урожай может использоваться для замены нормального возврат в функции. Это возвращает объект все равно, но вместо того, чтобы уничтожить состояние и выход, это сохраняет состояние для того, когда Вы хотите выполнить следующее повторение. Вот пример его в действии, которое вытягивают непосредственно от список функции itertools :

def count(n=0):
    while True:
        yield n
        n += 1

, Как указано в описании функций (это количество () функция от itertools модуля...), это производит итератор, который возвращает последовательные целые числа, запускающиеся с n.

выражения Генератора являются целой другой кучей проблем (потрясающие черви!). Они могут использоваться вместо Понимание Списка для сохранения памяти (понимания списка создают список в памяти, которая уничтожается после использования, если не присвоенный переменной, но выражениям генератора может создать Объект генератора..., который является необычным способом сказать Итератор). Вот пример определения выражения генератора:

gen = (n for n in xrange(0,11))

Это очень похоже на наше определение итератора выше кроме полного спектра, предопределяется, чтобы быть между 0 и 10.

я просто нашел xrange () (удивил, я не видел его прежде...), и добавил его к вышеупомянутому примеру. xrange () является повторяемой версией [1 118] диапазон () , который имеет преимущество не предварительного создания списка. Было бы очень полезно, если бы Вы имели гигантский корпус данных для итерации и только имели такую память для выполнения в нем.

102
ответ дан jpp 27 July 2016 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: