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])                  # = []


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow