logo

reduce() у Python

У Python, reduce() — це вбудована функція, яка застосовує задану функцію до елементів ітерованого, зводячи їх до єдиного значення.

Синтаксис для reduce() такий:

 functools.reduce(function, iterable[, initializer]) 
  • The аргумент функції це функція, яка приймає два аргументи та повертає одне значення. Перший аргумент — це накопичене значення, а другий — поточне значення з ітерованого елемента.
  • The ітерований Аргумент - це послідовність значень, які потрібно скоротити.
  • Необов'язковий аргумент ініціалізатора використовується для надання початкового значення для накопиченого результату. Якщо ініціалізатор не вказано, перший елемент iterable використовується як початкове значення.

Ось приклад, який демонструє, як використовувати reduce() для знаходження суми списку чисел:

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

Вихід:

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

У цьому прикладі ми використовуємо функцію reduce(), щоб застосувати функцію add, яка повертає суму двох значень для кожної пари елементів у списку чисел, що призводить до суми всіх елементів.

Скористаємося лямбда-функцією як першим аргументом функції 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 

Давайте розберемо, як зменшити() функція працює для наведеного прикладу:

Функція reduce() приймає два аргументи: функцію та iterable. У цьому випадку ми використовуємо лямбда-функцію lambda x, y: x * y як функцію, а список чисел як ітерований.

  • Лямбда-функція приймає змінні x і y, множить їх і повертає результат. Під час початкового запуску лямбда-функції змінні x і y встановлюються як перший і другий елементи відповідно my_list (тобто x = 1 і y = 2). Лямбда-функція множить ці два числа та повертає результат (1 * 2 = 2).
  • Під час другого виклику лямбда-функції x встановлюється як результат попереднього виклику (x = 2), а y встановлюється як третій елемент списку чисел (тобто y = 3). Він множить ці два значення та повертає результат (2 * 3 = 6).
  • Лямбда-функція неодноразово викликається таким чином для кожного елемента в my_list, доки всі елементи не будуть оброблені. Функція reduce() повертає добуток усіх елементів списку, який потім присвоюється змінній product як 120. Цей добуток обчислюється таким чином: ((((1 * 2) * 3)* 4)* 5) = 120.
  • Нарешті, ми друкуємо значення змінної продукту за допомогою функції print(), яка виводить 120.

функція reduce() з операторними функціями

Ми можемо зробити наш код більш лаконічним і легшим для читання, використовуючи операторні функції замість лямбда-функцій.

Ось приклад, щоб продемонструвати використання операторних функцій як першого аргументу функції зменшення:

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

Вихід:

 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 

Цей код показує, як використовувати функцію reduce() і операторні функції для виконання математичних і рядкових операцій над iterables у Python.

Розуміння різниці між функціями reduce() і collecte():

Модуль functools Python надає функції reduce() і collecte(), обидві з яких працюють з ітераціями порівнянними способами.

  1. The зменшити () і накопичувати Функції () схожі тим, що обидві вони приймають два аргументи: сам ітератор і функцію, яка описує операцію, яка буде виконана над ним. Однак те, як вони обробляють результати операції, найбільше відрізняється один від одного.
  2. The зменшити Функція () виконує операцію над першими двома елементами iterable перед виконанням тієї ж операції над результатом і наступним елементом. Цей процес повторюється до тих пір, поки не будуть оброблені всі елементи iterable. Остаточний результат операції повертається як єдиний результат.
  3. У той час як накопичувати Функція () також застосовує операцію до перших двох елементів iterable перед виконанням тієї ж операції над результатом і наступними елементами, функція collecte() повертає ітератор, що містить проміжні результати операції. Іншими словами, після обробки кожного елемента, накопичувати Функція () надає ряд значень, що представляють результат операції.

Приклад, щоб зрозуміти різницю між collecte() і 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] 

У цьому прикладі ми маємо список чисел [1, 2, 3, 4, 5]. Ми використовуємо зменшити() щоб обчислити добуток усіх чисел, який повертає одне значення 120.

Ми також використовуємо накопичувати() обчислити добуток усіх чисел. Однак замість того, щоб повертати одне значення, накопичувати() повертає ітератор, який дає послідовність проміжних результатів: [1, 2, 6, 24, 120].

Отже, основна відмінність між зменшити() акумулятивний() полягає в тому, що reduce() повертає одне значення, яке є кінцевим результатом операції. Навпаки,кумуляція() повертає ітератор, який дає послідовність проміжних результатів.