Produkt einer Sequenz - pythonisch

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
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Hallo,

ich habe neulich eine Euler Aufgabe gelöst und bin dabei über eine Stelle im Code gestolpert die sich überhaupt nicht pythonisch anfühlt. Wie kann ich diesen Code eleganter schreiben?

Code: Alles auswählen

    results = [1, 1, 3, 7, 12, 5]
    
    product = 1
    for i in results:
        product *= i
    print product
Bei Addition würde ich `sum()` verwenden, doch was mache ich, wenn ich das Produkt einer Sequenz haben will?

Ich würde mich sehr über Ideen und Hinweise freuen :)

Beste Grüße,

Klip
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hi,

du kannst das wie folgt lösen (Quelle):

Code: Alles auswählen

>>> from operator import mul
>>> data = [1, 1, 3, 7, 12, 5]
>>> product = reduce(mul, data)
>>> print product
1260
Grüße
Gerrit
Benutzeravatar
Klip
User
Beiträge: 98
Registriert: Donnerstag 10. August 2006, 20:39

Hallo gkuhl,

ah! Ja genau! Super, das habe ich gesucht :) Vielen Dank. Die verlinkte Seite ist ebenfalls interessant.

Beste Grüße,

Klip
problembär

@Klip: Ich bin der Meinung, daß Dein ursprünglicher Code wesentlich "pythonischer" ist, weil ich ihn, im Gegensatz zu dem von gkuhl, sofort verstehe.
Ich hoffe, Du gewöhnst Dir da nicht künstlich das falsche an.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

problembär hat geschrieben:@Klip: Ich bin der Meinung, daß Dein ursprünglicher Code wesentlich "pythonischer" ist, weil ich ihn, im Gegensatz zu dem von gkuhl, sofort verstehe.
Um es böse auszudrücken kann das Programmierwissen eines durchschnittlichen PHP-Coders nicht der Maßstab für Verständlichkeit des Codes sein. reduce und map sind so wunderbare Sprachkonstrukte, dass sie einem nach dem ersten eigenen sinnvollen Verwenden immer wieder als elegante Lösung einfallen.
BlackJack

Ich würde die `reduce()`-Lösung nicht als "pythonischer" bezeichnen, aber auf jeden Fall als eleganter. Python bietet IMHO genau die richtige Mischung aus Bausteinen der objektorientierten und funktionalen Programmierung. Python setzt insgesamt ja sehr stark auf das Iterator/"iterable"-Konzept und `map()`, `reduce()` und der Inhalt vom `itertools`-Modul erlauben es zusammen mit Generatorfunktionen sehr schön "datenstrom-orientierte" Lösungen zu formulieren.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Man kann auch auf `mul` verzichten und stattdessen `lambda` verwenden. `reduce` als built-in sollte man eigentlich kennen. Wobei ich die Existenz auch mal wieder verdrängt hatte:

Code: Alles auswählen

reduce(lambda x,y: x*y, data)
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Der Verzicht auf operator.mul ist da aber ein Rückschritt bei der Lesbarkeit.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Panke hat geschrieben:Der Verzicht auf operator.mul ist da aber ein Rückschritt bei der Lesbarkeit.
Sehe ich nicht so. Ob da nun "mul" steht oder eine so einfache selbst definierte Funktion, macht m.E. keinen Unterschied. Wenn irgendjemand damit Schwierigkeiten hat, dann eher wegen des reduce() an sich, das doch befremdlich wirken kann, wenn man funktionales Programmieren nicht kennt.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Ich find's halt lesbarer, wenn da eine Funktion steht, deren Verhalten mir bekannt ist, als wenn ich mir erst noch
überlegen muss, was das für eine anonyme Funktion ist. Das mag in diesem konkreten Beispiel keinen großen Unterschied machen, aber prinzipiell sehe ich das schon so.
Antworten