1

Код

class CitiesManager(object):
    """Класс, содержащий функциональность работы с городами."""

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

    def __getitem__(self, item: int):
        """Получить элемент по индексу.

        Args:
            item (int): индекс элемента для получения в операциях среза.
        """
        return self.cities[item]

    def __len__(self):
        return len(self.cities)

    def __iter__(self):
        """Возвратить себя как объект итератора."""
        return self

    def __next__(self):
        """Получить следующий элемент """
        for item in self.cities:
            yield item

cities = ['Петрозаводск', 'Хельсинки', 'Санкт-Петербург']
north_cities = CitiesManager(cities)


for city in north_cities:
    print(city)

выводит подобное:

<generator object __next__ at 0x7f13de432d58>
<generator object __next__ at 0x7f13de432c50>
<generator object __next__ at 0x7f13de432d58>
<generator object __next__ at 0x7f13de432c50>
<generator object __next__ at 0x7f13de432d58>

Почему? Я хочу, что бы он выводил строки "Петрозаводск", "Хельсинки", "Санкт-Петербург"

jfs
  • 52,361
pynista
  • 1,162
  • что мешает print(*cities) написать? – jfs Mar 21 '18 at 15:47
  • @jfs вероятно, мешает желание разобраться с итераторами. – Sergey Gornostaev Mar 21 '18 at 15:58
  • @SergeyGornostaev: cities это список, а не итератор. Синтаксис со звёздочкой можно не использовать. Вопрос, почему нельзя for city in cities: print(city) написать? – jfs Mar 21 '18 at 16:02
  • Я хочу использовать данный класс как контейнер множества городов и добавить к этому классу другой функционал, например фильтрацию по населению и т.д. 2) я хочу хорошо понять как работают итераторы
  • – pynista Mar 21 '18 at 16:04
  • @jfs именно потому, что cities - это список, а не итератор, пытаясь разобраться с итераторами, нельзя написать print(*cities) или for city in cities: print(city). – Sergey Gornostaev Mar 21 '18 at 16:10
  • @SergeyGornostaev для тех из нас кто мысли автора не умеет читать вопрос должен быть в самом вопросе с помощью слов написан¶ К примеру ваш ответ вводит в заблуждение так как класс в нём не определяет итератор. Не ясно хочет автор именно итератор создать или что-то другое. – jfs Mar 21 '18 at 16:15