Python Language
Reduzieren
Suche…
Syntax
- reduzieren (Funktion, iterable [, Initialisierung])
Parameter
Parameter | Einzelheiten |
---|---|
Funktion | Funktion, die zur Reduzierung des Iterierbaren verwendet wird (muss zwei Argumente annehmen) (nur positionell ) |
iterable | iterable das wird reduziert werden. (nur positionell ) |
Initialisierer | Startwert der Reduktion. ( optional , nur positionell ) |
Bemerkungen
reduce
möglicherweise nicht immer die effizienteste Funktion. Für einige Typen gibt es gleichwertige Funktionen oder Methoden:
sum()
für die Summe einer Sequenz, die addierbare Elemente (keine Strings) enthält:sum([1,2,3]) # = 6
str.join
für die Verkettung von Strings:''.join(['Hello', ',', ' World']) # = 'Hello, World'
next
zusammen mit einem Generator könnte man eine Kurzschlussvariante im Vergleich dazureduce
:# First falsy item: next((i for i in [100, [], 20, 0] if not i)) # = []
Überblick
# No import needed
# No import required...
from functools import reduce # ... but it can be loaded from the functools module
from functools import reduce # mandatory
reduce
reduziert eine Iteration, indem eine Funktion wiederholt auf das nächste Element einer iterable
und das kumulative Ergebnis iterable
.
def add(s1, s2):
return s1 + s2
asequence = [1, 2, 3]
reduce(add, asequence) # equivalent to: add(add(1,2),3)
# Out: 6
In diesem Beispiel haben wir unsere eigene add
Funktion definiert. Python verfügt jedoch über eine standardmäßige äquivalente Funktion im operator
:
import operator
reduce(operator.add, asequence)
# Out: 6
reduce
kann auch ein Startwert übergeben werden:
reduce(add, asequence, 10)
# Out: 16
Verwenden Sie reduzieren
def multiply(s1, s2):
print('{arg1} * {arg2} = {res}'.format(arg1=s1,
arg2=s2,
res=s1*s2))
return s1 * s2
asequence = [1, 2, 3]
Bei einem initializer
die Funktion durch Anwenden auf den Initialisierer und das erste iterierbare Element gestartet:
cumprod = reduce(multiply, asequence, 5)
# Out: 5 * 1 = 5
# 5 * 2 = 10
# 10 * 3 = 30
print(cumprod)
# Out: 30
Ohne initializer
beginnt die reduce
mit der Anwendung der Funktion auf die ersten beiden Listenelemente:
cumprod = reduce(multiply, asequence)
# Out: 1 * 2 = 2
# 2 * 3 = 6
print(cumprod)
# Out: 6
Kumulatives Produkt
import operator
reduce(operator.mul, [10, 5, -3])
# Out: -150
Nicht-Kurzschlussvariante von any / all
reduce
wird die Iteration nicht beenden , bevor die iterable
completly iteriert wurde , so dass es einen nicht kurzschluß zu schaffen verwendet werden kann any()
oder all()
Funktion:
import operator
# non short-circuit "all"
reduce(operator.and_, [False, True, True, True]) # = False
# non short-circuit "any"
reduce(operator.or_, [True, False, False, False]) # = True
Erstes Wahrheits- / Falsches Element einer Sequenz (oder letztes Element, wenn es keine gibt)
# First falsy element or last element if all are truthy:
reduce(lambda i, j: i and j, [100, [], 20, 10]) # = []
reduce(lambda i, j: i and j, [100, 50, 20, 10]) # = 10
# First truthy element or last element if all falsy:
reduce(lambda i, j: i or j, [100, [], 20, 0]) # = 100
reduce(lambda i, j: i or j, ['', {}, [], None]) # = None
Anstatt eine lambda
Funktion zu erstellen, wird im Allgemeinen empfohlen, eine benannte Funktion zu erstellen:
def do_or(i, j):
return i or j
def do_and(i, j):
return i and j
reduce(do_or, [100, [], 20, 0]) # = 100
reduce(do_and, [100, [], 20, 0]) # = []