logo

reduce() v Pythonu

V Pythonu je reduce() vgrajena funkcija, ki uporabi dano funkcijo za elemente iterable in jih zmanjša na eno samo vrednost.

Sintaksa za reduce() je naslednja:

 functools.reduce(function, iterable[, initializer]) 
  • The argument funkcije je funkcija, ki sprejme dva argumenta in vrne eno samo vrednost. Prvi argument je akumulirana vrednost, drugi argument pa trenutna vrednost iz iterable.
  • The ponovljiv argument je zaporedje vrednosti, ki jih je treba zmanjšati.
  • Izbirni argument inicializatorja se uporablja za zagotavljanje začetne vrednosti za akumulirani rezultat. Če inicializator ni podan, se kot začetna vrednost uporabi prvi element iterable.

Tukaj je primer, ki prikazuje, kako uporabiti reduce() za iskanje vsote seznama števil:

obračanje niza java
 # 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}') 

Izhod:

 Sum of the integers of num_list : 55 Sum of the integers of num_list with initial value 10 : 65 

V tem primeru uporabljamo funkcijo reduce() za uporabo funkcije dodajanja, ki vrne vsoto dveh vrednosti za vsak par elementov na seznamu številk, rezultat pa je vsota vseh elementov.

Uporabimo funkcijo lambda kot prvi argument funkcije reduce():

operatorji v programiranju python
 # 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 

Razčlenimo, kako zmanjšati () funkcija deluje za navedeni primer:

Funkcija reduce() ima dva argumenta: funkcijo in iterable. V tem primeru uporabimo lambda funkcijo lambda x, y: x * y kot funkcijo in seznam številk kot iterable.

  • Funkcija lambda sprejme spremenljivki x in y, ju pomnoži in vrne rezultat. Ko se funkcija lambda zažene na začetku, sta spremenljivki x in y nastavljeni na prvi oziroma drugi element my_list (tj. x = 1 in y = 2). Funkcija lambda pomnoži ti dve števili in vrne rezultat (1 * 2 = 2).
  • Ko drugič pokličemo funkcijo lambda, je x nastavljen na rezultat prejšnjega klica (x = 2), y pa na tretji element seznama števil (tj. y = 3). Ti dve vrednosti pomnoži in vrne rezultat (2 * 3 = 6).
  • Funkcija lambda se na ta način večkrat kliče za vsak element v my_list, dokler niso obdelani vsi elementi. Funkcija reduce() vrne zmnožek vseh elementov seznama, ki je nato dodeljen spremenljivki produkta kot 120. Ta zmnožek se izračuna na naslednji način: ((((1 * 2) * 3)* 4)* 5) = 120.
  • Na koncu natisnemo vrednost spremenljivke produkta s funkcijo print(), ki izpiše 120.

funkcijo reduce() z operatorskimi funkcijami

Našo kodo lahko naredimo bolj jedrnato in lažjo za branje z uporabo operatorskih funkcij namesto lambda funkcij.

Tukaj je primer za prikaz uporabe operatorskih funkcij kot prvega argumenta redukcijske funkcije:

 # 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}') 

Izhod:

 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 

Ta koda prikazuje, kako uporabiti funkcijo reduce() in operatorske funkcije za izvajanje matematičnih in nizovnih operacij na iterables v Pythonu.

Razumevanje razlike med funkcijama reduce() in collecte():

Modul functools Python nudi funkciji reduce() in collecte(), ki delujeta na iterable na primerljive načine.

java za vrste zank
  1. The zmanjšati () in kopičiti () funkciji sta si podobni v tem, da obe sprejmeta dva argumenta: iterable samo in funkcijo, ki opisuje operacijo, ki jo je treba izvesti na njem. Način, na katerega ravnajo z izidi operacije, pa se med seboj najbolj razlikuje.
  2. The zmanjšati () izvede operacijo na prvih dveh elementih iterable, preden zažene isto operacijo na rezultatu in naslednjem elementu. Ta postopek se ponavlja, dokler niso obdelani vsi elementi iterable. Končni rezultat operacije je vrnjen kot en sam rezultat.
  3. Medtem ko je kopičiti Funkcija () prav tako uporabi operacijo za prva dva elementa iterable, preden izvede isto operacijo na rezultatu in naslednjih elementih, funkcija collecte() vrne iterator, ki vsebuje vmesne rezultate operacije. Z drugimi besedami, po obdelavi vsakega elementa se kopičiti () ponuja niz vrednosti, ki predstavljajo rezultat operacije.

Primer za razumevanje razlike med akumulacijo() in redukcijo():

 # 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] 

V tem primeru imamo seznam številk [1, 2, 3, 4, 5]. Uporabljamo zmanjšati () za izračun produkta vseh števil, ki vrne eno samo vrednost 120.

Uporabljamo tudi kopičiti () izračunati zmnožek vseh števil. Vendar namesto da vrne eno samo vrednost, kopičiti () vrne iterator, ki vrne zaporedje vmesnih rezultatov: [1, 2, 6, 24, 120].

Torej, glavna razlika med zmanjšati () in collecte() je, da reduce() vrne eno samo vrednost, ki je končni rezultat operacije. V nasprotju s tem akumulacija() vrne iterator, ki vrne zaporedje vmesnih rezultatov.