Itertools in Python 3, Beispiel

Itertools in Python 3, Beispiel

Es wurde als gem und http://jmduke.com/posts/a-gentle-introduction-to-itertools/bezeichnet. ["So ziemlich das Coolste, was es je gab"] und wenn Sie noch nichts davon gehört haben, verpassen Sie eine der größten Ecken der Python 3-Standardbibliothek: + itertools +.

Es gibt eine Handvoll hervorragender Ressourcen, um zu erfahren, welche Funktionen im Modul + itertools + verfügbar sind. Die docs selbst sind ein guter Anfang. Dies gilt auch für dieser Beitrag.

Die Sache mit "+ itertools +" ist jedoch, dass es nicht ausreicht, nur die Definitionen der darin enthaltenen Funktionen zu kennen. Die wahre Stärke liegt in der Zusammenstellung dieser Funktionen, um schnellen, speichereffizienten und gut aussehenden Code zu erstellen.

Dieser Artikel verfolgt einen anderen Ansatz. Anstatt Ihnen "+ itertools +" eine Funktion nach der anderen vorzustellen, werden Sie praktische Beispiele erstellen, die Sie zum "iterativen Denken" ermutigen sollen. Im Allgemeinen beginnen die Beispiele einfach und nehmen allmählich an Komplexität zu.

Ein Wort der Warnung: Dieser Artikel ist lang und für den fortgeschrittenen Python-Programmierer gedacht. Bevor Sie eintauchen, sollten Sie sicher sein, Iteratoren und Generatoren in Python 3, Mehrfachzuweisungen und das Entpacken von Tupeln zu verwenden. Wenn Sie dies nicht tun oder Ihr Wissen auffrischen müssen, sollten Sie Folgendes prüfen, bevor Sie weiterlesen:

Alles bereit? Beginnen wir den Weg, den eine gute Reise gehen sollte - mit einer Frage.

Was ist + Itertools + und warum sollten Sie es verwenden?

Laut https://docs.python.org/3/library/itertools.html [+ itertools + docs] handelt es sich um ein Modul, das eine Reihe von Iterator-Bausteinen implementiert, die von Konstrukten von APL, Haskell, inspiriert sind und SML… Zusammen bilden sie eine 'Iteratoralgebra', die es ermöglicht, spezielle Tools in reinem Python kurz und effizient zu erstellen. “

Im Grunde bedeutet dies, dass die Funktionen in + itertools + "auf Iteratoren arbeiten", um komplexere Iteratoren zu erzeugen. Betrachten Sie beispielsweise die Funktion https://docs.python.org/3/library/functions.html#zip[built-in + zip () +, die eine beliebige Anzahl von Iterables als Argumente verwendet und eine zurückgibt Iterator über Tupel der entsprechenden Elemente:

>>>

>>> list(zip([1, 2, 3], ['a', 'b', 'c']))
[(1, 'a'), (2, 'b'), (3, 'c')]

Wie genau funktioniert + zip () +?

+ [1, 2, 3] + und + ['a', 'b', 'c'] + sind wie alle Listen iterierbar, dh sie können ihre Elemente einzeln zurückgeben. Technisch gesehen ist jedes Python-Objekt, das die Methoden + . iter () + oder + . getitem () + implementiert, iterierbar. (Eine ausführlichere Erläuterung finden Sie im Python 3 docs glossary.)

Die https://docs.python.org/3/library/functions.html#iter [+ iter () + integrierte Funktion] gibt beim Aufrufen einer iterablen Datei eine https://docs.python zurück. org/3/library/stdtypes.html # typeiter [iterator object] für diese iterable:

>>>

>>> iter([1, 2, 3, 4])
<list_iterator object at 0x7fa80af0d898>

Unter der Haube funktioniert die Funktion "+ zip () " im Wesentlichen, indem sie " iter () " für jedes ihrer Argumente aufruft und dann jeden von " iter () " zurückgegebenen Iterator mit " next" vorschiebt () + und Aggregation der Ergebnisse in Tupel. Der von `+ zip () + zurückgegebene Iterator iteriert über diese Tupel.

https://docs.python.org/3/library/functions.html#map[Die integrierte Funktion + map () + `ist ein weiterer„ Iteratoroperator “, der in seiner einfachsten Form einen einzelnen Operator anwendet. Parameterfunktion für jedes Element eines iterierbaren Elements zu einem Zeitpunkt:

>>>

>>> list(map(len, ['abc', 'de', 'fghi']))
[3, 2, 4]

Die Funktion + map () + ruft beim zweiten Argument + iter () + auf, rückt diesen Iterator mit + next () + vor, bis der Iterator erschöpft ist, und wendet die an sein erstes Argument übergebene Funktion an auf den Wert, der bei jedem Schritt von + next () + zurückgegeben wird. Im obigen Beispiel wird "+ len () " für jedes Element von " [" abc "," de "," fghi "] +" aufgerufen, um einen Iterator über die Länge jeder Zeichenfolge in der Liste zurückzugeben.

Da https://docs.python.org/3/glossary.html#term-iterator[iterators iterierbar sind, können Sie + zip () + und + map () + zusammenstellen, um einen Iterator über Kombinationen zu erstellen von Elementen in mehr als einem iterable. Im Folgenden werden beispielsweise die entsprechenden Elemente zweier Listen zusammengefasst:

>>>

>>> list(map(sum, zip([1, 2, 3], [4, 5, 6])))
[5, 7, 9]

Dies ist gemeint mit den Funktionen in "+ itertools ", die eine "Iteratoralgebra" bilden. ` itertools +` wird am besten als eine Sammlung von Bausteinen angesehen, die zu speziellen „Datenpipelines“ wie im obigen Beispiel kombiniert werden können.

_ Historischer Hinweis: In Python 2 die integrierten https://docs.python.org/2/library/functions.html#zip [+ zip () +] und https://docs.python. org/2/library/functions.html # map [+ map () +] Funktionen geben keinen Iterator zurück, sondern eine Liste. Um einen Iterator zurückzugeben, klicken Sie auf https://docs.python.org/2/library/itertools.html#itertools.izip [+ izip () +] und +imap () + ` Funktionen von