Использование итератора в python?

78
14

Я только что узнал об итераторах на Python, но мне сложно их реализовать.

Я пытаюсь написать класс, чтобы этот цикл работал:

  odds = OddNumbers(13)
for i in odds:
print(i)

Я хочу написать функцию iter() и функцию next() для этого.

Пока у меня есть:

class OddNumbers:

def __init__(self, number):
self.number = number

def __iter__(self):
return self

def __next__(self):
current = self.number
if self.number%2 == 0:
return current
else:
raise StopIteration

Но на данный момент это ничего не возвращает. Я ожидаю, что выход будет

1
3
5
7
9
11
13

Помогите?

спросил(а) 2021-01-25T13:42:02+03:00 4 месяца, 3 недели назад
1
Решение
88

Ваш объект должен отслеживать его состояние и обновлять его при __next__.


class OddNumbers(object):
def __init__(self, number):
self.current = ...
self.number = number

def __iter__(self):
return self

def __next__(self):
# Update self.current
# If the limit has been reached, raise StopIteration
# Otherwise, return something

ответил(а) 2021-01-25T13:42:02+03:00 4 месяца, 3 недели назад
63

Для отслеживания текущего номера требуется другая переменная:

def __init__(self, number):
self.number = number
self.current = 1

Затем вам нужно сравнить его с конечным числом и, возможно, увеличить его:

def __next__(self):
if self.current > self.number:
raise StopIteration
current = self.current
self.current += 2
return current

ответил(а) 2021-01-25T13:42:02+03:00 4 месяца, 3 недели назад
45

Это даст вам объект, похожий на итератор, который предоставляет четные или нечетные числа. Однако он не удовлетворит вашу семантику цикла for, поскольку это не истинный итератор.

class NumberIterator(object):
"""Returns simple even/odd number iterators."""
def __init__(self, current):
self.current = current
def next(self):
self.current += 2
return self.current
@classmethod
def getOddIterator(cls):
return cls(-1) # start at 1
@classmethod
def getEvenIterator(cls):
return cls(0) # start at 2

odd_numbers = NumberIterator.getOddIterator()
even_numbers = NumberIterator.getEvenIterator()

odd_numbers.next() # Returns 1
odd_numbers.next() # Returns 3

ответил(а) 2021-01-25T13:42:02+03:00 4 месяца, 3 недели назад
45

Вероятно, существует гораздо более чистый способ сделать это, но вот быстрый удар:

class OddNumbers:

def __init__(self, number):
self.number = number

def __iter__(self):
self.current = self.number
return self

def __next__(self):
if self.current > 0:
if self.current % 2 == 0:
self.current -= 1
self.current -= 1
return self.current + 1
raise StopIteration

ответил(а) 2021-01-25T13:42:02+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема