V Pythonu je reduction() vestavěná funkce, která aplikuje danou funkci na prvky iterovatelného prvku a redukuje je na jedinou hodnotu.
Syntaxe funkce reduction() je následující:
functools.reduce(function, iterable[, initializer])
- The argument funkce je funkce, která přebírá dva argumenty a vrací jedinou hodnotu. První argument je akumulovaná hodnota a druhý argument je aktuální hodnota z iterovatelného.
- The iterovatelné argument je posloupnost hodnot, které mají být redukovány.
- Volitelný argument inicializátoru se používá k poskytnutí počáteční hodnoty pro akumulovaný výsledek. Pokud není zadán žádný inicializátor, použije se jako počáteční hodnota první prvek iterovatelného prvku.
Zde je příklad, který ukazuje, jak použít snížit() k nalezení součtu seznamu čí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ýstup:
Sum of the integers of num_list : 55 Sum of the integers of num_list with initial value 10 : 65
V tomto příkladu používáme funkci reduction() k aplikaci funkce add, která vrací součet dvou hodnot pro každou dvojici prvků v číselném seznamu, což má za následek součet všech prvků.
Použijme funkci lambda jako první argument funkce 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
Pojďme si rozebrat, jak snížit() funkce funguje pro uvedený příklad:
Funkce reduction() má dva argumenty: funkci a iterovatelnou. V tomto případě použijeme lambda funkci lambda x, y: x * y jako funkci a číselný seznam jako iterovatelnou.
- Funkce lambda přijímá proměnné x a y, násobí je a vrací výsledek. Když je funkce lambda zpočátku spuštěna, proměnné x a y jsou nastaveny na první a druhý prvek seznamu my_list (tj. x = 1 a y = 2). Funkce lambda tato dvě čísla vynásobí a vrátí výsledek (1 * 2 = 2).
- Při druhém volání funkce lambda je x nastaveno na výsledek předchozího volání (x = 2) a y je nastaveno na třetí prvek seznamu čísel (tj. y = 3). Tyto dvě hodnoty vynásobí a vrátí výsledek (2 * 3 = 6).
- Funkce lambda je tímto způsobem opakovaně volána pro každý prvek v my_list, dokud nejsou zpracovány všechny prvky. Funkce reduction() vrací součin všech prvků seznamu, který je pak přiřazen k proměnné součin jako 120. Tento součin se vypočítá následovně: ((((1 * 2) * 3)* 4)* 5) = 120.
- Nakonec vytiskneme hodnotu proměnné produktu pomocí funkce print(), která vypíše 120.
funkce reduction() s operátorskými funkcemi
Náš kód můžeme učinit stručnějším a čitelnějším použitím operátorských funkcí namísto lambda funkcí.
Zde je příklad demonstrující použití operátorových funkcí jako prvního argumentu funkce snížení:
# 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ýstup:
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, jak používat funkci reduction() a operátorské funkce k provádění matematických a řetězcových operací s iterovatelnými položkami v Pythonu.
Pochopení rozdílu mezi funkcemi reduction() a akumulovat():
Modul functools Pythonu poskytuje funkce redukovat() a akumulovat(), přičemž obě pracují s iterovatelnými způsoby, které jsou srovnatelné.
- The snížit () a akumulovat Funkce () jsou podobné v tom, že obě přijímají dva argumenty: iterovatelnou samotnou a funkci, která popisuje operaci, která má být na ní provedena. Způsob, jakým zacházejí s výsledky operace, se však od sebe nejvíce liší.
- The snížit Funkce () provede operaci na prvních dvou prvcích iterovatelného prvku před spuštěním stejné operace na výsledku a dalším prvku. Tento proces se opakuje, dokud nejsou zpracovány všechny iterovatelné prvky. Konečný výstup operace je vrácen jako jediný výsledek.
- Zatímco akumulovat Funkce () také aplikuje operaci na první dva prvky iterovatelného prvku před provedením stejné operace na výsledku a následujících prvcích, funkce akumulovat() vrací iterátor obsahující mezivýsledky operace. Jinými slovy, poté, co byl zpracován každý prvek, akumulovat Funkce () poskytuje řadu hodnot představujících výsledek operace.
Příklad pro pochopení rozdílu mezi akumulovat() a redukovat():
rozdíl mezi dvěma řetězci python
# 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 příkladu máme seznam čísel [1, 2, 3, 4, 5]. Používáme snížit() k výpočtu součinu všech čísel, který vrátí jedinou hodnotu 120.
Také používáme akumulovat() vypočítat součin všech čísel. Místo vracení jedné hodnoty však akumulovat() vrací iterátor, který dává sekvenci mezivýsledků: [1, 2, 6, 24, 120].
Takže hlavní rozdíl mezi snížit() akumulovat() znamená, že reduction() vrací jedinou hodnotu, která je konečným výstupem operace. Naproti tomu akumulovat() vrací iterátor, který poskytuje sekvenci mezivýsledků.