Seite 1 von 2
Verfasst: Donnerstag 12. März 2009, 20:21
von BlackJack
@Leonidas: Der Name `iterable` ist unpassend. Wenn es wirklich für beliebige `iterable` funktionieren soll (ungetestet):
Code: Alles auswählen
def minmax(iterable):
values = iter(iterable):
try:
min_value, max_value = values.next()
except StopIteration:
raise ValueError('empty iterable')
for value in values:
min_value = min(min_value, value)
max_value = max(max_value, value)
return (min_value, max_value)
Verfasst: Donnerstag 12. März 2009, 21:49
von HWK
Blade Runner hat geschrieben:HWK hat geschrieben:Dazu braucht man sorted nicht, es reicht liste.sort().
Das macht doch hier keinen Unterschied.
10111, das ist genau ice2k3s Lösung.
Das macht schon einen Unterschied. Warum soll man unnötigerweise eine neue Liste erzeugen, wenn ich bereits eine Liste besitze, die ich an Ort und Stelle sortieren kann?
MfG
HWK
Verfasst: Donnerstag 12. März 2009, 22:03
von BlackJack
Zum Beispiel weil die Leute von einer Funktion die Minimum und Maximum einer Liste bestimmt, vielleicht erwarten, das diese Funktion die Liste nicht einfach so umsortiert!? `min()` und `max()` machen das ja auch nicht.
Verfasst: Donnerstag 12. März 2009, 22:30
von HWK
Aber das vorgeschlagene
macht ja genau das. Und da ist doch
, was zum selben Ergebnis führt, offensichtlich weniger aufwendig, da es keine neue Liste erzeugt.
MfG
HWK
Verfasst: Donnerstag 12. März 2009, 22:34
von Blade Runner
HWK hat geschrieben:Aber das vorgeschlagene
macht ja genau das.
Ich war zu faul
zu schreiben.
Verfasst: Donnerstag 12. März 2009, 22:39
von str1442
macht ja genau das.
Nö. Du legst den Namen liste neu an mit der neuen Liste, die alte Liste ist dann einfach nicht mehr erreichbar. Zumindest wenn man von einer Funktion ausgeht und das nicht auf Modulebene geschieht.
Verfasst: Donnerstag 12. März 2009, 22:43
von Trundle
Ich denke mal, es ging BlackJack eher um das Szenario, wenn das in einer Funktion steht. Dann wird nämlich in dem einen Fall das empfangene Argument verändert, dh die Liste ist beim Aufrufer nach dem Aufruf verändert, was ganz sicher nicht das erwartete Verhalten ist, im anderen Fall nicht. Man müsste also erst eine Kopie der Liste erstellen. Wenn man das erst macht, gibt es aber auch keinen Grund, nicht `sorted()` zu verwenden.
Edit: Ich schreibe wohl offensichtlich zu langsam.
Verfasst: Freitag 13. März 2009, 18:15
von INFACT
cofi hat geschrieben:@INFACT Nur sollte man dabei keine built-ins überschreiben
@baGX
http://www.python-forum.de/topic-1689.html
Ansonsten kannst du dich auch vertrauensvoll an die offizielle Dokumentation wenden ( ->
http://docs.python.org/)
Das ist zwar der eleganteste Weg die Aufgabe zu lösen, aber ich glaube aber ehrlich gesagt nicht, dass der Lehrer das im Sinn hatte.
Dabei werden keine builtins überschrieben:
Code: Alles auswählen
>>> def foo(list):
print list
>>> foo("asdfgsdfg")
asdfgsdfg
>>> a=list()
>>> a
[]
>>>
Verfasst: Freitag 13. März 2009, 18:39
von Blade Runner
Code: Alles auswählen
min = list[0]
max = list[0]
for item in list:
if item > max:
max = item
if item < min:
min = item
min und max sind die builtins.
edit: richtigen Code eingefügt.
Verfasst: Freitag 13. März 2009, 18:41
von Leonidas
INFACT hat geschrieben:Dabei werden keine builtins überschrieben:
Doch, lokal in der Funktion. Auch das sollte man vermeiden, denn wenn die Funktion etwas länger ist kann es durchaus vorkommen dass man dort irgendwo ``list()`` aufrufen will und wenn dann ein komischer Fehler kommt ist das unpraktisch.
Verfasst: Freitag 13. März 2009, 20:51
von INFACT
Ok, überzeugt