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: 5383
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Samstag 9. Mai 2009, 14:42

Erstmal würde man bei meiner Version wie gesagt alles durchlaufen bis zu einem Fehler/Exception sobald ein String erkannt wird und dann nochmal neu anfangen und außerdem machen `join()` und `sum()` 2 grundsätzlich unterschiedliche Sachen. Lunar hat das ja schon im Detail erläutert.

Ich find's eigentlich ganz gut, so wie es jetzt ist. Etwas ungewöhnlich finde ich nur, dass der Trenner nicht als Argument innerhalb der Klammer übergeben wird, sondern eben am Anfang stehen muss. Der Hintergrund ist klar: `join()` ist eine Methode der `str`-Klasse. Die Frage ist aber, ob das wirklich so sinnvoll gewählt ist...
shcol (Repo | Doc | PyPi)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Samstag 9. Mai 2009, 14:51

lunar hat geschrieben:
Nocta hat geschrieben:Aber was spricht denn eigentlich dagegen, sum für Strings zuzulassen?

Man kann Zeichenketten nicht addieren

Code: Alles auswählen

In [1]: hasattr(str, "__add__")
Out[1]: True
:D

Jonas
My Website - 29a.ch
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
lunar

Beitragvon lunar » Samstag 9. Mai 2009, 15:25

Danke, dass du meine Argumentation kaputt gemacht hast. ;)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Samstag 9. Mai 2009, 18:15

snafu hat geschrieben:Ich kenne die genaue Implementierung von `sum()` nicht, aber höchstwahrscheinlich wird der `TypeError` da auch erst geworfen, wenn die 1 Million Elemente durchlaufen wurden und er auf einen String stößt.

Und das ist nicht nur höchstwahrscheinlich, sondern sicher flasch. Viel einfacher: die Exception muss man nur auslösen, wenn das zweite Argument ein String ist.

Vielleicht tobt da ja intern irgendein Kampf, ob man Strings nun annehmen sollte oder nicht.

Glaub mir, da haben wir ganz andere Sachen zu tun... ;)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 9. Mai 2009, 19:47

Nocta hat geschrieben:
Leonidas hat geschrieben:Also soll quasi die Funktion erraten was du vor hast? Das klingt nach einer sehr schlechten Idee. Explicit is better than implicit.

Wieso erraten?
Eindeutig definiert:
Sind Strings vorhanden, werden Strings addiert.
Sind (nur) Zahlen vorhanden, werden die Zahlen summiert.
Ist beides vorhanden, wird alles als String angesehen und addiert.

Und was wenn Tupel, Dicts, Listen, eigene Datentypen drin sind, die ``__add__`` definieren, aber eine Addition mit Strings unsinnig ist?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
snafu
User
Beiträge: 5383
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 10. Mai 2009, 12:51

@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?
shcol (Repo | Doc | PyPi)
BlackJack

Beitragvon BlackJack » Sonntag 10. Mai 2009, 13:22

@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: 5383
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 10. Mai 2009, 15:01

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.
shcol (Repo | Doc | PyPi)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Sonntag 10. Mai 2009, 15:46

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: 5383
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Sonntag 10. Mai 2009, 16:12

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.
shcol (Repo | Doc | PyPi)
BlackJack

Beitragvon BlackJack » Sonntag 10. Mai 2009, 16:40

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder