Über Python für Schleife

Das Ziel dieser Geschichte

für Schleife

for_loop.py


for i in [0, 1, 2, 3, 4]:
    print(i)

Wenn du rennst

% python for_loop.py
0
1
2
3
4

for i inIch möchte wissen, wie das Ding dahinter benutzt wird. (Im obigen Beispiel scheinen die Elemente von "[0, 1, 2, 3, 4]" der Reihe nach extrahiert worden zu sein.)

Versuchen Sie, ein schönes Objekt einzulegen

Mal sehen, wie es in Bezug auf den Laufzeitfehler getroffen wird

duck.py


class Duck(object):
    pass


if __name__ == '__main__':
    for i in Duck():
        print(i)

Wenn ich es starte, werde ich wütend, wenn es nicht iterierbar ist

% python duck.py
Traceback (most recent call last):
  File "duck.py", line 6, in <module>
    for i in Duck():
TypeError: 'Duck' object is not iterable

Versuchen Sie, iterable zu implementieren

Mir wurde gesagt, ich solle es implementieren, also werde ich es implementieren. Aber geben Sie einfach ein leeres Objekt zurück

duck.py


class DuckIter(object):
    def __init__(self):
        pass


class Duck(object):
    def __iter__(self):
        return DuckIter()


if __name__ == '__main__':
    for i in Duck():
        print(i)

Der Fehler hat sich geändert (ein Schritt vorwärts!)

% python duck.py
Traceback (most recent call last):
  File "duck.py", line 12, in <module>
    for i in Duck():
TypeError: iter() returned non-iterator of type 'DuckIter'

Versuchen Sie, den Iterator zu implementieren

Versuche dreimal zu quietschen.

duck.py


class DuckIter(object):
    def __init__(self):
        self._count = 3

    def next(self):
        if self._count > 0:
            self._count -= 1
            return "quack"
        raise StopIteration()


class Duck(object):
    def __iter__(self):
        return DuckIter()


if __name__ == '__main__':
    for i in Duck():
        print(i)

Keine Fehler mehr beim Ausführen

% python duck.py
quack
quack
quack

Die Ente klingelte!

Ente tippen

If it walks like a duck and quacks like a duck, it must be a duck https://ja.wikipedia.org/wiki/ダック・タイピング

Das Objekt selbst bestimmt, was das Objekt tun kann (Unabhängig davon, welche Erbschaft sie haben)

Im Fall des vorherigen Beispiels

Dies ermöglichte es uns, die for-Schleife zu drehen:

for i in Duck():
    print(i)

Diese Notation entspricht in etwa der folgenden

iter = Duck().__iter__()
while True:
    try:
        i = iter.next()
        print(i)
    except StopIteration:
        break

Mit anderen Worten, der Verarbeitungsablauf der for-Schleife

  1. Holen Sie sich Iterator
  2. Rufen Sie die next () -Methode des Iterators auf
  3. Wenn es sich nicht um StopIteration handelt, führen Sie "process in loop" aus und fahren Sie erneut mit 2. fort.

Ein bisschen Übung

Lassen Sie uns ein Objekt mit Iterator in umgekehrter Reihenfolge aus der Liste erstellen

>>> lst = [0, 1, 2, 3, 4]
>>> rev = RevList(lst)
>>> for r in rev:
...     print(r)
...
4
3
2
1
0

Trinkgeld:

Antwort 1

class RevListIter(object):
    def __init__(self, lst):
        self._orig = lst
        self._i = len(lst)

    def next(self):
        if self._i > 0:
            self._i -= 1
            return self._orig[self._i]
        raise StopIteration()


class RevList(object):
    def __init__(self, lst):
        self._orig = lst

    def __iter__(self):
        return RevListIter(self._orig)


if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    rev = RevList(lst)
    for r in rev:
        print(r)

Antwort 2

class RevList(object):
    def __init__(self, lst):
        self._orig = lst

    def __iter__(self):
        return self._orig[::-1].__iter__()


if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    rev = RevList(lst)
    for r in rev:
        print(r)

Unterschied zwischen den beiden Antworten

Listeneinschlussnotation und Generatordarstellung

Eine andere Praxis

Erstellen wir einen Iterator, der jedes Element einer Liste von Ganzzahlen quadriert

>>> lst = [0, 1, 2, 3, 4]
>>>für mich in etwas(lst):
...     print(i)
...
0
1
4
9
16

Zwei Beispielantworten

>>> lst = [0, 1, 2, 3, 4]
>>> for i in [x*x for x in lst]:
...     print(i)
...
0
1
4
9
16
>>> for i in (x*x for x in lst):
...     print(i)
...
0
1
4
9
16

Beides sind Lösungen. Lassen Sie uns den Unterschied zwischen den beiden sehen.

Listeneinschlussnotation

Notation

[f(x) for x in lst]

Beispielcode

list_comprehension.py


def f(x):
    print("%d*%d" % (x, x))
    return x*x

if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    x = [f(x) for x in lst]
    print(type(x))
    for i in x:
        print(i)

Ausführungsergebnis

% python list_comprehension.py
0*0
1*1
2*2
3*3
4*4
<type 'list'>
0
1
4
9
16

Generatordarstellung

Notation

(f(x) for x in lst)

Beispielcode

generator_expression.py


def f(x):
    print("%d*%d" % (x, x))
    return x*x

if __name__ == '__main__':
    lst = [0, 1, 2, 3, 4]
    x = (f(x) for x in lst)
    print(type(x))
    for i in x:
        print(i)

Ausführungsergebnis

% python generator_expression.py
<type 'generator'>
0*0
0
1*1
1
2*2
4
3*3
9
4*4
16

Zusammenfassung

Recommended Posts

Über Python für Schleife
Über Python für ~ (Bereich)
Fabric unterstützt Python 3
Über "für _ in range ():" von Python
Über Python-Slices
Python [für mich]
Über die Einschlussnotation von Python
Über Python tqdm.
Über die Python-Ausbeute
Über Python, Klasse
Informationen zur Python-Vererbung
Über Python, range ()
Über Python Decorator
Informationen zur Python-Referenz
Über Python-Dekorateure
[Python] Über Multi-Prozess
Über Funktionsargumente (Python)
Python-Grundlagen ② für Anweisung
[Python] Memo über Funktionen
Zusammenfassung über Python3 + OpenCV3
Python Lehrbuch für Anfänger
Über pgbench für MySQL
Refactoring-Tools, die mit Python verwendet werden können
[Python] Memo Über Fehler
Informationen zur Python-Entwicklungsumgebung
Python: Über Funktionsargumente
Python, über die Ausnahmebehandlung
Toolchain für Python für Android
Über Python Pyramid Traversal
Über Polymorphismus zur Nestbeseitigung
Über Python3 ... (Ellipsenobjekt)
[Python] Kapitel 01-01 Über Python (Erster Python)
[Python] Informationen zur Standardeingabe
Über __all__ in Python
[Python] Erfahren Sie mehr über asynchrone Programmierung und Ereignisschleifen
OpenCV für Python-Anfänger
Installieren Sie Python (für Windows)
[Python] für Anweisungsfehler
Über den Import von externen Python-Modulen <Für Super-Anfänger>
Wartung der Python-Umgebung für Projekte
Schreiben Sie über das Erstellen einer Python-Umgebung zum Schreiben von Qiita Qiita
Informationen zum Erstellen und Ändern von benutzerdefinierten Designs für Python IDLE
[Python of Hikari-] Kapitel 05-05 Steuerungssyntax (für Anweisungs-Mehrfachschleifen-)
Python-Memo (für mich): Über die Entwicklungsumgebung virtualenv
[Python] Informieren Sie sich über pip
Python-Memo (für mich): Array
Python-Liste, für Anweisung, Wörterbuch
Python für die Datenanalyse Kapitel 4
Lernablauf für Python-Anfänger
Installationsverfahren für Python 3.6 [für Windows]
Informationen zu Python-Objekten und -Klassen
Informationen zu Python-Variablen und -Objekten
BigQuery-Integration für Python-Benutzer
Python-Lernplan für KI-Lernen
Über das Python-Modul venv
Für Mac einrichten (Python)