وظائف بايثون لامدا مع الأمثلة

ما هي وظيفة لامدا في بايثون؟

A وظيفة لامدا في بايثون البرمجة هي وظيفة مجهولة أو وظيفة ليس لها اسم. إنها وظيفة صغيرة ومقيدة لا تحتوي على أكثر من سطر واحد. تمامًا مثل الدالة العادية، يمكن أن تحتوي دالة Lambda على وسائط متعددة بتعبير واحد.

في بايثون، تُستخدم تعبيرات لامدا (أو نماذج لامدا) لإنشاء وظائف مجهولة. للقيام بذلك، سوف تستخدم لامدا الكلمة الرئيسية (تمامًا كما تستخدم صفر لتحديد الوظائف العادية). ستحتوي كل وظيفة مجهولة تحددها في بايثون على ثلاثة أجزاء أساسية:

  • الكلمة الأساسية لامدا.
  • المعلمات (أو المتغيرات المرتبطة)، و
  • الجسم الوظيفي.

يمكن أن تحتوي دالة لامدا على أي عدد من المعلمات، ولكن يمكن أن يحتوي نص الدالة فقط على صورة واحدة؟ تعبير. علاوة على ذلك، تتم كتابة لامدا في سطر واحد من التعليمات البرمجية ويمكن أيضًا استدعاؤها على الفور. سترى كل هذا عمليًا في الأمثلة القادمة.

بناء الجملة والأمثلة

بناء الجملة الرسمي لكتابة دالة لامدا هو كما يلي:

lambda p1, p2: expression

هنا، p1 وp2 هما المعلمتان اللتان تم تمريرهما إلى دالة lambda. يمكنك إضافة العديد أو القليل من المعلمات حسب حاجتك.

ومع ذلك، لاحظ أننا لا نستخدمها brackets حول المعلمات كما نفعل مع الوظائف العادية. الجزء الأخير (التعبير) هو أي تعبير بايثون صالح يعمل على المعلمات التي تقدمها للوظيفة.

مثال 1

الآن بعد أن تعرفت على لامدا، دعنا نجربها بمثال. لذلك، افتح الخاص بك IDLE واكتب في فولوwing:

adder = lambda x, y: x + y
print (adder (1, 2))

هنا هو الإخراج:

3

شرح الكود

هنا، نحدد متغيرًا سيحتفظ بالنتيجة التي يتم إرجاعها بواسطة دالة لامدا.

1. الكلمة الأساسية lambda المستخدمة لتحديد وظيفة مجهولة.

2. x وy هما المعلمتان اللتان نمررهما إلى دالة lambda.

3. هذا هو نص الدالة، الذي يجمع المعلمتين اللتين مررناهما. لاحظ أنه تعبير واحد. لا يمكنك كتابة عبارات متعددة في نص دالة لامدا.

4. نحن نسمي الدالة ونطبع القيمة التي تم إرجاعها.

مثال 2

كان هذا مثالًا أساسيًا لفهم أساسيات لغة لامدا وصياغتها. دعونا الآن نحاول طباعة لامدا ونرى النتيجة. مرة أخرى، افتح حسابك IDLE واكتب في فولوwing:

#What a lambda returns
string='some kind of a useless lambda'
print(lambda string : print(string))

الآن احفظ ملفك واضغط على F5 لتشغيل البرنامج. هذا هو الناتج الذي يجب أن تحصل عليه.

الإخراج:

<function <lambda> at 0x00000185C3BF81E0>

ماذا يحصل هنا؟ دعونا نلقي نظرة على الكود لفهم المزيد.

شرح الكود

  1. وهنا نحدد أ سلسلة التي سوف تقوم بتمريرها كمعلمة إلى لامدا.
  2. نعلن عن لامدا التي تستدعي بيان الطباعة وتطبع النتيجة.

ولكن لماذا لا يطبع البرنامج السلسلة التي نمررها؟ وذلك لأن لامدا نفسها تقوم بإرجاع كائن دالة. في هذا المثال، لامدا لا يجري تسمى بواسطة وظيفة الطباعة ولكن ببساطة عودة كائن الوظيفة وموقع الذاكرة حيث تم تخزينه. هذا ما تتم طباعته على وحدة التحكم.

مثال 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

الآن، يتم استدعاء لامدا، وتتم طباعة السلسلة التي نمررها على وحدة التحكم. ولكن ما هو بناء الجملة الغريب هذا، ولماذا تم تغطية تعريف لامدا brackets؟ دعونا نفهم ذلك الآن.

شرح الكود

  1. هذه هي نفس السلسلة التي حددناها في المثال السابق.
  2. في هذا الجزء، نقوم بتعريف لامدا ونسميها فورًا عن طريق تمرير السلسلة كوسيطة. وهذا ما يسمى IIFE، وسوف تتعلم المزيد عنه في الأقسام القادمة من هذا البرنامج التعليمي.

مثال 4

دعونا نلقي نظرة على المثال الأخير لفهم كيفية تنفيذ وظائف lambda والوظائف العادية. لذلك، افتح الخاص بك IDLE وفي ملف جديد اكتب الفولوwing:

#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

شرح الكود

  1. دالة تسمى guru تأخذ دالة أخرى كمعلمة أولى وتتبعها أي وسائط أخرىwing هنا.
  2. Printer_one هي دالة بسيطة تقوم بطباعة المعلمة التي تم تمريرها إليها وإعادتها.
  3. Printer_two يشبه Printer_one ولكن بدون بيان الإرجاع.
  4. في هذا الجزء، نقوم باستدعاء وظيفة المعلم (guru) وتمرير وظائف الطابعة وسلسلة كمعلمات.
  5. هذا هو بناء الجملة لتحقيق الخطوة الرابعة (على سبيل المثال، استدعاء وظيفة المعلم) ولكن باستخدام لامدا.

في القسم التالي، سوف تتعلم كيفية استخدام وظائف لامدا مع خريطة()، يقلل()، و منقي() في بيثون.

استخدام لامدا مع بايثون المدمج

توفر وظائف Lambda طريقة أنيقة وقوية لتنفيذ العمليات باستخدام الأساليب المضمنة في Python. هذا ممكن لأنه يمكن استدعاء lambdas على الفور وتمريرها كوسيطة لهذه الوظائف.

IIFE في بيثون لامدا

إيف لتقف على استدعاء تنفيذ الوظيفة على الفور. وهذا يعني أن دالة لامدا قابلة للاستدعاء بمجرد تعريفها. دعونا نفهم هذا بمثال؛ إطلاق النار الخاص بك IDLE واكتب في فولوwing:

 (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. اطبع النتيجة التي تم إرجاعها بواسطة وظيفة التصفية.

لامدا في الخريطة ()

يتم استخدام وظيفة الخريطة لتطبيق عملية معينة على كل عنصر في التسلسل. مثل عامل التصفية()، فإنه يأخذ أيضًا معلمتين:

  1. دالة تحدد العملية التي سيتم تنفيذها على العناصر
  2. تسلسل واحد أو أكثر

على سبيل المثال، هنا هو البرنامج الذي يطبع squares من الأرقام في قائمة معينة:

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]

شرح الكود:

  1. هنا نحدد قائمة تسمى التسلسلات والتي تحتوي على بعض الأرقام.
  2. نعلن عن متغير يسمى filter_result والذي سيقوم بتخزين القيم المعينة
  3. دالة لامدا التي تعمل على كل عنصر من عناصر القائمة وترجع مربع هذا الرقم.
  4. اطبع النتيجة التي تم إرجاعها بواسطة وظيفة الخريطة.

لامدا في تقليل ()

يتم استخدام دالة التخفيض، مثل Map()، لتطبيق عملية على كل عنصر في التسلسل. إلا أنها تختلف عن الخريطة في عملها. هذه هي الخطوات التي تتبعها الدالة تقليل () لحساب الإخراج:

الخطوة 1) قم بتنفيذ العملية المحددة على العنصرين الأولين من التسلسل.

الخطوة 2) احفظ هذه النتيجة

الخطوة 3) قم بإجراء العملية باستخدام النتيجة المحفوظة والعنصر التالي في التسلسل.

الخطوة 4) كرر حتى لا يتبقى المزيد من العناصر.

يستغرق أيضًا معلمتين:

  1. وظيفة تحدد العملية التي سيتم تنفيذها
  2. تسلسل (أي مكرر مثل القوائم، والصفوف، وما إلى ذلك)

على سبيل المثال، إليك برنامج يُرجع حاصل ضرب جميع العناصر في القائمة:

from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)

هنا هو الإخراج:

120

شرح الكود:

  1. قم باستيراد تقليل من وحدة functools
  2. هنا نحدد قائمة تسمى التسلسلات والتي تحتوي على بعض الأرقام.
  3. نعلن عن متغير يسمى المنتج الذي سيخزن القيمة المخفضة
  4. دالة لامدا التي تعمل على كل عنصر من عناصر القائمة. سيعيد منتج هذا الرقم حسب النتيجة السابقة.
  5. اطبع النتيجة التي تم إرجاعها بواسطة دالة التصغير.

لماذا (ولماذا لا) استخدام وظائف لامدا؟

كما سترون في القسم التالي، يتم التعامل مع وظائف lambda مثل الوظائف العادية على مستوى المترجم الفوري. بطريقة ما، يمكنك القول أن lambdas توفر بناء جملة مدمجًا لوظائف الكتابة التي تُرجع تعبيرًا واحدًا.

ومع ذلك، يجب أن تعرف متى يكون استخدام لامدا فكرة جيدة ومتى يجب تجنبها. ستتعلم في هذا القسم بعض مبادئ التصميم التي يستخدمها مطورو بايثون عند كتابة لامدا.

إحدى حالات الاستخدام الأكثر شيوعًا لـ lambdas هي البرمجة الوظيفية حيث تدعم Python نموذجًا (أو نمطًا) من البرمجة يُعرف باسم البرمجة الوظيفية.

يسمح لك بتوفير وظيفة كمعلمة لوظيفة أخرى (على سبيل المثال، في الخريطة، أو المرشح، وما إلى ذلك). في مثل هذه الحالات، يوفر استخدام lambdas طريقة أنيقة لإنشاء دالة لمرة واحدة وتمريرها كمعلمة.

متى يجب ألا تتناوللامدا؟

لا يجب عليك أبدًا كتابة وظائف لامدا المعقدة في بيئة الإنتاج. سيكون من الصعب جدًا على المبرمجين الذين يحتفظون بالرمز الخاص بك فك تشفيره. إذا وجدت نفسك تصنع complex التعبيرات ذات السطر الواحد، سيكون من الأفضل بكثير تحديد دالة مناسبة. كأفضل ممارسة، عليك أن تتذكر أن التعليمات البرمجية البسيطة هي دائمًا أفضل من complex رمز.

لامداس مقابل الوظائف العادية

كما ذكرنا سابقًا، فإن 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 على عبارة إرجاع لأنها ستحتوي على تعبير واحد فقط يتم إرجاعه دائمًا بشكل افتراضي. لا يتعين عليك حتى تعيين لامدا أيضًا لأنه يمكن استدعاؤها على الفور (راجع القسم التالي). كما سترون في المتابعةwing على سبيل المثال، تصبح lambdas قوية بشكل خاص عندما نستخدمها مع وظائف Python المضمنة.

ومع ذلك، ربما لا تزال تتساءل عن مدى اختلاف lambdas عن دالة تُرجع تعبيرًا واحدًا (مثل التعبير أعلاه). على مستوى المترجم، لا يوجد فرق كبير. قد يبدو الأمر مفاجئًا، لكن أي دالة لامدا تحددها في بايثون يتم التعامل معها على أنها دالة عادية بواسطة المترجم.

كما ترون في الرسم البياني، يتم التعامل مع التعريفين بنفس الطريقة بواسطة مترجم بايثون عند تحويلهما إلى كود بايت. الآن، لا يمكنك تسمية وظيفة لامدا لأنه محجوز بواسطة Python، ولكن أي اسم وظيفة آخر سوف ينتج عنه نفس الرمز الثانوي [KR6].

نبذة عامة

  • Lambdas، والمعروفة أيضًا بالوظائف المجهولة، هي وظائف صغيرة ومقيدة ولا تحتاج إلى اسم (على سبيل المثال، معرف).
  • تحتوي كل دالة لامدا في بايثون على ثلاثة أجزاء أساسية:
  • الكلمة الأساسية لامدا.
  • المعلمات (أو المتغيرات المرتبطة)، و
  • الجسم الوظيفي.
  • بناء جملة كتابة لامدا هو: معلمة لامدا: التعبير
  • يمكن أن تحتوي Lambdas على أي عدد من المعلمات، ولكنها غير محاطة بأقواس
  • يمكن أن تحتوي دالة lambda على تعبير واحد فقط في نص وظيفتها، والذي يتم إرجاعه افتراضيًا.
  • على مستوى الرمز الثانوي، لا يوجد فرق كبير بين كيفية تعامل المترجم مع وظائف lambda والوظائف العادية.
  • تدعم Lambdas IIFE من خلال بناء الجملة هذا: (معلمة lambda: التعبير)(الوسيطة)
  • يتم استخدام Lambdas بشكل شائع مع following المدمج في بايثون:
  • عامل التصفية: مرشح (معلمة لامدا: التعبير، التسلسل القابل للتكرار)
  • الخريطة: خريطة (معلمة لامدا: التعبير، التسلسلات القابلة للتكرار)
  • تقليل: تقليل (معامل لامدا 1، المعلمة 2: التعبير، التسلسل القابل للتكرار)
  • لا تكتب وظائف لامدا المعقدة في بيئة الإنتاج لأنها ستكون صعبة على مشرفي التعليمات البرمجية.

[J5]لقد قمت بإضافة جدول، ولكن الشرح ضروري لفهم الاختلافات.