Seite 1 von 1

sum() shorthand

Verfasst: Samstag 11. Februar 2017, 19:03
von VoOu86
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!

Re: sum() shorthand

Verfasst: Samstag 11. Februar 2017, 19:09
von snafu
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]

Re: sum() shorthand

Verfasst: Samstag 11. Februar 2017, 19:12
von nezzcarth
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 :(

Re: sum() shorthand

Verfasst: Samstag 11. Februar 2017, 19:25
von snafu
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.

Re: sum() shorthand

Verfasst: Samstag 11. Februar 2017, 19:43
von nezzcarth
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