Python Language
Réduire
Recherche…
Syntaxe
- réduire (fonction, itérable [, initialiseur])
Paramètres
Paramètre | Détails |
---|---|
fonction | fonction utilisée pour réduire l'itérable (doit prendre deux arguments). ( uniquement positionnel ) |
itérable | iterable qui va etre reduit. ( uniquement positionnel ) |
initialiseur | valeur de départ de la réduction. ( facultatif , uniquement positionnel ) |
Remarques
reduce
peut ne pas toujours être la fonction la plus efficace. Pour certains types, il existe des fonctions ou des méthodes équivalentes:
sum()
pour la somme d'une séquence contenant des éléments à ajouter (pas des chaînes):sum([1,2,3]) # = 6
str.join
pour la concaténation de chaînes:''.join(['Hello', ',', ' World']) # = 'Hello, World'
next
avec un générateur pourrait être une variante de court-circuit par rapport àreduce
:# First falsy item: next((i for i in [100, [], 20, 0] if not i)) # = []
Vue d'ensemble
# 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
réduit une itération en appliquant une fonction à plusieurs reprises sur l'élément suivant d'un résultat iterable
et cumulatif jusqu'à présent.
def add(s1, s2):
return s1 + s2
asequence = [1, 2, 3]
reduce(add, asequence) # equivalent to: add(add(1,2),3)
# Out: 6
Dans cet exemple, nous avons défini notre propre fonction add
. Cependant, Python est livré avec une fonction équivalente standard dans le module operator
:
import operator
reduce(operator.add, asequence)
# Out: 6
reduce
peut aussi être passé une valeur de départ:
reduce(add, asequence, 10)
# Out: 16
En utilisant réduire
def multiply(s1, s2):
print('{arg1} * {arg2} = {res}'.format(arg1=s1,
arg2=s2,
res=s1*s2))
return s1 * s2
asequence = [1, 2, 3]
Étant donné un initializer
la fonction est démarrée en l'appliquant à l'initialiseur et au premier élément pouvant être itéré:
cumprod = reduce(multiply, asequence, 5)
# Out: 5 * 1 = 5
# 5 * 2 = 10
# 10 * 3 = 30
print(cumprod)
# Out: 30
Sans le paramètre initializer
, la reduce
commence en appliquant la fonction aux deux premiers éléments de la liste:
cumprod = reduce(multiply, asequence)
# Out: 1 * 2 = 2
# 2 * 3 = 6
print(cumprod)
# Out: 6
Produit cumulatif
import operator
reduce(operator.mul, [10, 5, -3])
# Out: -150
Variante sans court-circuit de tout / tout
reduce
ne sera pas fin à l'itération avant la iterable
a été complètement itéré il peut être utilisé pour créer un court-circuit non any()
ou all()
fonction:
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
Premier élément de vérité / falsification d'une séquence (ou dernier élément s'il n'y en a pas)
# 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
Au lieu de créer une fonction lambda
il est généralement recommandé de créer une fonction nommée:
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]) # = []