funkcje Itertool¶

następujące funkcje modułu konstruują i zwracają Iteratory. Niektóre dostarczają strumienie o nieskończonej długości, więc powinny być dostępne tylko przez funkcje, które obcinają strumień.

itertools.accumulate(iterable)¶

wykonaj iterator, który zwraca zgromadzone sumy lub akumulowane wyniki innych funkcji binarnych (określonych za pomocą argumentu optionalfunc).,

Jeśli podano func, powinna być to funkcja dwóch argumentów. Elementy wejścia iterowalne mogą być dowolnymi typami, które mogą być przyjęte jako argumenty func. (Na przykład, z domyślną operacją dodawania, elementami mogą być dowolne typy addabletype, w tym Decimal lubFraction.)

zazwyczaj liczba elementów wyjściowych jest zgodna z iterowalnym wejściem.Jednakże, jeśli podany jest argument słowa kluczowego initial, Accumulation prowadzi z wartością początkową, tak że output jest o jeden więcej elementów niż wejście iterowalne.,

w przybliżeniu odpowiednik:

istnieje wiele zastosowań argumentu func. Można go ustawić namin() dla uruchomionego minimum, max() dla uruchomionego maksimum luboperator.mul() dla uruchomionego produktu. Tabele amortyzacyjne mogą być budowane poprzez gromadzenie odsetek i stosowanie płatności. Relationscurrence pierwszego rzędu można modelować przez podanie wartości początkowej w iterowalnym i użycie tylko sumy skumulowanej w argumencie func:

Patrzfunctools.reduce() dla podobnej funkcji, która zwraca tylko ostateczną skumulowaną wartość.,

nowość w wersji 3.2.

zmiana w wersji 3.3: Dodano opcjonalny parametr func.

zmiana w wersji 3.8: Dodano opcjonalny parametr początkowy.

itertools.chain(*iterables)¶

wykonaj iterator, który zwróci elementy z pierwszej iterabli, dopóki nie zostanie przerwany, a następnie przejdzie do następnej iterabli, dopóki wszystkie iterableb nie zostaną przerwane. Używany do traktowania kolejnych sekwencji jako pojedynczej sekwencji.,W przybliżeniu odpowiednik:

def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element

classmethodchain.from_iterable(iterable)¶

alternatywny konstruktor dla chain(). Pobiera łańcuchowe dane wejściowe zpojedynego iterowalnego argumentu, który jest oceniany leniwie. Mniej więcej odpowiednik:

def from_iterable(iterables): # chain.from_iterable() --> A B C D E F for it in iterables: for element in it: yield element

itertools.combinations(iterable, r)¶

zwraca długość r kolejnych elementów z wejścia iterable.,

krotki kombinowane są emitowane w porządku leksykograficznym zgodnie z kolejnością iterowalnego wejścia. Tak więc,jeśli Dane wejściowe iterowalne są posortowane, krotki kombinowane będą produkowane w kolejności posortowanej.

elementy są traktowane jako unikalne na podstawie ich pozycji, a nie wartości. Jeśli więc elementy wejściowe są unikalne, w każdej kombinacji nie będzie powtarzalnych wartości.,

w przybliżeniu odpowiednik:

kod combinations()może być również wyrażony jako następstwo permutations() po filtrowaniu wpisów, w których elementy nie są posortowane w kolejności (zgodnie z ich pozycją w Puli wejściowej):

liczba zwracanych pozycji wynosi n! / r! / (n-r)!kiedy 0 <= r <= nlub Zero kiedy r > n.,

itertools.combinations_with_replacement(iterable, r)¶

zwraca długość r kolejne elementy z wejścia iterable, dzięki czemu poszczególne elementy mają być powtórzone więcej niż jeden raz.

krotki kombinowane są emitowane w porządku leksykograficznym zgodnie z kolejnością iterowalnego wejścia. Tak więc,jeśli Dane wejściowe iterowalne są posortowane, krotki kombinowane będą produkowane w kolejności posortowanej.

elementy są traktowane jako unikalne na podstawie ich pozycji, a nie wartości. Więc jeśli elementy wejściowe są unikalne, wygenerowane kombinacje również będą unikalne.,

mniej więcej odpowiednik:

kod combinations_with_replacement() można również wyrazić jako następstwo product() po filtrowaniu wpisów, w których elementy nie są uporządkowane (w zależności od ich pozycji w Puli wejściowej):

liczba zwracanych pozycji wynosi (n+r-1)! / r! / (n-1)! gdy n > 0.

nowość w wersji 3.1.,

itertools.compress(dane, selektory)¶

Utwórz iterator, który filtruje elementy z danych zwracających tylko te, które mają odpowiedni element w selektorach, który ocenia doTrue.Zatrzymuje się, gdy dane lub selektory zostaną wyczerpane.Mniej więcej odpowiednik:

def compress(data, selectors): # compress('ABCDEF', ) --> A C E F return (d for d, s in zip(data, selectors) if s)

nowość w wersji 3.1.

itertools.count(start=0, step=1)¶

wykonaj iterator, który zwraca równomiernie rozmieszczone wartości rozpoczynające się od początku numeru., Często używany jako argument domap() do generowania kolejnych punktów danych.Ponadto, używany z zip() do dodawania numerów sekwencji. Mniej więcej równoważne:

def count(start=0, step=1): # count(10) --> 10 11 12 13 14 ... # count(2.5, 0.5) -> 2.5 3.0 3.5 ... n = start while True: yield n n += step

podczas liczenia liczb zmiennoprzecinkowych, lepsza dokładność może być czasami osiągnięta przez zastąpienie kodu mnożnikowego, takiego jak: (start + step * ifor i in count()).

zmiana w wersji 3.1: dodano argument step I dozwolone argumenty nie-integer.,

itertools.cycle(iterable)¶

wykonaj iterator zwracający elementy z iterable i zapisujący ich kopię.Gdy iterable jest wyczerpany, zwraca elementy z zapisanej kopii. Powtarza się definitywnie. Mniej więcej odpowiednik:

Uwaga, Ten element zestawu narzędzi może wymagać znaczącej pamięci pomocniczej(w zależności od długości iterowalnej).,

itertools.dropwhile(predykat, iterable)¶

tworzy iterator, który usuwa elementy z iterable tak długo, jak predykat jest prawdziwy; następnie zwraca każdy element. Uwaga: iterator nie generuje danych wyjściowych, dopóki predykat nie stanie się false, więc może mieć dłuższy czas rozruchu. Mniej więcej równoważne:

itertools.filterfalse(predykat, iterable)¶

Utwórz iterator, który filtruje elementy z iterable zwracając tylko te, dla których predykatem jestFalse., Jeśli predykatem jest None, zwróć wartości, które są fałszywe. Mniej więcej odpowiednik:

itertools.groupby(iterable, key=None)¶

Stwórz iterator, który zwraca kolejne klucze i grupy z iterable.Klucz jest funkcją obliczającą wartość klucza dla każdego elementu. Jeśli nie jest określony lub jest None, domyślnie klucz jest funkcją tożsamościową i zwraca element bez zmian. Ogólnie rzecz biorąc, iterable musi być już posortowane na tej samej kluczowej funkcji.,

działaniegroupby() jest podobne do działania filtrauniq w Uniksie. Generuje break lub nową grupę za każdym razem, gdy zmienia się wartość funkcji kluczowej(dlatego zwykle konieczne jest posortowanie danych przy użyciu tej samej funkcji kluczowej). To zachowanie różni się od grupy SQL, w której agreguje wspólne elementy niezależnie od ich kolejności wprowadzania.

zwracana Grupa sama w sobie jest iteratorem współdzielącym podstawową iterabewith groupby()., Ponieważ źródło jest współdzielone, gdy obiekt groupby()jest zaawansowany, poprzednia grupa nie jest już widoczna. Tak więc, jeśli te dane będą potrzebne później, powinny być zapisane jako lista:

groupby() jest mniej więcej równoważne:

itertools.islice(iterable, stop)¶itertools.islice(iterable, START, STOP)

tworzy iterator, który zwraca wybrane elementy z iterable. Jeżeli start nie jest równe-zero, wtedy elementy z iterable są pomijane do momentu osiągnięcia start.,Następnie elementy są zwracane kolejno, chyba że step jest ustawiony wyżej niż one, co skutkuje pominięciem elementów. Jeśli stop jest None, to iteracja trwa do wyczerpania iteratora, jeśli w ogóle; w przeciwnym razie zatrzymuje się na określonej pozycji. W przeciwieństwie do zwykłego krojenia, islice() nie obsługuje wartości początkowych dla start, stop lub step. Może być używany do wyodrębniania relatedfields z danych, w których struktura wewnętrzna została spłaszczona(na przykład raport amulti-line może wyświetlać pole name w co trzeciej linii)., Mniej więcej równoważne:

Jeśli start wynosiNone, iteracja rozpoczyna się od zera. Jeśli krok jest None, to krok jest domyślnie ustawiony na jeden.

itertools.(iterable, R=None)¶

zwraca kolejne permutacje długości r elementów w iterable.

Jeśli r nie jest określony lub jestNone, to r domyślnie jest lengthof iterable i generowane są wszystkie możliwe permutacje pełnej długości.

krotki permutacji są emitowane w porządku leksykograficznym zgodnie z kolejnością iterowalnego wejścia., Tak więc,jeśli Dane wejściowe iterowalne są posortowane, krotki kombinowane będą produkowane w kolejności posortowanej.

elementy są traktowane jako unikalne na podstawie ich pozycji, a nie wartości. Więc jeśli elementy wejściowe są unikalne, nie będzie powtórzeń wartości w każdej permutacji.,

w przybliżeniu odpowiednik:

kod permutations() może być również wyrażony jako następstwoproduct(), filtrowany w celu wykluczenia wpisów z powtarzającymi się elementami (tymi z tej samej pozycji w Puli wejściowej):

Liczba zwracanych pozycji to n! / (n-r)! gdy 0 <= r <= nlub Zero, gdy r > n.

itertools.product(*iterables, repeat=1)¶

iloczyn kartezjański iterables wejściowych.,

zagnieżdżone pętle cykają się jak licznik przebiegu z najbardziej wysuniętym na prawo elementem w każdej iteracji. Ten wzorzec tworzy uporządkowanie leksykograficzne tak, że jeśli iteraby wejścia są posortowane, krotki produktu są emitowane w sortedorder.

aby obliczyć iloczyn iterowalny z samym sobą, określ liczbę powtórzeń za pomocą opcjonalnego argumentu słowa kluczowego repeat. Na przykładproduct(A, repeat=4) oznacza to samo co product(A, A, A, A).,

Ta funkcja jest w przybliżeniu równoważna poniższemu kodowi, z tą różnicą, że implementacja ACTUAL nie tworzy pośrednich wyników w pamięci:

zanimproduct() zostanie uruchomiona,całkowicie zużywa iteraby wejściowe, zachowując pulę wartości w pamięci do generowania produktów. W związku z tym jest to przydatne tylko przy skończonych wejściach.

itertools.repeat(obiekt)¶

tworzy iterator, który zwraca obiekt w kółko. Uruchamia się w nieskończoność bez podania argumentu times., Używany jako argument do map() dla zmiennych parametrów wywołanej funkcji. Używany również z zip() do tworzenia niezmiennej części rekordu krotki.

w przybliżeniu odpowiednik:

powszechnym zastosowaniem repeat jest dostarczanie strumienia stałych wartości do mapor zip:

>>> list(map(pow, range(10), repeat(2)))

itertools.starmap(function, iterable)¶

stwórz iterator, który oblicza funkcję za pomocą argumentów uzyskanych z iterable., Używany zamiast map(), gdy parametry argumentów są już grupowane w krotkach z pojedynczej iterowalnej (dane zostały „wstępnie spakowane”). Różnica pomiędzy map()Istarmap()paralelnie odróżniafunction(a,b)Ifunction(*c). Mniej więcej równoważne:

def starmap(function, iterable): # starmap(pow, ) --> 32 9 1000 for args in iterable: yield function(*args)

itertools.takewhile(predykat, iterable)¶

wykonaj iterator, który zwraca elementy z iterable tak długo, jak predykat jest prawdziwy., W przybliżeniu odpowiednik:

def takewhile(predicate, iterable): # takewhile(lambda x: x<5, ) --> 1 4 for x in iterable: if predicate(x): yield x else: break

itertools.tee(iterable, n=2)¶

zwraca n niezależnych iteratorów z pojedynczej iterable.

poniższy kod Pythona pomaga wyjaśnić, co robi tee (chociaż implementacja actualimplementation jest bardziej złożona i używa tylko jednej kolejki podkładowej).

w przybliżeniu odpowiednik:

Gdytee() dokonał podziału, oryginalna iterable nie powinna być używana nigdzie indziej; w przeciwnym razie iterable może zostać rozbudowany bez informowania obiektów tee.,

tee Iteratory nie są threadsafe. RuntimeError może być wywołane, gdy używa się jednocześnie iteratorów zwracanych przez to samo wywołanietee(), nawet jeśli oryginalna iterable to threadsafe.

Ten itertool może wymagać znaczącej pamięci pomocniczej (w zależności od tego, jak wiele tymczasowych danych musi być przechowywanych). Ogólnie rzecz biorąc, jeśli jeden iterator używa większości lub wszystkich danych przed uruchomieniem innego iteratora, szybsze jest użycielist() zamiast tee().,

itertools.zip_longest(*iterables, fillvalue=None)¶

Utwórz iterator agregujący elementy z każdej iterabli. Jeśli dane są nierównej długości, brakujące wartości są uzupełniane fillvalue.Iteracja trwa do wyczerpania najdłuższej iteracji. Mniej więcej odpowiednik:

Jeśli jedna z iterabli jest potencjalnie nieskończona, to funkcja zip_longest()powinna być owinięta czymś, co ogranicza liczbę wywołań (na przykład islice()lubtakewhile())., Jeśli nie podano, wartość fillvalue ma wartość domyślną None.