În Python, reduce() este o funcție încorporată care aplică o funcție dată elementelor unui iterabil, reducându-le la o singură valoare.
Sintaxa pentru reduce() este următoarea:
functools.reduce(function, iterable[, initializer])
- The argumentul funcției este o funcție care ia două argumente și returnează o singură valoare. Primul argument este valoarea acumulată, iar al doilea argument este valoarea curentă din iterabil.
- The iterabil argumentul este succesiunea de valori care trebuie redusă.
- Argumentul opțional de inițializare este folosit pentru a furniza o valoare inițială pentru rezultatul acumulat. Dacă nu este specificat niciun inițializator, primul element al iterabilului este utilizat ca valoare inițială.
Iată un exemplu care demonstrează cum să utilizați reduce() pentru a găsi suma unei liste de numere:
# Examples to understand the reduce() function from functools import reduce # Function that returns the sum of two numbers def add(a, b): return a + b # Our Iterable num_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # add function is passed as the first argument, and num_list is passed as the second argument sum = reduce(add, num_list) print(f'Sum of the integers of num_list : {sum}') # Passing 10 as an initial value sum = reduce(add, num_list, 10) print(f'Sum of the integers of num_list with initial value 10 : {sum}')
Ieșire:
Sum of the integers of num_list : 55 Sum of the integers of num_list with initial value 10 : 65
În acest exemplu, folosim funcția reduce() pentru a aplica o funcție de adunare care returnează suma a două valori pentru fiecare pereche de elemente din lista de numere, rezultând suma tuturor elementelor.
Să folosim funcția lambda ca prim argument al funcției reduce():
# Importing reduce function from functools from functools import reduce # Creating a list my_list = [1, 2, 3, 4, 5] # Calculating the product of the numbers in my_list # using reduce and lambda functions together product = reduce(lambda x, y: x * y, my_list) # Printing output print(f'Product = {product}') # Output : Product = 120
Să detaliem cum reduce() funcția funcționează pentru exemplul dat:
Funcția reduce() are două argumente: o funcție și un iterabil. În acest caz, folosim o funcție lambda lambda x, y: x * y ca funcție și lista de numere ca iterabilă.
- Funcția lambda acceptă variabilele x și y, le înmulțește și returnează rezultatul. Când funcția lambda este rulată inițial, variabilele x și y sunt setate la primul și, respectiv, al doilea element al my_list (adică, x = 1 și y = 2). Funcția lambda înmulțește aceste două numere și returnează rezultatul (1 * 2 = 2).
- A doua oară când este apelată funcția lambda, x este setat la rezultatul apelului anterior (x = 2), iar y este setat la al treilea element al listei de numere (adică, y = 3). Înmulțește aceste două valori și returnează rezultatul (2 * 3 = 6).
- Funcția lambda este apelată în mod repetat în acest fel pentru fiecare element din my_list până când toate elementele au fost gestionate. Funcția reduce() returnează produsul tuturor elementelor listei, care este apoi atribuit variabilei produs ca 120. Acest produs se calculează după cum urmează: ((((1 * 2) * 3)* 4)* 5) = 120.
- În cele din urmă, imprimăm valoarea variabilei produs folosind funcția print(), care scoate 120.
funcția reduce() cu funcții operator
Putem face codul nostru mai concis și mai ușor de citit utilizând funcții operator în loc de funcțiile lambda.
Iată un exemplu pentru a demonstra utilizarea funcțiilor operatorului ca prim argument al funcției de reducere:
# Python program to demonstrate # how to use operator functions with reduce function # Importing reduce function from functools import reduce # Importing operator import operator # Creating lists my_list1 = [1, 2, 3, 4, 5] my_list2 = ['I', 'Love', 'Javatpoint'] # Calculating the sum of the numbers of my_list1 # using reduce and operator.add sum = reduce(operator.add, my_list1) # Calculating the product of the numbers of my_list1 # using reduce and operator.mul product = reduce(operator.mul, my_list1) # Concatenating all the elements in my_list2 # using reduce and operator.concat concated_str1 = reduce(operator.concat, my_list2) # We can achieve the same output by using operator.add concated_str2 = reduce(operator.add, my_list2) # Printing result print(f'Sum of all elements in my_list1 : {sum}') print(f'Product of all elements in my_list1 : {product}') print(f'Concatenated string by using operator.concat : {concated_str1}') print(f'Concatenated string by using operator.add : {concated_str2}')
Ieșire:
Sum of all elements in my_list1 : 15 Product of all elements in my_list1 : 120 Concatenated string by using operator.concat : ILoveJavatpoint Concatenated string by using operator.add : ILoveJavatpoint
Acest cod arată cum să utilizați funcția reduce() și funcțiile operatorului pentru a efectua operații matematice și cu șiruri pe iterabile în Python.
Înțelegerea diferențelor dintre funcțiile reduce() și acumulate():
Modulul functools Python oferă funcțiile reduce() și accumulate(), ambele operează pe iterabile în moduri care sunt comparabile.
- The reduce () și acumula Funcțiile () sunt similare prin aceea că ambele acceptă două argumente: iterabilul în sine și o funcție care descrie operația care trebuie efectuată asupra acestuia. Modul în care gestionează rezultatele operației este, totuși, locul în care diferă cel mai mult unul de celălalt.
- The reduce Funcția () efectuează operația pe primele două elemente ale iterabilului înainte de a rula aceeași operație pe rezultat și pe următorul element. Acest proces se repetă până când toate elementele iterabilului au fost procesate. Rezultatul final al operației este returnat ca un singur rezultat.
- In timp ce acumula Funcția () aplică, de asemenea, operația la primele două elemente ale iterabilului înainte de a efectua aceeași operație asupra rezultatului și elementelor ulterioare, funcția accumulate() returnează un iterator care conține rezultatele intermediare ale operației. Cu alte cuvinte, după ce fiecare element a fost manipulat, acumula () oferă o serie de valori reprezentând rezultatul operației.
Un exemplu pentru a înțelege diferența dintre accumulate() și reduce():
# Python Program to demonstrate the difference # between reduce and accumulate # Importing reduce and accumulate function from functools import reduce, accumulate # Creating a list my_list = [1, 2, 3, 4, 5] # Using reduce() to calculate the product of all numbers product = reduce(lambda x, y: x * y, my_list) print(f'Product using reduce() : {product}') # Output: 120 # Using accumulate() to calculate the product of all numbers products = list(accumulate(my_list, lambda x, y: x * y)) print(f'Products using accumulate() : {products}')# Output: [1, 2, 6, 24, 120]
În acest exemplu, avem o listă de numere [1, 2, 3, 4, 5]. Folosim reduce() pentru a calcula produsul tuturor numerelor, care returnează o singură valoare de 120.
De asemenea, folosim acumula() pentru a calcula produsul tuturor numerelor. Cu toate acestea, în loc să returneze o singură valoare, acumula() returnează un iterator care dă o secvență de rezultate intermediare: [1, 2, 6, 24, 120].
Deci, principala diferență între reduce() iar accumulate() este că reduce() returnează o singură valoare care este rezultatul final al operației. În schimb, accumulate() returnează un iterator care dă o secvență de rezultate intermediare.