База Hintsage

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

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

Практика

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

Сервис сопоставляет записи из двух источников и должен обнаружить рассинхронизацию длин. Как завершится выполнение этого кода?

left = [101, 102, 103]
right = ["ok", "retry"]

pairs = zip(left, right, strict=True)
try:
    print(list(pairs))
except ValueError as error:
    print(type(error).__name__)
Программирование PythonКоллекции и итераторыPython-разработчик серверных приложений

Определите вывод программы и объясните, в какой точке генератора обрабатывается исключение, переданное через throw().

def worker():
    try:
        yield "готов"
    except ValueError as error:
        yield f"обработано: {error}"
        yield "завершение"

generator = worker()
print(next(generator))
print(generator.throw(ValueError("ошибка")))
print(next(generator))
Программирование PythonКоллекции и итераторыPython-разработчик, создающий генераторы и потоковые конвейеры

Оцените назначение __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]))

В классе нет __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)))

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

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

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

Показано 2140 из 48