Определить, если функция генератора пуста, в противном случае выполнить итерацию - PullRequest
0 голосов
/ 24 декабря 2018

Предположим, у нас есть генераторная функция gen(), которую мы не знаем, если она пустая или нет.

Если она пустая, мы хотели бы выполнить специальную функцию foo(),в противном случае мы хотели бы выполнить функцию для каждого элемента итератора bar(elem).

. Я могу сделать это так:

is_empty = True
for elem in gen():
    is_empty = False
    bar(elem)
if is_empty: foo()

Но это не выглядит очень питонно.Любой другой подход?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Есть функция peek:

import itertools
def peek(iterable):
    try:
        first = next(iterable)
    except StopIteration:
        return None
    return first, itertools.chain([first], iterable)

res = peek(gen())
if not res:
    foo()
else:
    for elem in res[1]:
        bar(elem)

Вам все равно нужно заглянуть в генератор, но вы можетеделай это чисто.

0 голосов
/ 24 декабря 2018

Вы не можете сказать напрямую, является ли генератор пустым.Это по замыслу.Ключевой принцип генераторов заключается в том, что они не хранят в памяти все элементы сгенерированной последовательности.

Но вы можете сделать что-то вроде этого:

from itertools import chain

def check_first_and_iterate(iterable):
    try:
        first = next(iterable)
        for item in chain([first], item):
            bar(item)
    except StopIteration:
        foo()

check_first_and_iterate(iterable)
...