Почему itertools.groupby может создать несколько групп с одним ключом при обработке последовательности?
База 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__)
В генераторе вспомогательная функция поднимает StopIteration. Какое исключение увидит потребитель?
От чего зависит, можно ли использовать объект ключом словаря, и почему изменение такого объекта после вставки может нарушить корректность поиска?
Можно ли полагаться на порядок элементов при обходе множества в 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 3.8 и новее?
При построении словаря через словарное включение несколько исходных элементов дают один и тот же ключ. Какое значение останется в результате?
Функция формирует список обработчиков внутри спискового включения, но после вызова все обработчики используют одно и то же последнее значение переменной цикла. Какой механизм 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]))
Как порядок предложений for и фильтров if в comprehension определяет порядок обхода результата?
В классе нет __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('завершён')
При делегировании одного генератора через yield from где окажется значение, возвращённое делегируемым генератором?
Зачем протокол Python требует, чтобы вызов iter() у самого итератора возвращал тот же объект?
Объясните механизм: куда попадает значение, переданное генератору методом send?
При обходе словаря изменение его размера приводит к ошибке, а изменение значения существующего ключа обычно нет. Каким механизмом Python различает эти случаи?
Что делает двухаргументная форма встроенной функции iter в Python?
Показано 21–40 из 48