Chcę wiedzieć, czy wygenerowana sekwencja ma mniej niż 2 wpisy.Jak poznać wygenerowaną sekwencję jest co najwyżej pewnej długości
>>> def sequence():
... for i in xrange(secret):
... yield i
Moja nieefektywna metoda jest stworzenie listy, i zmierzyć jego długość:
>>> secret = 5
>>> len(list(sequence())) < 2
True
Oczywiście, to zużywa cały generator.
W moim prawdziwym przypadku generator może przechodzić przez dużą sieć. Chcę wykonać test bez zużywania całego generatora lub budowania dużej listy.
Jest recipe in the itertools documentation:
def take(n, iterable):
"Return first n items of the iterable as a list"
return list(islice(iterable, n))
To buduje tylko listę max długości n
, która jest lepsza.
Więc mogę powiedzieć:
>>> len(take(2, sequence()) < 2
Czy jest jeszcze bardziej pythonic, skuteczny sposób to zrobić?
To jest wielkie pytanie Peter Wood - My naiwne podejście byłoby uzyskując wstępną dwa elementy i przechowuj je, ale musi być lepszy sposób. Ciekawi mnie to. Wątpię, by generator mógł poznać swój własny rozmiar, zanim zostanie skonsumowany. –
Silnie niepowiązanych, ale z zasady należy wystrzegać się 'list (iterator)', iteratory mogą być nieskończone ... –
Z pewnością kluczowe pytanie brzmi - jak byś wiedział, * bez * spożywania iteratora, jeśli to będzie wystarczająco długie (lub wystarczająco krótko? Twój tytuł wydaje się być w konflikcie z pytaniem)? Czy masz jakieś inne informacje, które pozwolą ci to ustalić? – jonrsharpe