Reduce

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

reduce wurde nach functools verschoben und nicht entfernt. Dein maximum ist übrigens unnötig und verstößt gegen PEP 8.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Code: Alles auswählen

def newmap(func,iterable):
	return reduce(lambda acc,y:acc+[func(y)],iterable,[])
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Code: Alles auswählen

def newfilter(func,iterable):
	return reduce(lambda acc,y:acc+[y]if func(y) else acc,iterable,[])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Es geht hier um die benutzung von reduce
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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, [])
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Ja, append gibt leider None zurück
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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, [])
:D Man sollte das in die Stdlib aufnehmen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

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? :cry:
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.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Es war ironisch gemeint, da wir bis jetzt nur built-ins nachprogrammmiert haben
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Code: Alles auswählen

def bin2dec(binary):
	return reduce(lambda acc,y: acc*2 + y,binary)
Schafft es jemand dec2bin mit reduce zu definieren?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
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()`. :!:
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

@Sirius3 Deine Version nimmt Strings an, meine ganzzahl listen
Antworten