Python-Iterator und Reißverschluss

Mit x = [1,2,3,4] bekomme ich einen Iterator aus i = iter(x) .

Mit diesem Iterator kann ich die Zip-Funktion verwenden, um ein Tupel mit zwei Items zu erstellen.

  • Polynom-Anpassung mit Log-Log-Handlung
  • Python-Streik und Bash-Fertigstellung
  • Wie lösche ich die Zitate aus einer Zeichenfolge für SQL-Abfrage in Python?
  • Wie beschleunige ich tkinter embedded matplot lib und python
  • Python3 tk, tooltip auf Leinwandbereich
  • Wie können wir Python-Skript (die nltk und scrapy verwendet) von Java laufen
  •  >>> i = iter(x) >>> zip(i,i) [(1, 2), (3, 4)] 

    Auch ich kann diese Syntax verwenden, um die gleichen Ergebnisse zu erhalten.

     >>> zip(*[i] * 2) [(1, 2), (3, 4)] 

    Wie funktioniert das? Wie funktioniert ein Iterator mit zip(i,i) und zip(*[i] * 2) ?

    2 Solutions collect form web for “Python-Iterator und Reißverschluss”

    Ein Iterator ist wie ein Strom von Gegenständen. Sie können die Artikel im Stream nur einmal anschauen und Sie haben immer nur Zugriff auf das erste Element. Um etwas im Strom zu betrachten, musst du es aus dem Strom entfernen und wenn du etwas von der Spitze des Baches nimmst, ist es aus dem Strom für immer weg.

    Wenn du zip(i, i) , zip zuerst der erste Stream und nimmt einen Artikel aus. Dann sieht es auf den zweiten Stream (der zufällig der gleiche Stream wie der erste ist) und nimmt einen Artikel aus. Dann macht es ein Tupel aus diesen beiden Gegenständen und wiederholt das immer wieder, bis es im Stream nichts mehr gibt.

    Vielleicht ist es einfacher zu sehen, ob ich die zip Funktion in reiner Python (mit nur 2 Argumenten für die Einfachheit) schreiben würde. Es würde so aussehen wie 1 :

     def zip(a, b): out = [] try: while True: item1 = next(a) item2 = next(b) out.append((item1, item2)) except StopIteration: return out 

    Stellen Sie sich jetzt den Fall vor, dass Sie darüber sprechen, wo a und b das gleiche Objekt sind . In diesem Fall rufen wir uns next zweimal auf den Iterator an ( i in deinem Beispielfall), der nur die ersten beiden Items aus der Sequenz nimmt und sie in ein Tupel packt.

    Sobald wir verstanden haben, warum zip(i, i) verhält, wie es ist, ist zip(*([i] * 2)) nicht zu hart. Lässt den Ausdruck von innen heraus lesen …

     [i] * 2 

    Das schafft gerade eine neue Liste (von Länge 2), wo beide Elemente Referenzen auf den Iterator i . Also ist es dasselbe wie zip(*[i, i]) (es ist einfacher zu schreiben, wenn du etwas mehr als 2 mal wiederholen willst). * Auspacken ist eine gemeinsame Idiom in Python und Sie finden weitere Informationen in der Python-Tutorial . Der Kern davon ist, dass python die iterable und "entpackt" es, als ob jedes Element der iterable war ein separates Positions-Argument für die Funktion. Damit:

     zip(*[i, i]) 

    Tut dasselbe wie:

     zip(i, i) 

    Und jetzt ist Bob unser Onkel. Wir sind gerade seit dem zip(i, i) wo diese Diskussion begann.

    1 Dieser Beispielcode ist definitiv mehr als nur die oben erwähnten nur akzeptieren 2 Argumente vereinfacht. Zum Beispiel, zip wird wahrscheinlich zu iter auf die Eingabe Argumente, so dass es funktioniert für alle iterable (nicht nur Iteratoren), aber das sollte genug sein, um den Punkt über …

    Jedes Mal, wenn du einen Artikel von einem Iterator bekommst, bleibt er an dieser Stelle und nicht "zurückspulen". Also zip(i, i) bekommt das erste Item von i , dann das zweite Item von i und gibt das als tuple . Es fährt fort, dies für jedes verfügbare Paar zu tun, bis der Iterator erschöpft ist.

    zip(*[i]*2) erstellt eine list von [i, i] durch Multiplikation von i mit 2 , dann entpackt es mit dem * ganz links, was in Wirklichkeit zwei Argumente i und i zu zip , produziert sendet Das gleiche Ergebnis wie das erste Snippet.

    Python ist die beste Programmiersprache der Welt.