Więc teraz zmniejszyć(). To jest właściwie ta, której zawsze najbardziej nienawidziłem, ponieważ oprócz kilku przykładów z + lub * prawie za każdym razem, gdy widzę wywołanie funkcji reduce() z nietrywialnym argumentem funkcji, muszę pobrać pióro i papier do diagram, który jest faktycznie wprowadzany do tej funkcji, zanim zrozumiem, co ma zrobić funkcja reduce(). Moim zdaniem zastosowanie metody reduce() jest w dużym stopniu ograniczone do operatorów asocjacyjnych, a we wszystkich innych przypadkach lepiej jest jawnie zapisać pętlę akumulacji.
Szybkie, co się następujący kod robi?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Można zrozumieć to, ale na to potrzeba czasu, aby oddzielić wyrażenie dowiedzieć się co się dzieje. Korzystanie z krótkim zagnieżdżone def sprawozdań sprawia, że rzeczy trochę lepiej:
def combine (a, b):
return 0, a[1] + b[1]
total = reduce(combine, items)[1]
Ale najlepiej byłoby wszystkim, gdybym po prostu stosować pętli for:
total = 0
for a, b in items:
total += b
lub suma() wbudowane w i wyrażenie generatora:
total = sum(b for a,b in items)
Wiele zastosowań funkcji reduce() jest bardziej przejrzystych w przypadku zapisu jak w przypadku pętli.
W takim przypadku może być jeszcze łatwiej: suma (b za a, b w pozycjach) –
@John Millikin: Nice! :-) – DzinX
Ah, przerażające - teraz, gdy patrzę w link, linia sum() jest bezpośrednio twoim cytatem. Musiał po prostu tęsknić za pierwszym razem. –