Python: Ausbeute Dict-Elemente in den Generatoren?
Bevor ich ein Wort sagen, ich danke der community für Ihre die maßgebliche Ort für meine Programmierung Abfragen, wie der jüngste. Und so tun diese Komplimente waren nicht ausgedrückt mit Worten. Jedenfalls, dem Gesetz der Wahrscheinlichkeit diktiert, dass ich stolpere über etwas, was ich nicht finden konnte, mit dem vielseitigen Suchleiste, also habe ich beschlossen, ausdrücklich bitten, für die erste Zeit. Vielleicht, ich war nicht gerade Suche mit Hilfe der Pythonic-genug lingo. Oder vielleicht bin ich zu saugen Googeln/Stackoverflowing. Unabhängig davon,...
Ich bin liebäugelt mit Python Coroutinen und Generatoren. Von dem, was ich sammeln können, Sie alles tun können, was eine generator-comprehension können mit Produzent Coroutinen, wenn auch eher wortreich. Ich bin derzeit mit Python 3, obwohl alle Antworten in Bezug auf Python 2 als auch gehen würde nicht eine zu verpassen.
Also ich ' m vorausgesetzt, die folgenden Codefragmente sind äquivalent:
one_to_three = (num for num in range(1, 4))
...
def one_to_three():
for num in range(1, 4):
yield num
one_to_three_gen = one_to_three()
Funktioniert es auf meiner Python-installation. Wenn ich das ignorieren der Redundanz-so-gemeinsam-in-Beispiele vorgestellt, die in diesem code sehe ich, dass der generator comprehension Karten leicht an den generator durch den Hersteller coroutine. Als Dr. Pragmatisch, ich habe versucht, das mapping, das gleiche Konzept zu dicts, gegeben, dass dict-Verstehens bereits vorhanden ist, mit mir zu denken, diese beiden gleichwertig:
one_to_three_doubles = {num : num * 2 for num in range(1, 4)}
...
def one_to_three_doubles():
for num in range(1, 4):
yield num : num * 2
one_to_three_doubles_gen = one_to_three_doubles()
Die erste funktioniert aber das zweite nicht. Es kennzeichnet einen syntax-Fehler, die auf den Doppelpunkt auf der 3. Zeile.
Nun, entweder bin ich zu Verrutschen sehr leicht auf die syntax, oder habe ich ein massives Missverständnis, wie Produzent Coroutinen Arbeit. Ich vermute, dass es andernfalls aus dem gleichen Grund können Sie nicht machen eine coroutine Rückgabe einer Liste im Gegensatz zu einem generator, aber ich weiß es nicht wirklich.
Also ja, ein Update, der Fehler ist im Grunde das, was ich verlange; vielen Dank im Voraus. Ich würde lieber eine Antwort, die mir sagt, die Antwort im Gegensatz zu mir eine ganz neue Art und Weise erreichen, mit dem Ergebnis, aber natürlich, wenn es der einzige Weg...
- Sie sprechen über Generatoren, nicht Coroutinen. Wenn Sie wissen wollen, dass Coroutinen wirklich sind, Lesen Sie Eine Kuriose Natürlich auf Coroutinen und Parallelität.
- Ich dachte, dass es die beiden Produzenten und Konsumenten, Coroutinen, und dass die Verwendung der Muster nachzugeben, um eine Abfolge zu erstellen, wurde eine vereinfachende Verwendung von Coroutinen zu erstellen, generator-Ausdrücke, gegeben, dass die Ausführung unterbrochen und Lebensläufe in der das nachgeben der einzelnen Werte ist, wie es Strecken, wo es ist? Könnte falsch sein, aber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dict-Verstehens funktionieren wie Liste/set Verstehens-und generator-Ausdrücke - eine X-Verständnis mit einem "Körper" von
expr for vars in iterable
ist ziemlich äquivalent zuX(expr for vars in iterable)
- und Sie bereits wissen, wie man den generator-Ausdruck in einen generator. Aber beachten Sie die "ziemlich" etwas, wie eine wörtliche übersetzung funktioniert nicht (wie Sie bemerkte) und nicht notwendig (und nicht um die Umsetzung viel einfacher und wäre eigentlich ganz hacky).Dict-comprehension müssen nur ein kleines bisschen syntaktischer Zucker Aussehen mehr dict-Literale (der Doppelpunkt). Semantisch ist es nicht notwendig, - es ist nichts besonderes. Stoppen Sie und denken Sie darüber für eine Sekunde: Die dict-comprehension produzieren müssen zwei Werte für jede iteration, einem Schlüssel und einem Wert. Das ist genau das, was der Doppelpunkt steht für -
(key, value)
Paare (denken Sie daran, dassdict
akzeptiert ein iterierbar von(key, value)
Paare). Sie nicht verwenden können, die syntaktischen Zucker außerhalb der dict-Verstehens, aber Sie können benutzen Sie einfach Tupeln für die Paare. Also, die äquivalente generator wäre:dict(one_to_three_doubles())
{k: v for k, v in one_to_three_doubles()}
. Dies ist nützlich, wenn Sie ändern möchten das resultierende dictionary-Schlüssel oder Werte ohne änderung der erzeugende Funktion.