في بايثون، تقليل () هي وظيفة مدمجة تطبق دالة معينة على عناصر قابلة للتكرار، مما يقللها إلى قيمة واحدة.
بناء جملة تقليل () كما يلي:
functools.reduce(function, iterable[, initializer])
- ال حجة الوظيفة هي دالة تأخذ وسيطتين وترجع قيمة واحدة. الوسيطة الأولى هي القيمة المتراكمة، والوسيطة الثانية هي القيمة الحالية من العنصر القابل للتكرار.
- ال متوقعة الوسيطة هي تسلسل القيم المراد تخفيضها.
- يتم استخدام وسيطة المُهيئ الاختيارية لتوفير قيمة أولية للنتيجة المتراكمة. إذا لم يتم تحديد مُهيئ، فسيتم استخدام العنصر الأول للتكرار كقيمة أولية.
فيما يلي مثال يوضح كيفية استخدام تقليل () للعثور على مجموع قائمة الأرقام:
# 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
في هذا المثال، نستخدم الدالة تقليل () لتطبيق دالة الإضافة التي ترجع مجموع قيمتين لكل زوج من العناصر في قائمة الأرقام، مما يؤدي إلى مجموع كل العناصر.
دعونا نستخدم دالة lambda كوسيطة أولى للدالة التخفيض():
# 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
دعونا نحلل كيف يقلل() تعمل الدالة على المثال المعطى:
تأخذ الدالة التخفيض () وسيطتين: دالة وقابلة للتكرار. في هذه الحالة، نستخدم دالة لامدا lambda x, y: x * y كدالة، وقائمة الأرقام كدالة قابلة للتكرار.
- تقبل دالة لامدا المتغيرين x وy، وتضربهما، وترجع النتيجة. عند تشغيل دالة lambda في البداية، يتم تعيين المتغيرين x وy على العنصرين الأول والثاني، على التوالي، في قائمة my_list (أي x = 1 وy = 2). تقوم دالة لامدا بضرب هذين الرقمين وإرجاع النتيجة (1 * 2 = 2).
- في المرة الثانية التي يتم فيها استدعاء دالة لامدا، يتم تعيين x على نتيجة الاستدعاء السابق (x = 2)، ويتم تعيين y على العنصر الثالث من قائمة الأرقام (أي y = 3). يقوم بضرب هاتين القيمتين ويعيد النتيجة (2 * 3 = 6).
- يتم استدعاء دالة lambda بشكل متكرر بهذه الطريقة لكل عنصر في my_list حتى تتم معالجة جميع العناصر. تقوم الدالة تقليل () بإرجاع منتج جميع عناصر القائمة، والذي يتم بعد ذلك تعيينه لمتغير المنتج كـ 120. يتم حساب هذا المنتج على النحو التالي: ((((1 * 2) * 3)* 4)* 5) = 120.
- وأخيرًا، نقوم بطباعة قيمة متغير المنتج باستخدام الدالة print()، والتي تنتج 120.
تقليل () وظيفة مع وظائف المشغل
يمكننا أن نجعل الكود الخاص بنا أكثر إيجازًا وأسهل في القراءة باستخدام وظائف المشغل بدلاً من وظائف لامدا.
فيما يلي مثال لتوضيح استخدام وظائف المشغل كوسيطة أولى لوظيفة التخفيض:
# 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
يوضح هذا الكود كيفية استخدام دالة التخفيض () ووظائف المشغل لإجراء العمليات الرياضية والسلسلة على العناصر القابلة للتكرار في بايثون.
فهم الفرق بين وظائف تقليل () وتراكم ():
توفر وحدة Python functools الدالتين تقليل() وتراكم()، وكلاهما يعمل على العناصر القابلة للتكرار بطرق قابلة للمقارنة.
- ال يقلل () و جمع () تتشابه الدوال من حيث أن كلاهما يقبل وسيطتين: القابل للتكرار نفسه والدالة التي تصف العملية التي سيتم تنفيذها عليها. ومع ذلك، فإن الطريقة التي يتعاملون بها مع نتائج العملية هي أكثر ما يتباعدون عن بعضهم البعض.
- ال يقلل () تجري العملية على العنصرين الأولين للتكرار قبل تشغيل نفس العملية على النتيجة والعنصر التالي. تتكرر هذه العملية حتى تتم معالجة كافة العناصر القابلة للتكرار. يتم إرجاع الإخراج النهائي للعملية كنتيجة واحدة.
- بينما ال جمع () تطبق أيضًا العملية على العنصرين الأولين للتكرار قبل إجراء نفس العملية على النتيجة والعناصر اللاحقة، وترجع الدالة التراكمية () مكررًا يحتوي على النتائج الوسيطة للعملية. وبعبارة أخرى، بعد التعامل مع كل عنصر، فإن جمع () توفر الدالة سلسلة من القيم التي تمثل نتيجة العملية.
مثال لفهم الفرق بين التراكم () والتقليل ():
# 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].
لذلك، الفرق الرئيسي بين يقلل() والتراكم () هو أن تقليل () يُرجع قيمة واحدة تمثل الناتج النهائي للعملية. في المقابل، تُرجع الدالةتراكم () مُكرِّرًا يُنتج سلسلة من النتائج المتوسطة.