Определение пустоты генератора
В Python генераторы — это мощный инструмент для отложенных вычислений и перебора больших наборов данных. Однако определение того, пуст ли генератор, представляет собой уникальную задачу из-за его динамической природы. В отличие от списков или кортежей, генераторы не имеют атрибута размера, и простая итерация по ним приведет к исключению StopIteration.
Peek vs. HasNext
Некоторые могут предложить используя функцию peek(), чтобы проверить, есть ли в генераторе элементы. Хотя функция peek() позволяет получить первый элемент генератора, не потребляя его, она не позволяет определить, пуст ли генератор. Это связано с тем, что peek() вызывает исключение StopIteration, когда генератор пуст, что неотличимо от исключения, которое может быть вызвано при попытке перебрать пустой генератор.
Аналогично, функция hasNext() обычно найден в Java, недоступен в генераторах Python.
Проверка пустоты из Start
Чтобы определить, пуст ли генератор с самого начала, вы можете использовать пользовательскую функцию, подобную той, что указана в ответе:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Эта функция извлекает первый элемент генератора, возвращая None, если генератор пуст. Он также сохраняет состояние генератора, возвращая измененную версию, включающую первый элемент.
Использование
Чтобы использовать эту функцию, вы можете вызвать ее с генератором в качестве аргумент:
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.
Эта проверка позволяет определить, пуст ли генератор, и соответствующим образом обработать пустой случай перед его итерацией.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3