14446
Вопросы про Python для чайников. Cпам и троллинг неприемлем. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Правила группы: https://t.me/ru_python_beginners/1649981
Не надо так делать. Итератор должен в своём __iter__ возвращать самого себя
ты в моем примере кода спрашиваешь какой смысл у атрибута Index?
Читать полностью…
Не стоит делать саму коллекцию итератором. Это вводит в заблуждение. (если коллекция используется не как итератор, то какой смысл несёт атрибут index?)
Если хочется сделать объект итерируемым, обычно можно использовать генератор в качестве итератора:
class XsAndYs:Читать полностью…
def __init__(self, xs, ys):
self.xs = xs
self.ys = ys
def __iter__(self):
yield from self.xs
yield from self.ys
Такой вопрос, насколько мне известно итератор у встроенных коллекций реализуется так:
- Допустим это list. Вызывая iter([1,2,3]), аргумент попадает в дандер итер самого класса list у которого под капотом Сpython делается - return list_iterator([1,2,3])
и уже iter класса list_iterator создает возвращает нам объект итератор.
Т.е класс list передает логику создания объекта итератора классу list_iterator
Теперь допустим я хочу создать свой класс, который должен уметь итерировать переданную в него коллекцию чуть по-другому(не важно как, просто чтобы аргументировать причину создания своей логики того, как нужно итерировать).
И вот в своем классе я пишу iter и next и вот мне лень передавать создание нового объекта итератора другому самописному классу - итератор, не хочу я его создавать и делаю внутри этого же своего класса iter(): return Мойкласс([1,2,3]) . Т.е внутри моего же класса реализую создание объекта итератора.
class MyIter:
def __init__(self, items):
self.items = items
self.index = 0
def __iter__(self):
return MyIter(self.items)
def __next__(self):
if self.index >= len(self.items):
raise StopIteration
value = self.items[self.index]
self.index += 2
return value
Ну условно в самом классе итераторе iter ретёрним self
А в пользовательском классе iter return class_iterator(самописный)_(obj)
ну если самописный класс итератор. То у него итер возвращает self, а уже в моем пользовательском классе итер возвращает самописный класс-генератор(список)
Читать полностью…
class Итератор:
def __getitem__(self, i):
if i == 0:
return 'раз'
elif i == 1:
return 'два'
elif i == 2:
return 'три'
raise IndexError
for a in Итератор():
print(a)
нет, он о том что у итератора должен быть реализован вот так:
def __iter__(self):Читать полностью…
return self
Ну ладно, частично можно, но это не очень очевидно
Читать полностью…
Не, можешь в определении итератора в доке питона глянуть
Читать полностью…
Ну вообще у итератора кроме того что должен быть реализован __iter__ он еще должен иметь довольно конкретную реализацию
Эт я знаю, вопрос в том, есть ли разница между такой реализацией как у list, когда лист внутри себя создает экземляр класса list_iterator и когда класс внутри себя, создает экземляр самого себя, который тоже итератор.
По сути и первая и вторая реализация делают одно и тоже. только в первом случае это делает через посредника list_iterator а во втором случае экземпляр самого себя. И тот и другой вариант же рабочий. Но во втором случае нет необходимости создавать второй класс как list_iterator чтобы передавать ему создание экземпляра
Но если смысл объекта в том, что он итератор, то в нём и нужно сделать __iter__ и __next__. Только лучше сделать items внутренним атрибутом (self._items = items)
list_iterator — это уже итератор, у него __iter__ возвращает самого себя.
class list:Читать полностью…
def __iter__(self):
return list_iteartor(...)
class list_iterator:
def __iter__(self):
return self
def __next__(self):
...
Я еще узнал, если я конечно правильно все понял, что взависимости от того, какой объект передан в next то под капотом Cpython вызывается сишный iternext для итератора и сишный send с по умолчанию none для генератора
Читать полностью…
Если у тебя условно самописные списки и самописные итераторы для них
Читать полностью…
выводить должен принт каждый элемент списка
Читать полностью…
Если не хочешь сразу в доку глядеть можешь подумать что должно произойти когда мы делаем
lst = [1, 2, 3]Читать полностью…
it = iter(lst)
for i in it:
print(i)
Это не что-то до чего можно дойти подумав
Читать полностью…
Ну ты в первой строке итерабл и итератор перепутал
Читать полностью…
ты про то, что например в классе dict должен вернуть class dict_iterator и аналогично в других классах ?
Читать полностью…