sum() shorthand

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
VoOu86
User
Beiträge: 1
Registriert: Samstag 11. Februar 2017, 18:56

Hey alle zusammen,

habe gerade angefangen Python zu lernen. Nun habe ich einen Code mit dem ich nichts anzufangen weiß bzw. ich weiß was er macht aber ich kann mir nicht erklären wie er ausgeschrieben wird.

Die Abkürzung für den Code ist:

Code: Alles auswählen

sum(pmi[term][tx] for tx in positive_vocab)
Kann mir eventuell jemand erklären wie er ausgeschrieben heißt?

Viele Dank!
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

VoOu86 hat geschrieben:Die Abkürzung für den Code ist:

Code: Alles auswählen

sum(pmi[term][tx] for tx in positive_vocab)
Kann mir eventuell jemand erklären wie er ausgeschrieben heißt?

Code: Alles auswählen

result = 0
for tx in positive_vocab:
    result += pmi[term][tx]
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Was du da hast, ist ein Generatorausdruck. Den kannst du relativ "wortgetreu" in eine for-Schleife umschreiben, brauchst dafür aber eine zusätzliche Variable, die zum aufsummieren verwendet wird; insgesamt sind das drei Zeilen.

Wie das geht, wird zum Beispiel hier erklärt:
https://docs.python.org/3/tutorial/data ... rehensions
https://docs.python.org/3/tutorial/clas ... xpressions

EDIT: snafu war schneller :(
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das Schema ist:
ausdruck1 for bezeichner in ausdruck2

ausdruck1 ist immer das, was bei einem Iterationsschritt ausgegeben wird. Dieser Teil rückt bei der "klassischen" Variante ans Ende. Im Prinzip also:

Code: Alles auswählen

for bezeichner in ausdruck2:
    ausdruck1
Damit es wirklich ein Generator wird, müsste man es als Funktion schreiben und das Schlüsselwort yield verwenden, damit das Ergebnis des Ausdrucks mit jedem Iterationsschritt geliefert wird:

Code: Alles auswählen

def generator():
    for bezeichner in ausdruck2:
        yield ausdruck1
Und dies wird dann von sum() verarbeitet. Zum Testen kann man auch einfach mal eine Liste übergeben:

Code: Alles auswählen

print(sum([1, 2, 3]))
sum() erwartet an der Stelle einfach nur etwas, woraus es sich die Elemente ziehen kann und addiert diese.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

snafu hat geschrieben: Damit es wirklich ein Generator wird, müsste man es als Funktion schreiben und das Schlüsselwort yield verwenden, damit das Ergebnis des Ausdrucks mit jedem Iterationsschritt geliefert wird:
Meines Wissens sind Generatorausdrücke wie im Ausgangspost und die "Langversion" mit yield äquivalent. Für den Interpreter sind sie 'generator'en:

Code: Alles auswählen

In [1]: numbers = (i for i in range(100))
In [2]: type(numbers)
Out[2]: generator
Antworten