كيفية استخدام وظائف Lambda في بايثون [مع أمثلة]
نشرت: 2022-11-10في هذا البرنامج التعليمي ، ستتعلم كل شيء عن وظائف lambda في Python - من بناء الجملة لتعريف وظائف lambda إلى حالات الاستخدام المختلفة مع أمثلة التعليمات البرمجية.
في لغة بايثون ، تعتبر لامدا وظائف مجهولة المصدر لها تركيب موجز ويمكن استخدامها مع وظائف مضمنة أخرى مفيدة. بنهاية هذا البرنامج التعليمي ، ستكون قد تعلمت كيفية تحديد وظائف lambda ومتى يجب عليك التفكير في استخدامها على وظائف Python العادية.
هيا نبدأ!
وظيفة Python Lambda: النحو والأمثلة
إليك الصيغة العامة لتعريف دالة lambda في Python:
lambda parameter(s):return value
في الصيغة العامة أعلاه:
- lambda هي الكلمة الأساسية التي يجب عليك استخدامها لتعريف دالة lambda ، متبوعة بواحد أو أكثر من المعلمات التي يجب أن تتخذها الوظيفة.
- هناك نقطتان تفصل بين المعلمات والقيمة المرجعة .
عند تعريف دالة lambda ، يجب أن تتأكد من حساب القيمة المرجعة من خلال تقييم تعبير يمتد عبر سطر واحد من التعليمات البرمجية. ستفهم هذا بشكل أفضل عندما نقوم بترميز الأمثلة.
أمثلة على وظيفة Python Lambda
أفضل طريقة لفهم دوال لامدا هي البدء بإعادة كتابة دوال بايثون العادية كوظائف لامدا.
يمكنك كتابة التعليمات البرمجية في Python REPL أو في محرر Python عبر الإنترنت في Geekflare.
# 1 . ضع في اعتبارك الدالة square()
التالية ، التي تأخذ رقمًا ، num
، كوسيطة وتعيد مربع الرقم.
def square(num): return num*num
يمكنك استدعاء الدالة مع الوسائط والتحقق من أنها تعمل بشكل صحيح.
>>> square(9) 81 >>> square(12) 144
يمكنك تعيين تعبير lambda هذا إلى اسم متغير ، على سبيل المثال ، square1
لجعل تعريف الوظيفة أكثر إيجازًا: square1 = lambda num: num*num
ثم استدعاء دالة square1
بأي رقم كوسيطة. ومع ذلك ، نعلم أن Lambdas هي وظائف مجهولة الهوية ، لذلك يجب تجنب تخصيصها لمتغير.
بالنسبة إلى الدالة square()
، تكون المعلمة num
والقيمة المرجعة هي num*num
. بعد أن حددناها ، يمكننا أن نعوض بها في تعبير lambda ونسميها بالمتغير ، كما هو موضح:
>>> (lambda num: num*num)(2) 4
هذا هو مفهوم التعبير عن الوظيفة الذي تم استدعاؤه فورًا ، حيث نسمي الدالة مباشرة بعد تعريفها.
# 2 . بعد ذلك ، دعنا نعيد كتابة دالة أخرى بسيطة add()
تأخذ الأرقام ، num1
و num2
، وترجع مجموعها ، num1 + num2
.
def add(num1,num2): return num1 + num2
دعنا نسمي الدالة add()
برقمين كوسيطتين:
>>> add(4,3) 7 >>> add(12,5) 17 >>> add(12,6) 18
في هذه الحالة ، فإن num1
و num2
هما المعلمتان والقيمة المرجعة هي num1 + num2
.
>>> (lambda num1, num2: num1 + num2)(3,7) 10
يمكن أن تأخذ وظائف Python أيضًا قيمًا افتراضية للمعلمات. دعنا نعدل تعريف add()
ونضبط القيمة الافتراضية num2
على 10.
def add(num1, num2=10): return num1 + num2
في المكالمات الوظيفية التالية:
- في استدعاء الدالة الأول ، تكون قيمة
num1
هي 1 وقيمةnum2
هي 3. عندما تقوم بتمرير قيمةnum2
في استدعاء الدالة ، يتم استخدام هذه القيمة ؛ ترجع الدالة 4.
- ومع ذلك ، إذا قمت بتمرير وسيطة واحدة فقط (الرقم 1 هو 7) ،
num2
num1
ترجع الدالة 17.
>>> add(1,3) 4 >>> add(7) 17
عند كتابة وظائف تأخذ القيم الافتراضية لمعلمات معينة كتعبيرات lambda ، يمكنك تحديد القيمة الافتراضية عند تحديد المعلمات.
>>> (lambda num1, num2 = 10: num1 + num2)(1) 11
متى يجب عليك استخدام وظائف Lambda في بايثون؟
الآن بعد أن تعلمت أساسيات وظائف lambda في Python ، إليك بعض حالات الاستخدام:
- عندما يكون لديك دالة يكون تعبير إرجاعها عبارة عن سطر واحد من التعليمات البرمجية ولا تحتاج إلى الرجوع إلى الوظيفة في مكان آخر في نفس الوحدة ، يمكنك استخدام وظائف lambda. قمنا أيضًا بترميز بعض الأمثلة لفهم هذا.
- يمكنك استخدام وظائف lambda عند استخدام الوظائف المضمنة ، مثل map () و filter () و تقليل ().
- يمكن أن تكون وظائف Lambda مفيدة في فرز هياكل بيانات Python مثل القوائم والقواميس.
كيفية استخدام Python Lambda مع الوظائف المضمنة
1. استخدام Lambda مع الخريطة ()
تأخذ وظيفة map()
دالة قابلة للتكرار ووظيفة وتطبق الوظيفة على كل عنصر في العنصر القابل للتكرار ، كما هو موضح:

دعنا nums
قائمة الأعداد ونستخدم الدالة map()
لإنشاء قائمة جديدة تحتوي على مربع كل رقم في قائمة nums
. لاحظ استخدام دالة lambda لتحديد عملية التربيع.
>>> nums = [4,5,6,9] >>> list(map(lambda num:num*num,nums)) [16, 25, 36, 81]
نظرًا لأن الدالة map()
تعيد كائن خريطة ، يجب أن نضعه في قائمة.
️ تحقق من هذا البرنامج التعليمي على وظيفة map () في Python.
2. استخدام Lambda مع المرشح ()
دعونا نحدد nums
، قائمة الأرقام:
>>> nums = [4,5,6,9]
افترض أنك ترغب في تصفية هذه القائمة والاحتفاظ بالأرقام الفردية فقط.
يمكنك استخدام وظيفة filter()
المدمجة في Python.
تأخذ وظيفة filter()
شرطًا وقابل للتكرار : filter(condition, iterable)
. تحتوي النتيجة فقط على العناصر الموجودة في العنصر الأصلي القابل للتكرار والتي تفي بالشرط. يمكنك تحويل الكائن المرتجع إلى قائمة بايثون قابلة للتكرار مثل القائمة.

لتصفية جميع الأرقام الزوجية ، سنحتفظ فقط بالأرقام الفردية. لذلك يجب أن يكون تعبير lambda num: num%2!=0
. العدد num%2
هو الباقي عند قسمة num
على 2.
-
num%2!=0
True
عندما تكونnum
فردية ، و -
num%2!=0
False
عندما يكونnum
٪ 2! = 0 خطأ.
>>> nums = [4,5,6,9] >>> list(filter(lambda num:num%2!=0,nums)) [5, 9]
3. استخدام Lambda مع تقليل ()
تأخذ وظيفة الاختزال reduce()
دالة قابلة للتكرار ووظيفة. إنه يقلل من التكرار من خلال تطبيق الوظيفة بشكل تكراري على عناصر المتكرر.


لاستخدام وظيفة reduce()
، سيتعين عليك استيرادها من وحدة functools
المضمنة في Python:
>>> from functools import reduce
دعنا نستخدم وظيفة reduce()
لحساب مجموع كل الأرقام في قائمة nums
. نحدد تعبير لامدا: lambda num1,num2:num1+num2
، كوظيفة مجموع مختزل.
ستحدث عملية الاختزال على النحو التالي: f (f (f (4،5)، 6)، 9) = f (f (9،6)، 9) = f (15،9) = 24. هنا ، f هي عملية الجمع على عنصرين من القائمة ، تم تحديدهما بواسطة وظيفة lambda.
>>> from functools import reduce >>> nums = [4,5,6,9] >>> reduce(lambda num1,num2:num1+num2,nums) 24
وظائف Python Lambda لتخصيص الفرز
بالإضافة إلى استخدام وظائف lambda مع وظائف Python المضمنة ، مثل map()
و filter()
و reduce()
، يمكنك أيضًا استخدامها لتخصيص الوظائف والأساليب المضمنة المستخدمة في الفرز.

1. فرز قوائم بايثون
عند العمل مع قوائم Python ، غالبًا ما يتعين عليك فرزها بناءً على معايير فرز معينة. لفرز قوائم Python في مكانها ، يمكنك استخدام طريقة sort()
المضمنة عليها. إذا كنت بحاجة إلى نسخة مرتبة من القائمة ، يمكنك استخدام الدالة sorted()
.
يتم
sorted()
في Python (قابلsorted(iterable, key=...,reverse= True | False)
.
- يتم استخدام المعلمةkey
لتخصيص الفرز.
- يمكن ضبط المعلمةreverse
علىTrue
أوFalse
؛ القيمة الافتراضية هيFalse
.
عند فرز قوائم الأرقام والسلاسل ، يكون الفرز الافتراضي بترتيب تصاعدي وترتيب أبجدي ، على التوالي. ومع ذلك ، قد ترغب في بعض الأحيان في تحديد بعض المعايير المخصصة للفرز.
ضع في اعتبارك قائمة fruits
التالية. افترض أنك ترغب في الحصول على نسخة مرتبة من القائمة. يجب عليك فرز السلاسل وفقًا لعدد تكرارات "p" فيها - بالترتيب التنازلي.
>>> fruits = ['apple','pineapple','grapes','mango']
حان الوقت لاستخدام معلمة key
الاختيارية. السلسلة عبارة عن سلسلة قابلة للتكرار في Python وللحصول على عدد تكرارات الحرف فيها ، يمكنك استخدام طريقة .count()
. لذلك قمنا بتعيين key
إلى lambda x:x.count('p')
بحيث يعتمد الفرز على عدد مرات حدوث 'p' في السلسلة.
>>> fruits = ['apple','pineapple','grapes','mango'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['pineapple', 'apple', 'grapes', 'mango']
في هذا المثال:
-
key
الفرز هو عدد تكرارات الحرف "p" ، ويتم تعريفه على أنه تعبير لامدا. - نظرًا لأننا قمنا بتعيين المعلمة
reverse
علىTrue
، يحدث الفرز بترتيب تنازلي لعدد تكرارات "p".
في قائمة fruits
، يحتوي "الأناناس" على 3 تكرارات "p" ، بينما تحتوي السلاسل "تفاحة" و "عنب" و "مانجو" على 2 و 1 و 0 تكرارات "p" على التوالي.
فهم التصنيف المستقر
تأمل في مثال آخر. لمعيار الفرز نفسه ، قمنا بإعادة تعريف قائمة fruits
. هنا ، يظهر الحرف "p" في السلاسل "تفاحة" و "عنب" مرتين ومرة واحدة على التوالي. ولا يحدث أبدًا في سلاسل "المانجو" و "البطيخ".
>>> fruits = ['mango','apple','melon','grapes'] >>> sorted(fruits,key=lambda x:x.count('p'),reverse=True) ['apple', 'grapes', 'mango', 'melon']
في قائمة الإخراج ، تأتي كلمة "mango" قبل "melon" على الرغم من أنهما لا يمتلكان الحرف "p". ولكن لماذا هو على هذه الحال؟ تؤدي الوظيفة sorted()
فرزًا مستقرًا ؛ لذلك عندما يكون عدد "p" مساويًا لسلسلتين ، يتم الاحتفاظ بترتيب العناصر في قائمة fruits
الأصلية.
كتمرين سريع ، قم بتبديل وضعي "مانجو" و "شمام" في قائمة
fruits
، وفرز القائمة بناءً على نفس المعيار ، ولاحظ الناتج.
️ تعرف على المزيد حول فرز قوائم بايثون.
2. فرز قاموس بايثون
يمكنك أيضًا استخدام lambdas عند فرز قواميس Python. ضع في اعتبارك القاموس التالي price_dict
الذي يحتوي على العناصر وأسعارها.
>>> price_dict = { ... 'Milk':10, ... 'Honey':15, ... 'Bread':7, ... 'Candy':3 ... }
للحصول على أزواج القيم والمفاتيح الخاصة بالقاموس كقائمة من المجموعات ، يمكنك استخدام طريقة القاموس .items()
:
>>> price_dict_items = price_dict.items() dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])
في Python ، تتبع جميع العناصر التكرارية: القوائم ، والمجموعات ، والسلاسل ، والمزيد ، الفهرسة الصفرية. لذا فإن العنصر الأول في الفهرس 0 ، والعنصر الثاني في الفهرس 1 ، وهكذا.
نود الفرز حسب القيمة ، وهي سعر كل عنصر في القاموس. في كل مجموعة في قائمة price_dict_items
، يكون العنصر في الفهرس 1 هو السعر. لذلك قمنا بتعيين key
إلى lambda x:x[1]
حيث سيستخدم العنصر في الفهرس 1 ، السعر ، لفرز القاموس.
>>> dict(sorted(price_dict_items,key=lambda x:x[1])) {'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}
في الإخراج ، تم فرز عناصر القاموس بترتيب تصاعدي للأسعار: بدءًا من "حلوى" ، بسعر 3 وحدات إلى "عسل" بسعر 15 وحدة.
️ لمعرفة المزيد ، راجع هذا الدليل التفصيلي حول تصنيف قاموس Python حسب المفتاح والقيمة.
تلخيص لما سبق
وهناك لديك! لقد تعلمت كيفية تحديد وظائف lambda واستخدامها بفعالية مع وظائف Python المضمنة الأخرى. فيما يلي ملخص للنصائح الرئيسية:
- في لغة بايثون ، تعتبر lambdas دوال مجهولة المصدر يمكنها أن تأخذ عدة وسيطات وتعيد قيمة ؛ يجب أن يكون التعبير المراد تقييمه لإنشاء قيمة الإرجاع هذه سطرًا واحدًا من التعليمات البرمجية. يمكن استخدامها لجعل تعريفات الوظائف الصغيرة أكثر إيجازًا.
- لتعريف وظيفة Lambda ، يمكنك استخدام الصيغة: معلمة (معلمات) lambda: القيمة المرجعة .
- تتضمن بعض حالات الاستخدام المهمة استخدامها مع وظائف
map()
وfilter()
وreduce()
وكمعامل رئيسي لتخصيص فرز متكررات Python.
بعد ذلك ، تعرف على كيفية إجراء تقسيم الطوابق في بايثون.