[PYTHON] Kombination von rekursiv und Generator

In einigen Fällen kann rekursiv mit einer einfachen Struktur ausgedrückt werden, indem rekursiv und Generator kombiniert werden.

Wiederholung des regulären Ausdrucks

Es ist schwierig, mit rekursiven Klammern in regulären Ausdrücken umzugehen. In PHP und Ruby haben reguläre Ausdrücke ihre eigene Syntax, Python jedoch nicht. Durch die Verwendung einer rekursiven Funktion ist es ziemlich einfach, mit Klammern umzugehen.

import re
prog = re.compile(r"\((.+)\)")

def rec_search(s):
    "Holen Sie sich Klammern rekursiv und kehren Sie in die Liste zurück"
    match = prog.search(s)
    r = []
    if match:
        r.append(match)
        for i in rec_search(match.group(1)):
            r.append(i)
    return r

Ich mache eine Liste und sende sie an den Anrufer zurück. Es sieht ein bisschen schmutzig aus.

Mit Generator kombinieren

import re
prog = re.compile(r"\((.+)\)")

def recsearch(s):
    "Holen Sie sich Klammern rekursiv und iterieren"
    match = prog.search(s)
    if match:
        yield match
        for i in rec_search(match.group(1)):
            yield i

Es ist ziemlich einfach. Wenn Sie den Wert "ergeben", können Sie ihn verwerfen, so dass es einfach ist. Beachten Sie, dass rec_search ein Generator ist, also yield, um ihn an den Aufrufer zurückzugeben. Andernfalls wird ein Funktionsaufruf ausgeführt, der nichts bewirkt.

Ausführungsergebnis

>>> for i in rec_search("(1 + (1 + 2))"):
	print(i)

<_sre.SRE_Match object; span=(0, 13), match='(1 + (1 + 2))'>
<_sre.SRE_Match object; span=(4, 11), match='(1 + 2)'>

Machen Sie es noch einfacher mit Ertrag von

Eingeführt in Python3.3. Führen Sie die durch yield from angegebene Generatorfunktion aus und warten Sie beim Aufrufer, bis alle Ergebnisse zurückgegeben werden. Eine Testversion der obigen Funktion.

import re
prog = re.compile(r"\((.+)\)")

def rec_search(s):
    "Holen Sie sich Klammern rekursiv und iterieren"
    match = prog.search(s)
    if match:
        yield match
        yield from rec_search(match.group(1))

Es ist noch kürzer und einfacher.

Dateinamen rekursiv abrufen

import os

def iter(dirctory):
    "Iterieren Sie alle Dateien im Verzeichnis"
    d = os.listdir(dirctory)
    if d:
        for f in (os.path.join(dirctory, f) for f in d):
            if os.path.isfile(f):
                yield f
            elif os.path.isdir(f):
                yield from iter(f):

Ein Beispiel für eine rekursive Erfassung, bei der nur die Funktion "os.listdir" verwendet wird. Es wird beurteilt, ob es sich um eine Datei oder einen Ordner handelt, und wenn es sich um einen Ordner handelt, wird erneut rekursiv aufgerufen.

Ende

Kürzlich erinnerte ich mich an eine Wiederholung und versuchte verschiedene Dinge. Es ist besser, die Syntaxanalyse für reguläre Ausdrücke zu verwenden, und es ist nicht praktikabel, da Sie den Dateinamen mit pathlib.Path (). Glob ... abrufen können.

Recommended Posts

Kombination von rekursiv und Generator
Kombination von anyenv und direnv
Referenz und Änderung der rekursiven Python-Obergrenze
Das Problem der Lügner und der Ehrlichkeit
Mechanismus von Pyenv und Virtualenv
Vor- und Nachbearbeitung von Pytest
Erklärung und Implementierung von SocialFoceModel
Differenzierung der Sortierung und Verallgemeinerung der Sortierung
Koexistenz von Pyenv und Autojump
Verwendung und Integration von "Shodan"
Das Problem der Lügner und der Ehrlichkeit
Auftreten und Auflösung von tensorflow.python.framework.errors_impl.FailedPreconditionError
Sehr praktische Kombination von CLI Image Viewer Überzug und Ranger
Vergleich von Apex und Lamvery
Quellinstallation und Installation von Python
Einführung und Tipps von mlflow.Tracking
Erfassen Sie GeneratorExit und erkennen Sie das Ende der Iteration von der Generatorseite
[Übersetzung] scikit-learn 0.18 Benutzerhandbuch 4.1. Pipeline- und Feature-Union: Kombination von Schätzern
Umgebungskonstruktion von Python und OpenCV
Grundkenntnisse in Linux und Grundbefehle
Reihenfolge der Argumente für RegularGridInterpolator und interp2d
Die Geschichte von Python und die Geschichte von NaN
Erläuterung und Implementierung von PRML Kapitel 4
Einführung und Implementierung von JoCoR-Loss (CVPR2020)
Vorteile und Beispiele für die Verwendung von Rabbit Mq
Erklärung und Implementierung des ESIM-Algorithmus
Installation von SciPy und matplotlib (Python)
Bedeutung des maschinellen Lernens und des Mini-Batch-Lernens
Einführung und Implementierung der Aktivierungsfunktion
Memorandum zum Speichern und Laden des Modells
Missverständnisse und Interpretationen von Luigis Abhängigkeiten
Erklärung und Implementierung von einfachem Perzeptron
Berechnung der selbst erstellten Klasse und der vorhandenen Klasse
Dies und das von Python-Eigenschaften
Versuchsplanungsmethode und Kombinationsoptimierung
Fordern Sie den Turm von Hanoi mit Wiederholung heraus
Merkmale der symbolischen und harten Verbindung
Koexistenz von Python2 und 3 mit CircleCI (1.0)
[Excel] Hinzufügen von Zeichenketten (Kombination)
Zusammenfassung der Python-Indizes und -Slices
Aggregation und Visualisierung akkumulierter Zahlen
Reputation von Python-Büchern und Nachschlagewerken
Die goldene Kombination aus Embulk und BigQuery glänzt mit Digdag noch mehr