Есть xs = [1, 2, 3], it = iter(xs), затем it2 = iter(it). Какое утверждение верно?
A
it2 ссылается на тот же итератор, что и it, и разделяет с ним состояниеB
it2 представляет независимый итератор от iter(xs) с обходом зановоC
it2 оказывается копией списка xs, эквивалентной вызову list(it)D
it2 превращается в кортеж со всеми оставшимися элементами xsПравильный ответ.
iter() от уже существующего итератора возвращает тот же объект, так что общее состояние сохраняется.Разбор
Итераторы в Python реализуют метод __iter__, возвращающий self. Поэтому iter(it) отдаёт тот же объект it, а не новый итератор и не копию данных. После it2 = iter(it) оба имени указывают на один и тот же итератор, и любой next(it2) сдвигает позицию, видимую и через it. Чтобы получить независимый обход, нужно сделать новый итератор, например iter(xs) ещё раз.
Проверь себя · 1/3разбор после ответа
Функция-генератор
squares(n) делает yield i * i для i из range(n). Чему равно list(squares(3))?Ещё вопросы по теме «Итераторы и генераторы»
- Есть `xs = [1, 2, 3]` и `it = iter(xs)`. Сначала выполняется `a = list(it)`, а затем `b = list(it)`. Чему равно `b`?
- Есть `it = iter(['a', 'b'])`. Что вернёт самый первый вызов `next(it)` сразу после создания итератора?
- Дан генератор: `def gen(): print("A"); yield 1; print("B"); yield 2`. Сразу после `g = gen()` что будет выведено в консоль?
- Что создаёт выражение `squares = (x * x for x in xs)`?
- В отладке вы сделали `pairs = zip(users, spends)`, затем `debug = list(pairs)`. После этого `d = dict(pairs)` оказался пустым словарём. Почему?
- Все вопросы по «Итераторы и генераторы» →