[Python] Wie man eine Klasse iterierbar macht

Contents In diesem Artikel wird erläutert, wie die iterative Verarbeitung [^ 1] in einer Python-Klasse ausgeführt wird. Jeder Code kann aus dem [GitHub-Repository] heruntergeladen werden (https://github.com/lisphilar/article_qiita/tree/master/python/01_italable_class).

[^ 1]: Qiita: Python für Anweisung ~ Was ist iterierbar ~

iter_minimum.py


iteration = IterClass(["a", "ab", "abc", "bb", "cc"])
print([v for v in iteration if "a" in v])
# ['a', 'ab', 'abc']
Ausführungsumgebung
OS Windows Subsystem for Linux
Python version 3.8.5

Lösungen

Es kann mit den speziellen Methoden der Klasse __iter__ [^ 2] und der Syntax Yield from [^ 3] implementiert werden. Speichert eine Liste oder ein Taple und gibt sie von Anfang an in der Reihenfolge zurück, in der sie als iterativer Prozess aufgerufen wird.

[^ 2]: Leben mit Python: Verwendung der Iterator-Generierungsklasse von Python [^ 3]: blanktar: Woraus ergibt sich die Python3.3-Ausbeute

iter_minimum.py


class IterClass(object):
    """
    Iterable class.

    Args:
        values (list[object] or tuple(object)): list of values

    Raises:
        TypeError: @values is not a list/tuple
    """

    def __init__(self, values):
        if not isinstance(values, (list, tuple)):
            raise TypeError("@values must be a list or tuple.")
        self._values = values

    def __iter__(self):
        yield from self._values

Anwendung (Kombination mit __bool__)

Im obigen Beispiel ist es mir nicht wichtig, eine neue Klasse zu erstellen, daher habe ich eine erweiterte Version erstellt.

Die kleinste Einheit erstellen

Erstellen Sie zuerst die kleinste Einheitsklasse "Einheit", die durch iterative Verarbeitung zurückgegeben wird.

iter_advanced.py


class Unit(object):
    """
    The smallest unit.
    """

    def __init__(self, value):
        if not isinstance(value, (float, int)):
            raise TypeError(
                f"@value must be integer or float value, but {value} was applied.")
        self._value = value
        self._enabled = True

    def __bool__(self):
        return self._enabled

    @property
    def value(self):
        """
        float: value of the unit
        """
        return self._value

    def enable(self):
        """
        Enable the unit.
        """
        self._enabled = True

    def disable(self):
        """
        Disable the unit.
        """
        self._enabled = False

Unit hat einen eindeutigen Wert und Status ( __bool__: True / False).

Eine Einheit erstellen:

iter_advanced.py


unit1 = Unit(value=1.0)
#Wert anzeigen, wenn der Einheitenstatus True ist
if unit1:
    print(unit1.value)
# 1.0

Zustand zu falsch:

iter_advanced.py


# Disable
unit1.disable()
#Wert anzeigen, wenn der Einheitenstatus True ist
if unit1:
    print(unit1.value)
#Keine Leistung

State to True:

iter_advanced.py


# Disable
unit1.enable()
#Wert anzeigen, wenn der Einheitenstatus True ist
if unit1:
    print(unit1.value)
# 1.0

Klasse zum Iterieren

Erstellen Sie eine Klasse "Serie", die Informationen über mehrere "Einheiten" speichert und eine iterative Verarbeitung durchführt.

iter_advanced.py


class Series(object):
    """
    A series of units.
    """

    def __init__(self):
        self._units = []

    def __iter__(self):
        yield from self._units

    def add(self, unit):
        """
        Append a unit.

        Args:
            unit (Unit]): the smallest unit

        Raises:
            TypeError: unit is not an instance of Unit
        """
        if not isinstance(unit, Unit):
            raise TypeError("@unit must be a instance of Unit")
        self._units.append(unit)

    def _validate_index(self, num):
        """
        Validate the index number.

        Args:
            num (int): index number of a unit

        Raises:
            TypeError: @num is not an integer
            IndexError: @num is not a valid index number
        """
        if not isinstance(num, int):
            raise TypeError(
                f"@num must be integer, but {num} was applied.")
        try:
            self._units[num]
        except IndexError:
            raise IndexError(f"@num must be under {len(self._units)}")

    def enable(self, num):
        """
        Enable a unit.

        Args:
            num (int): index of the unit to be enabled

        Raises:
            TypeError: @num is not an integer
            IndexError: @num is not a valid index number
        """
        self._validate_index(num)
        self._units[num].enable()

    def disable(self, num):
        """
        Disable a unit.

        Args:
            num (int): index of the unit to be disabled

        Raises:
            TypeError: @num is not an integer
            IndexError: @num is not a valid index number
        """
        self._validate_index(num)
        self._units[num].disable()

Eine Funktion, die den Wert einer Einheit zurückgibt, deren Status True ist

Um das Verhalten der Klasse "Series" zu überprüfen, erstellen Sie eine Funktion, die den Wert der Einheit zurückgibt, deren Status "True" ist.

iter_advanced.py


def show_enabled(series):
    """
    Show the values of enabled units.
    """
    if not isinstance(series, Series):
        raise TypeError("@unit must be a instance of Series")
    print([unit.value for unit in series if unit])

Verhaltensprüfung

Registrieren Sie "Unit" bei "Series" und zeigen Sie alle "Unit" -Werte an.

iter_advanced.py


# Create a series of units
series = Series()
[series.add(Unit(i)) for i in range(6)]
show_enabled(series)
# [0, 1, 2, 3, 4, 5]

Wenn der Status der 5. und 6. Einheit (Werte 4 und 5) auf False gesetzt ist ...

iter_advanced.py


# Disable two units
series.disable(4)
series.disable(5)
show_enabled(series)
# [0, 1, 2, 3]

Wenn der Status der 5. Einheit (Wert 4) auf True zurückgesetzt wird ...

iter_advanced.py


# Enable one disabled unit
series.enable(4)
show_enabled(series)
# [0, 1, 2, 3, 4]

Nachwort

Vielen Dank für das Surfen. Danke für deine harte Arbeit.

Wie haben Sie diesen Artikel erstellt: Ich habe diesen Mechanismus in meinem eigenen Python-Paket CovsirPhy: COVID-19-Analyse mit phasenabhängigen SIRs verwendet.

Recommended Posts

[Python] Wie man eine Klasse iterierbar macht
So erstellen Sie ein Python-Paket mit VS Code
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Verwendung der Methode __call__ in der Python-Klasse
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
[Einführung in Python] Wie verwende ich eine Klasse in Python?
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
[Python] So invertieren Sie eine Zeichenfolge
Wie bekomme ich Stacktrace in Python?
Verwendung von __slots__ in der Python-Klasse
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
So führen Sie Maya Python-Skripte aus
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
[Python] Wie erstelle ich eine Matrix aus sich wiederholenden Mustern (repmat / tile)
So installieren Sie Python
So installieren Sie Python
Lesen einer CSV-Datei mit Python 2/3
So öffnen Sie einen Webbrowser über Python
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
So erstellen Sie eine JSON-Datei in Python
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
So generieren Sie ein Python-Objekt aus JSON
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So fügen Sie einen Suchpfad für Python-Module hinzu
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
So benachrichtigen Sie Discord-Kanäle in Python
Ich las "Wie man ein Hacking Lab macht"
Versuchen Sie, mit Python eine Diedergruppe zu bilden
So erstellen Sie das Substance Painter Python-Plugin (Einführung)
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Wie man Python für Anfänger schneller macht [numpy]
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
Lark grundlegende Erklärung (machen Sie einen Shell-ähnlichen Kerl mit Python, Lark)
[Neueste Version 2020.8] So installieren Sie Python
So konvertieren / wiederherstellen Sie einen String mit [] in Python
So installieren Sie Python [Windows]
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
So richten Sie eine Python-Umgebung mit pyenv ein
Ein Weg zum mittleren Python
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
[Python] Verwendung von Liste 1
So rufen Sie eine Funktion auf
So aktualisieren Sie Pythons Tkinter auf 8.6
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.