В практической ситуации один генератор передали двум потребителям: какое свойство определит, увидит ли второй потребитель элементы?
База Hintsage
Коллекции и итераторы
Коллекции, comprehensions, iterators и generators.
Практика
Вопросы: Коллекции и итераторы
Как изменяется область видимости переменной цикла в списковом включении по сравнению с обычным циклом?
Разберите ошибку: почему объект может поддерживать обход в цикле, но не поддерживать вызов next напрямую?
Функция-генератор возвращает значение через return. Какой результат даст код и где окажется число 42?
def load():
yield 1
return 42
iterator = load()
print(next(iterator))
try:
next(iterator)
except StopIteration as error:
print(error.value)
Во время обхода списка из него удаляют элементы. Почему следующий элемент после удалённого может быть пропущен?
Когда генераторное выражение вычисляет тело элемента: при создании выражения или при получении очередного элемента?
В генераторе вызвали другой генератор обычным вызовом. Почему его элементы не становятся результатом внешнего обхода?
После создания представления ключей словаря исходный словарь изменили. Что увидит представление при последующем обходе?
Что делает двухаргументная форма встроенной функции iter в Python?
При обходе словаря изменение его размера приводит к ошибке, а изменение значения существующего ключа обычно нет. Каким механизмом Python различает эти случаи?
Объясните механизм: куда попадает значение, переданное генератору методом send?
Зачем протокол Python требует, чтобы вызов iter() у самого итератора возвращал тот же объект?
При делегировании одного генератора через yield from где окажется значение, возвращённое делегируемым генератором?
Генератор приостанавливается на yield, после чего его закрывают. Как завершится генератор при выполнении этого кода?
def stream():
try:
yield 'данные'
except GeneratorExit:
print('закрытие')
generator = stream()
print(next(generator))
generator.close()
print('завершён')
Сравните списковое включение и генераторное выражение при обработке большого потока: какое ключевое различие определяет пиковое потребление памяти?
В классе нет __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)))
Как порядок предложений for и фильтров if в comprehension определяет порядок обхода результата?
Оцените назначение __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]))
Функция формирует список обработчиков внутри спискового включения, но после вызова все обработчики используют одно и то же последнее значение переменной цикла. Какой механизм Python объясняет результат?
При построении словаря через словарное включение несколько исходных элементов дают один и тот же ключ. Какое значение останется в результате?
Показано 1–20 из 48