Reduce
Code: Alles auswählen
def bin2dec(binary):
return reduce(lambda acc,y: acc*2 + y,binary)
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)
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()`.
Code: Alles auswählen
def _all(iterable):
return reduce(lambda acc,y: False if not acc else (True if y else False),
iterable,True)
def _any(iterable):
return reduce(lambda acc,y: True if acc else (True if y else False),
iterable,False)
@fail: Boah, ist das gruselig. Es gibt logische Verknüpfungen und die `bool()`-Funktion.
Wobei das auch wieder nix für den produktiven Einsatz wäre, denn im Gegensatz zu den echten `all()` und `any()` werten diese beiden immer das komplette `iterable` aus, auch wenn das Ergebnis schon unwiderruflich feststeht.
Code: Alles auswählen
def all_(iterable):
return reduce(lambda x, acc: acc and bool(x), iterable, True)
def any_(iterable):
return reduce(lambda x, acc: acc or bool(x), iterable, False)
Sorry, dass ich das hier wieder ausgrabe, ahaber es ist irre relevant, dass man mit reduce auch Listen sortieren kann. Und dafür braucht man nur eine Zeile, die allerdings völlig unlesbar ist.
Code: Alles auswählen
def sortieren(liste):
return reduce(lambda acc, i: filter(lambda j: j<=i, acc)+[i]+filter(lambda j: j>i, acc), liste, [])
PS: Die angebotene Summe ist beachtlich.
Mit Reduce kann man auch Geldautomaten programmieren:
Code: Alles auswählen
scheine = [5,10,20,50]
def auszahlen(betrag):
return reduce(lambda acc, schein: acc + [schein] * ((betrag-sum(acc)) // schein),
sorted(scheine, reverse=True), [])
print auszahlen(135)
PS: Die angebotene Summe ist beachtlich.