V Pythone je redukcia() vstavaná funkcia, ktorá aplikuje danú funkciu na prvky iterovateľného prvku a redukuje ich na jednu hodnotu.
Syntax pre reduction() je nasledovná:
functools.reduce(function, iterable[, initializer])
- The argument funkcie je funkcia, ktorá má dva argumenty a vracia jednu hodnotu. Prvý argument je akumulovaná hodnota a druhý argument je aktuálna hodnota z iterovateľného.
- The iterovateľné argument je postupnosť hodnôt, ktoré sa majú znížiť.
- Voliteľný argument inicializátora sa používa na poskytnutie počiatočnej hodnoty pre akumulovaný výsledok. Ak nie je zadaný žiadny inicializátor, ako počiatočná hodnota sa použije prvý prvok iterovateľného.
Tu je príklad, ktorý ukazuje, ako použiť redukciu() na nájdenie súčtu zoznamu čísel:
# 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}')
Výkon:
Sum of the integers of num_list : 55 Sum of the integers of num_list with initial value 10 : 65
V tomto príklade používame funkciu reduction() na aplikáciu funkcie sčítania, ktorá vracia súčet dvoch hodnôt pre každú dvojicu prvkov v číselnom zozname, výsledkom čoho je súčet všetkých prvkov.
Použime funkciu lambda ako prvý argument funkcie reduction():
# 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
Poďme si rozobrať, ako znížiť () funkcia funguje pre uvedený príklad:
Funkcia reduction() má dva argumenty: funkciu a iterovateľnú. V tomto prípade používame funkciu lambda lambda x, y: x * y ako funkciu a zoznam čísel ako iterovateľnú.
- Funkcia lambda akceptuje premenné x a y, vynásobí ich a vráti výsledok. Keď je funkcia lambda na začiatku spustená, premenné x a y sa nastavia na prvý a druhý prvok zoznamu my_list (t. j. x = 1 a y = 2). Funkcia lambda vynásobí tieto dve čísla a vráti výsledok (1 * 2 = 2).
- Pri druhom volaní funkcie lambda sa x nastaví na výsledok predchádzajúceho volania (x = 2) a y sa nastaví na tretí prvok číselného zoznamu (t. j. y = 3). Vynásobí tieto dve hodnoty a vráti výsledok (2 * 3 = 6).
- Funkcia lambda sa týmto spôsobom opakovane volá pre každý prvok v zozname my_list, kým sa nespracujú všetky prvky. Funkcia reduction() vráti súčin všetkých prvkov zoznamu, ktorý sa potom priradí k premennej súčinu ako 120. Tento súčin sa vypočíta takto: ((((1 * 2) * 3)* 4)* 5) = 120.
- Nakoniec vytlačíme hodnotu premennej produktu pomocou funkcie print(), ktorá vypíše 120.
redukcia() s funkciami operátora
Náš kód môžeme urobiť stručnejším a ľahšie čitateľným použitím operátorských funkcií namiesto lambda funkcií.
Tu je príklad na demonštráciu použitia funkcií operátora ako prvého argumentu funkcie redukcie:
# 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}')
Výkon:
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
Tento kód ukazuje, ako používať funkciu reduction() a operátorské funkcie na vykonávanie matematických a reťazcových operácií s iterovateľnými položkami v Pythone.
Pochopenie rozdielu medzi funkciami redukovať () a akumulovať ():
Modul Python functools poskytuje funkcie Zníženie () a Akumulácia (), pričom obe fungujú s iterovateľnými spôsobmi, ktoré sú porovnateľné.
- The znížiť () a hromadiť Funkcie () sú podobné v tom, že obidva akceptujú dva argumenty: samotnú iterovateľnosť a funkciu, ktorá popisuje operáciu, ktorá sa má na nej vykonať. Spôsob, akým narábajú s výsledkami operácie, sa však navzájom najviac líšia.
- The znížiť Funkcia () vykoná operáciu na prvých dvoch prvkoch iterovateľného prvku pred spustením rovnakej operácie na výsledku a ďalšom prvku. Tento proces sa opakuje, kým nie sú spracované všetky iterovateľné prvky. Konečný výstup operácie sa vráti ako jeden výsledok.
- Kým hromadiť Funkcia () tiež aplikuje operáciu na prvé dva prvky iterovateľného prvku pred vykonaním rovnakej operácie na výsledku a nasledujúcich prvkoch, funkcia akumulovať() vráti iterátor obsahujúci medzivýsledky operácie. Inými slovami, po spracovaní každého prvku hromadiť Funkcia () poskytuje sériu hodnôt reprezentujúcich výsledok operácie.
Príklad na pochopenie rozdielu medzi akumuláciou () a redukciou ():
# 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 tomto príklade máme zoznam čísel [1, 2, 3, 4, 5]. Používame znížiť () na výpočet súčinu všetkých čísel, ktorý vráti jedinú hodnotu 120.
Používame tiež hromadiť () vypočítať súčin všetkých čísel. Namiesto vrátenia jednej hodnoty však hromadiť () vráti iterátor, ktorý poskytne postupnosť medzivýsledkov: [1, 2, 6, 24, 120].
Takže, hlavný rozdiel medzi znížiť () akumulovať() znamená, že reduction() vracia jednu hodnotu, ktorá je konečným výstupom operácie. Na rozdiel od toho,kumuluje() vracia iterátor, ktorý poskytuje postupnosť medzivýsledkov.