🐍 Python  ·  20 вопросов  ·  ~50 мин  ·  ⏱ Таймер 50:00  ·  Средний  · 

Итераторы и генераторы

Проверяет ленивые вычисления, yield, протокол итерации и однократный обход. Чтобы пройти его уверенно, мало узнать знакомую запись — нужно восстановить ход программы и обосновать выбор во всех четырёх направлениях. Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
Сравните `iterable` и полученный из него итератор. Какие два результата проверок идентичности будут выведены?
Python
values=[1,2]
it=iter(values)
print(iter(values) is iter(values), iter(it) is it)
Вопрос 2 из 20
Что произойдёт после исчерпания?
Python
it=iter([1])
print(next(it))
try:
    print(next(it))
except StopIteration:
    print("stop")
Вопрос 3 из 20
Проследите создание генератора и первый `next`. В каком порядке появятся `made`, `start` и значение?
Python
def gen():
    print("start")
    yield 1
g=gen()
print("made")
print(next(g))
Вопрос 4 из 20
Главное преимущество ленивого генератора при обработке большого файла?
Вопрос 5 из 20
Какое условие в `__next__` останавливает показанный итератор ровно после значений 1, 2 и 3?
Python
class Count:
    def __init__(self,n): self.n=n; self.i=0
    def __iter__(self): return self
    def __next__(self):
        if self.i>=self.n: raise StopIteration
        self.i+=1; return self.i
print(list(Count(3)))
Вопрос 6 из 20
Какой список даст yield from?
Python
def g():
    yield 0
    yield from [1,2]
    yield 3
print(list(g()))
Вопрос 7 из 20
Вызов `list(generator)` для бесконечного генератора — ошибка проектирования. Что произойдёт?
Вопрос 8 из 20
Первый `next(it)` приостанавливает генератор на `yield "ready"`. Как затем значение из `send(5)` проходит через выражение `yield` и что окажется в выводе?
Python
def g():
    x=yield "ready"
    yield x*2
it=g()
print(next(it), it.send(5))
Вопрос 9 из 20
Генератор сначала делает `yield 1`, затем `return 9`. Какие значения покажет код при двух шагах обхода?
Python
def g():
    yield 1
    return 9
it=g(); print(next(it))
try:
    next(it)
except StopIteration as e:
    print(e.value)
Вопрос 10 из 20
Два обхода контейнера мешают друг другу из-за единственной общей позиции. Какое исправление сделает обходы независимыми?
Вопрос 11 из 20
`zip` запрашивает элементы слева направо и останавливается на более коротком генераторе. Что произойдёт с третьим элементом первого генератора и каков полный вывод?
Python
a=(x for x in [1,2,3])
b=(x for x in [10,20])
print(list(zip(a,b)), list(a))
Вопрос 12 из 20
`iter(callable, 0)` вызывает функцию до значения-сторожа. Какой список будет получен?
Python
values=iter([3,2,0,5])
f=lambda: next(values)
print(list(iter(f,0)))
Вопрос 13 из 20
Результат потенциально велик и будет прочитан только один раз. Какое проектное решение выбрать: генераторное выражение или список?
Вопрос 14 из 20
После `list(enumerate(it, 2))` второй вызов `list(it)` пуст. Какая деталь показанного кода это объясняет?
Python
it=iter("abc")
print(list(enumerate(it,2)), list(it))
Вопрос 15 из 20
Почему побочный эффект внутри генератора может возникнуть позже ожидаемого?
Вопрос 16 из 20
Что произойдёт при повторном list?
Python
def g():
    for i in range(2): yield i
x=g()
print(list(x), list(x))
Вопрос 17 из 20
Как ограничить первые 100 элементов потенциально бесконечного iterable?
Вопрос 18 из 20
Генератор приостановлен после первого `yield`, затем вызывается `close()`. Как эта операция запускает очистку и какая последовательность получается?
Python
def g():
    try:
        yield 1
        yield 2
    finally:
        print("closed")
it=g(); print(next(it)); it.close()
Вопрос 19 из 20
Чем `next(it, default)` отличается от обычного `next(it)`?
Вопрос 20 из 20
Какой результат у map?
Python
m=map(lambda x:x*2,[1,2,3])
print(next(m), list(m))

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу