Aus Summen kürzen nur die Dummen

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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@birkenfeld:

Welches zweite Argument? Wenn ich `[1,2,3,'x']`übergebe, dann ist es das vierte Element der Liste, das "stört". Und Python wird doch wohl so lange addieren bis ein Fehler auftritt, da es schlecht wissen kann, ob bzw wann ein Typ auftritt, der nicht passt. Was ich meinte war: Bei Übergabe einer Liste an meine Funktion unter der Annahme, dass 1 Million Elemente vorhanden sind und erst das letzte ein String ist, würde zunächst `sum()`sein Glück versuchen, am Ende einen Fehler werfen und dann müsste nochmal `join()`durchlaufen, was natürlich viel länger dauert als sofort `join()`aufzurufen. Ich sehe ehrlich gesagt nicht, was daran falsch sein soll. Oder weiß Python schon bevor irgendwas passiert, dass die Liste Strings enthält?
BlackJack

@snafu: Schlimmer noch: `sum()` könnte "die Liste" eventuell auch gar nicht zweimal durchlaufen, weil die Funktion jedes "iterable" als Argument nimmt, und damit der Vorgang des Durchlaufens gar nicht wiederholbar sein muss.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dass `sum()` die Liste zweimal durchläuft habe ich nicht gesagt. Ich sprach davon, dass meine *eigene* Funktion mit dem try-except sozusagen die Liste bis zum String durchlaufen müsste (mittels `sum()`) und dann von vorne anfängt (mittels `join()`). Und klar wird über die Liste iteriert, was auch sonst? Ich bezog mich einfach nur auf Noctas Überlegung, was wäre wenn `sum()` (also quasi `new_sum()`) auch Strings annähme. Und ich weiß ja nicht ob ich mich heute so unverständlich ausdrücke, aber diese Funktion müsste *natürlich* vorher wissen, ob sie es mit reinen Zahlwerten zu tun hat oder ob auch Strings in der Liste vorkommen, weil dann eben anders verfahren werden muss. Und das kann nur gehen, wenn ich entweder vorher alle Elemente einer Typprüfung unterziehe oder es eben durch probieren bemerke und bei einem Fehler das `join()`-Verfahren wähle.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

snafu hat geschrieben:Dass `sum()` die Liste zweimal durchläuft habe ich nicht gesagt. Ich sprach davon, dass meine *eigene* Funktion mit dem try-except sozusagen die Liste bis zum String durchlaufen müsste (mittels `sum()`) und dann von vorne anfängt (mittels `join()`). Und klar wird über die Liste iteriert, was auch sonst? Ich bezog mich einfach nur auf Noctas Überlegung, was wäre wenn `sum()` (also quasi `new_sum()`) auch Strings annähme. Und ich weiß ja nicht ob ich mich heute so unverständlich ausdrücke, aber diese Funktion müsste *natürlich* vorher wissen, ob sie es mit reinen Zahlwerten zu tun hat oder ob auch Strings in der Liste vorkommen, weil dann eben anders verfahren werden muss. Und das kann nur gehen, wenn ich entweder vorher alle Elemente einer Typprüfung unterziehe oder es eben durch probieren bemerke und bei einem Fehler das `join()`-Verfahren wähle.
Mit Listen mit "gemischtem" Typ funktionieren weder `sum()` noch deine Version.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dass `sum()` nur mit Zahlen funktioniert, dürfte eigentlich längst deutlich geworden sein. In meiner Version müsste man halt im except-Block die Elemente der Liste noch zu Strings mappen. Es ging ja auch einfach nur um die Überlegung, dass ein `sum()`, welches Strings annehmen kann, deutlich langsamer wäre als wenn man solche Sequenzen direkt an `join()` gibt.
BlackJack

`sum()` funktioniert mit allem was `__add__()` implementiert *ausser* Zeichenketten. Weil die Implemementierung darauf explizit prüft.
Antworten