База Hintsage

Коллекции и итераторы

Коллекции, comprehensions, iterators и generators.

Практика

Вопросы: Коллекции и итераторы

Генератор приостанавливается на yield, после чего его закрывают. Как завершится генератор при выполнении этого кода?

def stream():
    try:
        yield 'данные'
    except GeneratorExit:
        print('закрытие')

generator = stream()
print(next(generator))
generator.close()
print('завершён')
Программирование PythonКоллекции и итераторыPython-разработчик серверных приложений

В классе нет __iter__ и __reversed__, но определены __len__ и индексный доступ. Как reversed() обработает такой объект?

class Batch:
    def __init__(self, items):
        self.items = items

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

    def __getitem__(self, index):
        if not 0 <= index < len(self.items):
            raise IndexError
        return self.items[index]

batch = Batch(['a', 'b', 'c'])
print(list(reversed(batch)))

Оцените назначение __length_hint__ в этом итераторе: может ли его значение изменить элементы результата list()?

class Cursor:
    def __init__(self, items):
        self.items = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == len(self.items):
            raise StopIteration
        value = self.items[self.index]
        self.index += 1
        return value

    def __length_hint__(self):
        return 10_000

result = list(Cursor([1, 2, 3]))

Показано 1–20 из 48