Вместо
if any(x in filename for x in prefixes):
# do stuff with x
вы можете сделать:
x = next((p for p in prefixes if p in filename), None)
if x:
# do stuff with x
Это создает генератор и получает из него следующее значение, то есть первое значение.Второй аргумент None
- это значение часового: если итератор вызывает StopIteration
, а не передает это исключение, то возвращается None
и связывается с x
.
Это неВыглядит здесь так полезно, но это действительно удобно, когда вам нужен первый элемент последовательности, удовлетворяющий условию, и резервная операция, если такого элемента нет:
elt = next((x for x in range(10) if x > 5), None)
if elt is not None:
print("{} satisfies the condition".format(elt))
else:
print("No such element found")
Обратите внимание, что генераторыИтераторы тоже, так что вы можете напрямую вызывать next
на них.С такой итерацией, как список, диктовкой или чем-то еще, вам нужно сначала вызвать iter
.Например, полезно взять произвольное значение из словаря:
value = next(iter(d.values()))