Python وظائف لامدا مع الأمثلة
ما هي وظيفة لامدا في Python?
A وظيفة لامدا في Python البرمجة هي وظيفة مجهولة أو وظيفة ليس لها اسم. إنها وظيفة صغيرة ومقيدة لا تحتوي على أكثر من سطر واحد. تمامًا مثل الدالة العادية، يمكن أن تحتوي دالة Lambda على وسائط متعددة بتعبير واحد.
In Python، يتم استخدام تعبيرات لامدا (أو نماذج لامدا) لإنشاء وظائف مجهولة. للقيام بذلك، سوف تستخدم لامدا الكلمة الرئيسية (تمامًا كما تستخدم صفر لتحديد الوظائف العادية). كل وظيفة مجهولة تحددها فيها Python سيكون لها 3 أجزاء أساسية:
- الكلمة الأساسية لامدا.
- المعلمات (أو المتغيرات المرتبطة)، و
- الجسم الوظيفي.
يمكن أن تحتوي دالة لامدا على أي عدد من المعلمات، ولكن يمكن أن يحتوي نص الدالة فقط على صورة واحدة؟ تعبير. علاوة على ذلك، تتم كتابة لامدا في سطر واحد من التعليمات البرمجية ويمكن أيضًا استدعاؤها على الفور. سترى كل هذا عمليًا في الأمثلة القادمة.
بناء الجملة والأمثلة
بناء الجملة الرسمي لكتابة دالة لامدا هو كما يلي:
lambda p1, p2: expression
هنا، p1 وp2 هما المعلمتان اللتان تم تمريرهما إلى دالة lambda. يمكنك إضافة العديد أو القليل من المعلمات حسب حاجتك.
ومع ذلك، لاحظ أننا لا نستخدم الأقواس حول المعلمات كما نفعل مع الوظائف العادية. الجزء الأخير (التعبير) هو أي تعبير بايثون صالح يعمل على المعلمات التي تقدمها للوظيفة.
مثال 1
الآن بعد أن تعرفت على لامدا، دعنا نجربها بمثال. لذلك، افتح الخاص بك IDLE واكتب ما يلي:
adder = lambda x, y: x + y print (adder (1, 2))
هنا هو الإخراج:
3
شرح الكود
هنا، نحدد متغيرًا سيحتفظ بالنتيجة التي يتم إرجاعها بواسطة دالة لامدا.
1. الكلمة الأساسية lambda المستخدمة لتحديد وظيفة مجهولة.
2. x وy هما المعلمتان اللتان نمررهما إلى دالة lambda.
3. هذا هو نص الدالة، الذي يجمع المعلمتين اللتين مررناهما. لاحظ أنه تعبير واحد. لا يمكنك كتابة عبارات متعددة في نص دالة لامدا.
4. نحن نسمي الدالة ونطبع القيمة التي تم إرجاعها.
مثال 2
كان هذا مثالًا أساسيًا لفهم أساسيات لغة لامدا وصياغتها. دعونا الآن نحاول طباعة لامدا ونرى النتيجة. مرة أخرى، افتح حسابك IDLE واكتب ما يلي:
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
الآن احفظ ملفك واضغط على F5 لتشغيل البرنامج. هذا هو الناتج الذي يجب أن تحصل عليه.
الإخراج:
<function <lambda> at 0x00000185C3BF81E0>
ماذا يحصل هنا؟ دعونا نلقي نظرة على الكود لفهم المزيد.
شرح الكود
- وهنا نحدد أ سلسلة التي سوف تقوم بتمريرها كمعلمة إلى لامدا.
- نعلن عن لامدا التي تستدعي بيان الطباعة وتطبع النتيجة.
ولكن لماذا لا يطبع البرنامج السلسلة التي نمررها؟ وذلك لأن لامدا نفسها تقوم بإرجاع كائن دالة. في هذا المثال، لامدا لا يجري تسمى بواسطة وظيفة الطباعة ولكن ببساطة عودة كائن الوظيفة وموقع الذاكرة حيث تم تخزينه. هذا ما تتم طباعته على وحدة التحكم.
مثال 3
ومع ذلك، إذا قمت بكتابة برنامج مثل هذا:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
وقم بتشغيله بالضغط على F5، وسترى نتيجة مثل هذا.
الإخراج:
some kind of a useless lambda
الآن، يتم استدعاء lambda، ويتم طباعة السلسلة التي نمررها في وحدة التحكم. ولكن ما هو هذا النحو الغريب، ولماذا يتم تغطية تعريف lambda بين قوسين؟ دعنا نفهم ذلك الآن.
شرح الكود
- هذه هي نفس السلسلة التي حددناها في المثال السابق.
- في هذا الجزء، نقوم بتعريف لامدا ونسميها فورًا عن طريق تمرير السلسلة كوسيطة. وهذا ما يسمى IIFE، وسوف تتعلم المزيد عنه في الأقسام القادمة من هذا البرنامج التعليمي.
مثال 4
دعونا نلقي نظرة على المثال الأخير لفهم كيفية تنفيذ وظائف lambda والوظائف العادية. لذلك، افتح الخاص بك IDLE وفي ملف جديد، اكتب ما يلي:
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
الآن، احفظ الملف واضغط على F5 لتشغيل البرنامج. إذا لم ترتكب أية أخطاء، فيجب أن تكون النتيجة شيئًا كهذا.
الإخراج:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
شرح الكود
- دالة تسمى guru تأخذ دالة أخرى كمعلمة أولى وأي وسيطات أخرى تتبعها.
- Printer_one هي دالة بسيطة تقوم بطباعة المعلمة التي تم تمريرها إليها وإعادتها.
- Printer_two يشبه Printer_one ولكن بدون بيان الإرجاع.
- في هذا الجزء، نقوم باستدعاء وظيفة المعلم (guru) وتمرير وظائف الطابعة وسلسلة كمعلمات.
- هذا هو بناء الجملة لتحقيق الخطوة الرابعة (على سبيل المثال، استدعاء وظيفة المعلم) ولكن باستخدام لامدا.
في القسم التالي، سوف تتعلم كيفية استخدام وظائف لامدا مع خريطة()، يقلل()، منقي() in Python.
باستخدام لامدا مع Python المدمج
توفر وظائف Lambda طريقة أنيقة وقوية لإجراء العمليات باستخدام الأساليب المضمنة في Python. هذا ممكن لأنه يمكن استدعاء lambdas على الفور وتمريرها كوسيطة لهذه الوظائف.
إيف في Python لامدا
إيف لتقف على استدعاء تنفيذ الوظيفة على الفور. وهذا يعني أن دالة لامدا قابلة للاستدعاء بمجرد تعريفها. دعونا نفهم هذا بمثال؛ إطلاق النار الخاص بك IDLE واكتب ما يلي:
(lambda x: x + x)(2)
فيما يلي شرح الإخراج والكود:
تتيح لك إمكانية استدعاء lambdas على الفور استخدامها داخل وظائف مثل Map() وreduce(). إنه مفيد لأنك قد لا ترغب في استخدام هذه الوظائف مرة أخرى.
لامدا في الفلتر ()
يتم استخدام وظيفة التصفية لتحديد بعض العناصر المحددة من سلسلة من العناصر. يمكن أن يكون التسلسل أي مكرر مثل القوائم، والمجموعات، والصفوف، وما إلى ذلك.
تعتمد العناصر التي سيتم تحديدها على بعض القيود المحددة مسبقًا. يستغرق 2 المعلمات:
- دالة تحدد قيد التصفية
- تسلسل (أي مكرر مثل القوائم، والصفوف، وما إلى ذلك)
على سبيل المثال،
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
وهنا الإخراج:
[10, 8, 7, 5, 11]
شرح الكود:
1. في العبارة الأولى، نقوم بتعريف قائمة تسمى التسلسلات والتي تحتوي على بعض الأرقام.
2. هنا، نعلن عن متغير يسمى filtered_result، والذي سيخزن القيم التي تم تصفيتها والتي يتم إرجاعها بواسطة الدالة filter().
3. دالة لامدا التي تعمل على كل عنصر في القائمة وترجع صحيحًا إذا كان أكبر من 4.
4. اطبع النتيجة التي تم إرجاعها بواسطة وظيفة التصفية.
لامدا في الخريطة ()
تُستخدم دالة الخريطة لتطبيق عملية معينة على كل عنصر في تسلسل. ومثلها كمثل وظيفة filter()، فإنها تأخذ أيضًا معاملين:
- دالة تحدد العملية التي سيتم تنفيذها على العناصر
- تسلسل واحد أو أكثر
على سبيل المثال، إليك برنامجًا يقوم بطباعة مربعات الأرقام الموجودة في قائمة معينة:
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
الإخراج:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
[KR1]
شرح الكود:
- هنا نقوم بتعريف قائمة تسمى التسلسلات والتي تحتوي على بعض الأرقام.
- نعلن عن متغير يسمى filter_result والذي سيقوم بتخزين القيم المعينة
- دالة لامدا التي تعمل على كل عنصر من عناصر القائمة وترجع مربع هذا الرقم.
- اطبع النتيجة التي تم إرجاعها بواسطة وظيفة الخريطة.
لامدا في تقليل ()
تُستخدم دالة الاختزال، مثل map()، لتطبيق عملية على كل عنصر في تسلسل. ومع ذلك، فهي تختلف عن map في طريقة عملها. وهذه هي الخطوات التي تتبعها دالة الاختزال() لحساب الناتج:
الخطوة 1) قم بإجراء العملية المحددة على أول عنصرين من التسلسل.
الخطوة 2) احفظ هذه النتيجة
الخطوة 3) قم بإجراء العملية باستخدام النتيجة المحفوظة والعنصر التالي في التسلسل.
الخطوة 4) كرر حتى لا يتبقى المزيد من العناصر.
يستغرق أيضًا معلمتين:
- وظيفة تحدد العملية التي يجب تنفيذها
- تسلسل (أي مكرر مثل القوائم، والصفوف، وما إلى ذلك)
على سبيل المثال، إليك برنامج يُرجع حاصل ضرب جميع العناصر في القائمة:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
هنا هو الإخراج:
120
شرح الكود:
- قم باستيراد تقليل من وحدة functools
- هنا نقوم بتعريف قائمة تسمى التسلسلات والتي تحتوي على بعض الأرقام.
- نعلن عن متغير يسمى المنتج الذي سيخزن القيمة المخفضة
- دالة لامدا التي تعمل على كل عنصر من عناصر القائمة. سيعيد منتج هذا الرقم حسب النتيجة السابقة.
- اطبع النتيجة التي تم إرجاعها بواسطة دالة التصغير.
لماذا (ولماذا لا) استخدام وظائف لامدا؟
كما سترون في القسم التالي، يتم التعامل مع وظائف lambda مثل الوظائف العادية على مستوى المترجم الفوري. بطريقة ما، يمكنك القول أن lambdas توفر بناء جملة مدمجًا لوظائف الكتابة التي تُرجع تعبيرًا واحدًا.
ومع ذلك، يجب أن تعرف متى يكون استخدام لامدا فكرة جيدة ومتى يجب تجنبها. ستتعلم في هذا القسم بعض مبادئ التصميم التي يستخدمها مطورو بايثون عند كتابة لامدا.
إحدى حالات الاستخدام الأكثر شيوعًا لـ lambdas هي البرمجة الوظيفية مثل Python يدعم نموذجًا (أو أسلوبًا) للبرمجة يُعرف بالبرمجة الوظيفية.
يسمح لك بتوفير وظيفة كمعلمة لوظيفة أخرى (على سبيل المثال، في الخريطة، أو المرشح، وما إلى ذلك). في مثل هذه الحالات، يوفر استخدام lambdas طريقة أنيقة لإنشاء دالة لمرة واحدة وتمريرها كمعلمة.
متى يجب ألا تتناوللامدا؟
لا ينبغي لك أبدًا كتابة وظائف لامدا معقدة في بيئة إنتاجية. سيكون من الصعب جدًا على المبرمجين الذين يقومون بصيانة الكود الخاص بك فك تشفيره. إذا وجدت نفسك تقوم بإنشاء تعبيرات معقدة من سطر واحد، فسيكون من الأفضل بكثير تحديد وظيفة مناسبة. كأفضل ممارسة، عليك أن تتذكر أن الكود البسيط أفضل دائمًا من الكود المعقد.
لامداس مقابل الوظائف العادية
كما ذكرنا سابقًا، فإن lambdas هي [vV4] [J5] مجرد وظائف لا تحتوي على معرف مرتبط بها. وبعبارة أبسط، فهي وظائف بدون أسماء (وبالتالي، مجهولة). فيما يلي جدول يوضح الفرق بين وظائف lambda والوظائف العادية في بايثون.
لامداس
وظائف منتظمة
بناء الجملة:
lambda x : x + x
بناء الجملة:
def (x) : return x + x
يمكن أن يكون لوظائف Lambda تعبير واحد فقط في أجسامها.
يمكن أن تحتوي الوظائف العادية على تعبيرات وعبارات متعددة في أجسامها.
Lambdas ليس لها اسم مرتبط بها. ولهذا السبب تُعرف أيضًا بالوظائف المجهولة.
يجب أن يكون للوظائف العادية اسم وتوقيع.
لا تحتوي Lambdas على بيان إرجاع لأنه يتم إرجاع الجسم تلقائيًا.
يجب أن تتضمن الوظائف التي تحتاج إلى إرجاع القيمة عبارة إرجاع.
شرح الاختلافات؟
الفرق الأساسي بين دالة لامدا والدالة العادية هو أن دالة لامدا تقوم بتقييم تعبير واحد فقط وتنتج كائن دالة. وبالتالي يمكننا تسمية نتيجة دالة لامدا واستخدامها في برنامجنا كما فعلنا في المثال السابق.
ستبدو الدالة العادية للمثال أعلاه كما يلي:
def adder (x, y): return x + y print (adder (1, 2))
وهنا علينا أن نحدد أ الاسم للوظيفة التي عائدات النتيجة عندما نحن دعوة لا تحتوي دالة lambda على عبارة return لأنها ستحتوي على تعبير واحد فقط يتم إرجاعه دائمًا بشكل افتراضي. ولا يتعين عليك حتى تعيين lambda أيضًا لأنه يمكن استدعاؤها على الفور (انظر القسم التالي). وكما سترى في المثال التالي، تصبح lambda قوية بشكل خاص عندما نستخدمها مع Pythonوظائف المدمج في.
ومع ذلك، ربما لا تزال تتساءل عن مدى اختلاف lambdas عن دالة تُرجع تعبيرًا واحدًا (مثل التعبير أعلاه). على مستوى المترجم، لا يوجد فرق كبير. قد يبدو الأمر مفاجئًا، لكن أي دالة لامدا تحددها Python يتم التعامل معها كوظيفة عادية من قبل المترجم.
كما ترون في الرسم البياني، يتم التعامل مع التعريفين بنفس الطريقة بواسطة مترجم بايثون عند تحويلهما إلى كود بايت. الآن، لا يمكنك تسمية وظيفة لامدا لأنه محجوز من قبل Python، ولكن أي اسم وظيفة آخر سوف ينتج عنه نفس الرمز الثانوي [KR6].
الملخص
- Lambdas، والمعروفة أيضًا بالوظائف المجهولة، هي وظائف صغيرة ومقيدة ولا تحتاج إلى اسم (على سبيل المثال، معرف).
- كل وظيفة لامدا في Python يحتوي على 3 أجزاء أساسية:
- الكلمة الأساسية لامدا.
- المعلمات (أو المتغيرات المرتبطة)، و
- الجسم الوظيفي.
- بناء جملة كتابة لامدا هو: معلمة لامدا: التعبير
- يمكن أن تحتوي Lambdas على أي عدد من المعلمات، ولكنها غير محاطة بأقواس
- يمكن أن تحتوي دالة lambda على تعبير واحد فقط في نص وظيفتها، والذي يتم إرجاعه افتراضيًا.
- على مستوى الرمز الثانوي، لا يوجد فرق كبير بين كيفية تعامل المترجم مع وظائف lambda والوظائف العادية.
- تدعم Lambdas IIFE من خلال بناء الجملة هذا: (معلمة lambda: التعبير)(الوسيطة)
- تُستخدم Lambdas عادةً مع البرامج المضمنة التالية في Python:
- عامل التصفية: مرشح (معلمة لامدا: التعبير، التسلسل القابل للتكرار)
- الخريطة: خريطة (معلمة لامدا: التعبير، التسلسلات القابلة للتكرار)
- تقليل: تقليل (معامل لامدا 1، المعلمة 2: التعبير، التسلسل القابل للتكرار)
- لا تكتب وظائف لامدا المعقدة في بيئة الإنتاج لأنها ستكون صعبة على مشرفي التعليمات البرمجية.
[J5]لقد قمت بإضافة جدول، ولكن الشرح ضروري لفهم الاختلافات.