Seite 2 von 2

Verfasst: Sonntag 10. Mai 2009, 12:51
von snafu
@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?

Verfasst: Sonntag 10. Mai 2009, 13:22
von 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.

Verfasst: Sonntag 10. Mai 2009, 15:01
von snafu
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.

Verfasst: Sonntag 10. Mai 2009, 15:46
von birkenfeld
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.

Verfasst: Sonntag 10. Mai 2009, 16:12
von snafu
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.

Verfasst: Sonntag 10. Mai 2009, 16:40
von BlackJack
`sum()` funktioniert mit allem was `__add__()` implementiert *ausser* Zeichenketten. Weil die Implemementierung darauf explizit prüft.