Seite 1 von 2
Reduce
Verfasst: Sonntag 10. März 2013, 13:49
von fail
Wieso wurde reduce aus Python 3.x entfernt man kann sich damit sogar eine eigene maximums funktion machen.
Code: Alles auswählen
maximum=lambda xs: reduce(lambda acc,y: y if y>acc else acc,xs)
Re: Reduce
Verfasst: Sonntag 10. März 2013, 13:52
von DasIch
reduce wurde nach functools verschoben und nicht entfernt. Dein maximum ist übrigens unnötig und verstößt gegen PEP 8.
Re: Reduce
Verfasst: Sonntag 10. März 2013, 13:58
von fail
na ja ich hab angefangen ein haskell tutorial durchzulesen; und als ich dort gesehen habe für was man alles fold benutzen kann, habe ich verstanden für was man reduce brauchen kann
Re: Reduce
Verfasst: Sonntag 10. März 2013, 19:26
von Leonidas
Man kann aber auch einfach ``max()`` verwenden, ohne auf Teufel-komm-raus ``reduce`` zu nutzen. Also wenn man damit "sogar eine Maximumsfunktion" machen kann, dann braucht man ``reduce`` wohl tatsächlich nicht mehr

Re: Reduce
Verfasst: Montag 1. April 2013, 12:24
von fail
Code: Alles auswählen
def newmap(func,iterable):
return reduce(lambda acc,y:acc+[func(y)],iterable,[])
Re: Reduce
Verfasst: Montag 1. April 2013, 12:33
von fail
Code: Alles auswählen
def newfilter(func,iterable):
return reduce(lambda acc,y:acc+[y]if func(y) else acc,iterable,[])
Re: Reduce
Verfasst: Montag 1. April 2013, 13:13
von Hyperion
Wobei ich dan dem Code keinen Vorteil gegnüber Bestehendem sehen kann... zumal eine Liste zurückgegeben wird - ``map`` gibt in Python3 aber ein Iterable zurück. Insofern würde ich erwarten, dass man das Verhalten imitiert, also eher so:
Code: Alles auswählen
def newmap(func, iterable):
for item in iterable:
yield func(item)
Oder wenn man es nun unbedingt in kurz will:
Code: Alles auswählen
def newmap(func, iterable):
return (func(item) for item in iterable)
Re: Reduce
Verfasst: Montag 1. April 2013, 14:45
von fail
Es geht hier um die benutzung von reduce
Re: Reduce
Verfasst: Montag 1. April 2013, 15:01
von Sirius3
ich weiß auch nicht, warum ich reduce bisher immer kaum beachtet habe:
Code: Alles auswählen
def first(iterable):
return reduce(lambda a,b: a, iterable)
def last(iterable):
return reduce(lambda a,b: b, iterable)
def tolist(iterable):
return reduce(lambda a,b: a+[b], iterable, [])
def reverse(iterable):
return reduce(lambda a,b: [b]+a, iterable, [])
Re: Reduce
Verfasst: Montag 1. April 2013, 15:30
von Hyperion
fail hat geschrieben:Es geht hier um die benutzung von reduce
Benutzung im Sinne von "Nutzen" oder l'art pour l'art?

Ersteres sehe ich hier nicht...
Re: Reduce
Verfasst: Montag 1. April 2013, 16:52
von BlackJack
@fail: Dein `newfilter()` und `newmap()` sind aber nichts was man benutzen *möchte* denn es hat beides wegen dem ``+`` auf Listen ein ziemlich übles Laufzeitverhalten.
Re: Reduce
Verfasst: Montag 1. April 2013, 17:42
von fail
Ja, append gibt leider None zurück
Re: Reduce
Verfasst: Montag 1. April 2013, 18:57
von Leonidas
Sirius3 hat geschrieben:ich weiß auch nicht, warum ich reduce bisher immer kaum beachtet habe:
Code: Alles auswählen
def first(iterable):
return reduce(lambda a,b: a, iterable)
def last(iterable):
return reduce(lambda a,b: b, iterable)
def tolist(iterable):
return reduce(lambda a,b: a+[b], iterable, [])
def reverse(iterable):
return reduce(lambda a,b: [b]+a, iterable, [])

Man sollte das in die Stdlib aufnehmen.
Re: Reduce
Verfasst: Dienstag 2. April 2013, 09:16
von fail
Code: Alles auswählen
def sums(iterable):
return reduce(lambda acc,y: acc+y,iterable)
def len(iterable):
return reduce(lambda acc,y: acc+1,iterable)
Was machen wir jetzt bloss ohne reduce?

Re: Reduce
Verfasst: Dienstag 2. April 2013, 10:39
von BlackJack
@fail: Wieso ohne? Es gibt doch `reduce()`. Wenn nicht als eingebaute Funktion, dann im `functools`-Modul. Und selbst wenn es die Funtkion nicht gäbe, könnte man sie sich ja schreiben. Ist ja nix magisches oder so.
Re: Reduce
Verfasst: Dienstag 2. April 2013, 10:49
von fail
Es war ironisch gemeint, da wir bis jetzt nur built-ins nachprogrammmiert haben
Re: Reduce
Verfasst: Dienstag 2. April 2013, 10:55
von fail
Code: Alles auswählen
def bin2dec(binary):
return reduce(lambda acc,y: acc*2 + y,binary)
Schafft es jemand dec2bin mit reduce zu definieren?
Re: Reduce
Verfasst: Dienstag 2. April 2013, 11:00
von Sirius3
wenn schon, dann wenigstens korrekt:
Code: Alles auswählen
def len(iterable):
return reduce(lambda acc,y: acc+1,iterable, 0)
def bin2dec(binary):
return reduce(lambda acc,y: acc*2 + {'0':0,'1':1}[y],binary, 0)
Re: Reduce
Verfasst: Dienstag 2. April 2013, 11:51
von BlackJack
Wobei `bin2dec()` ein falscher Name ist. Da wird nichts in Dezimalsystem umgewandelt, sondern eine Binärdarstellung in eine ganze Zahl — wie auch immer die intern oder standardmässig als Zeichenkette dargestellt wird. Also: `bin2int()`.

Re: Reduce
Verfasst: Dienstag 2. April 2013, 13:39
von fail
@Sirius3 Deine Version nimmt Strings an, meine ganzzahl listen