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

ما هي وظائف لامدا؟

â € <
في Python ، الوظائف هي كائنات: يمكن تخصيصها للمتغيرات ، ويمكن إرجاعها من وظائف أخرى ، وتخزينها في قوائم أو إملاءات وتمريرها كمعلمات لوظائف أخرى. ضع في اعتبارك ، على سبيل المثال ، map() وظيفة مدمجة. تركيبها هو map(function, iterable) ويتم استخدامه للتطبيق بسهولة function لكل عنصر من iterable.

map() إرجاع في الواقع iterator هدف. في الممارسة العملية ، نلقي النتيجة على أنها أ list, tuple, set, dict، إلخ ، أيهما أكثر ملاءمة.
â € <
افترض أنك تريد تربيع كل حد في القائمة باستخدام map() وظيفة. للقيام بذلك ، سنقوم بتعريف ملف square() وظيفة واستخدامها كمعلمة ل map():

my_list = [1,2,3,4,5]
def square(x):
    return x**2

my_modified_list = list(map(square, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

â € <
ومع ذلك ، إذا كان الاستخدام الوحيد لبرنامج square() الوظيفة هي إنشاء هذه القائمة ، فمن الأنظف استخدام ملف lambda وظيفة:

my_list = [1,2,3,4,5]
my_modified_list = list(map(lambda x: x**2, my_list))
print(my_modified_list)
[1, 4, 9, 16, 25]

في بايثون ، lambda الوظائف هي وظائف مجهولة المصدر تأخذ اسمها وتركيبها من Alonzo Church حساب التفاضل والتكامل لامدا. تركيبها هو:

lambda x_1,..., x_n : expression(x_1, ..., x_n)

يؤدي هذا إلى إنشاء دالة مجهولة تستقبل المتغيرات كمدخلات x_1, ..., x_n وإرجاع التقييم expression(x_1, ..., x_n).
â € <
الغرض من lambda يتم استخدام الدوال كمعامل للوظائف التي تقبل الوظائف كمعامل ، كما فعلنا مع map() فوق. تسمح لك Python بتعيين ملف lambda تعمل إلى متغير ، ولكن دليل أسلوب PEP 8 ينصح ضدها. إذا كنت تريد إسناد وظيفة بسيطة إلى متغير ، فمن الأفضل القيام بذلك على أنه تعريف من سطر واحد. يضمن ذلك تسمية الكائن الناتج بشكل صحيح ، مما يؤدي إلى تحسين قابلية قراءة التتبع:

anonymous_square = lambda x : x**2def named_square(x): return x**2print(anonymous_square.__name__)
print(named_square.__name__)


a = anonymous_square
b = named_square
print(a.__name__)
print(b.__name__)

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

بعد الفقرة الأخيرة ، قد تتساءل عن سبب رغبتك في استخدام ملف lambda وظيفة. بعد كل شيء ، أي شيء يمكن عمله بامتداد lambda يمكن القيام بوظيفة محددة.
â € <
الجواب على هذا هو أن lambda المهام غرض هو العيش داخل تعابير أكبر تمثل عملية حسابية. طريقة واحدة للتفكير في هذا عن طريق القياس مع المتغيرات والقيم. ضع في اعتبارك الكود التالي:

x = 2

المتغير x هو عنصر نائب (أو اسم) للعدد الصحيح 2. على سبيل المثال ، الاتصال print(x) و print(2) يعطي نفس الناتج بالضبط. في حالة الوظائف:

def square(x): return x**2

وظيفة square() هو عنصر نائب لحساب تربيع رقم. يمكن كتابة هذا الحساب بطريقة غير معروفة مثل lambda x: x**2.
â € <
بعد هذا الاستطراد الفلسفي ، دعنا نرى بعض الأمثلة على تطبيقات lambda الوظائف.
â € <

استخدام Lambda مع الوظيفة Sorted ()

sorted() تعمل الدالة على فرز الملف القابل للتكرار. يقبل وظيفة على أنها key الوسيطة ، ويتم استخدام نتيجة الوظيفة المطبقة على كل عنصر من العناصر القابلة للتكرار لترتيب العناصر.
â € <
هذا مناسب تمامًا لـ lambda الوظيفة: عن طريق ضبط ملف key المعلمة مع أ lambda وظيفة ، يمكننا الفرز حسب أي نوع من سمات العناصر. على سبيل المثال ، يمكننا فرز قائمة الأسماء حسب اللقب:

name_list = ['Grace Hopper', 'Ada Lovelace', 'Emmy Noether', 'Marie Curie']
​
sorted_by_surname = sorted(name_list, key = lambda x: x.split()[1])
​
print(sorted_by_surname)
['Marie Curie', 'Grace Hopper', 'Ada Lovelace', 'Emmy Noether']

استخدام Lambda مع وظيفة "filter ()"

filter() الوظيفة لديها بناء الجملة التالي: filter(function, iterable) ويخرج عناصر iterable التي تقيم function(element) كصحيح (إنه مشابه لـ WHERE جملة في SQL). يمكننا ان نستخدم lambda يعمل كمعلمات ل filter() لتحديد عناصر من ملف متكرر.

خذ بعين الاعتبار المثال التالي:

num_list = list(range(0,100))
​
multiples_of_15= filter(lambda x: (x % 3 == 0) and (x % 5 == 0), num_list)
​
print(list(multiples_of_15))
[0, 15, 30, 45, 60, 75, 90]

filter() يطبق lambda وظيفة lambda x: (x % 3 == 0) and (x % 5 == 0) لكل عنصر من range(0,100)، ويعود أ filter هدف. نصل إلى العناصر من خلال صبها على أنها list.
â € <

استخدام Lambda مع وظيفة map ()

â € <
مثالنا الأخير هو شيء رأيناه في المقدمة - وهو map() وظيفة. ال map() صيغة الوظيفة هي: map(function, iterable)و map() ينطبق function لكل عنصر من iterable، عائد أ map الكائن الذي يمكن الوصول إليه عن طريق إرساله إلى ملف list.

لقد رأينا كيف يمكن تطبيق هذا على القوائم ، ولكن يمكن تطبيقه على الإملاءات باستخدام dict.items() الأسلوب:

my_data = {'Mary':1, 'Alice':2, 'Bob':0}
map_obj = map(lambda x: f'{x[0]} had {x[1]} little lamb', my_data.items())
print(', '.join((map_obj)))
Mary had 1 little lamb, Alice had 2 little lamb, Bob had 0 little lamb

أو إلى سلسلة:

my_string = 'abcdefg'
''.join(map(lambda x: chr(ord(x)+2),my_string))
'cdefghi'

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

يمكننا استخدام map() تعمل بطرق بارعة - أحد الأمثلة هو تطبيق العديد من الوظائف على نفس المدخلات.

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

تستخرج كل وظيفة بعض الميزات من النص. الميزات التي نريد استخراجها هي عدد الكلمات ، الكلمة الثانية والحرف الرابع من الكلمة الرابعة:

def number_of_words(text):
  return len(text.split())
​
def second_word(text):
  return text.split()[1]
​
def fourth_letter_of_fourth_word(text):
  return text.split()[3][3]
​
function_list = [number_of_words, second_word, fourth_letter_of_fourth_word]
​
my_text = 'Mary had a little lamb'
map_obj = map(lambda f: f(my_text), function_list)
​
feature_list = list(map_obj)
​
print(feature_list)
[5, 'had', 't']

â € <

وفي الختام

â € <
في هذا الدليل ، اكتشفنا وظائف lambda وظائف في بايثون. لقد رأينا ذلك lambda الدوال هي وظائف مجهولة الهوية لاستخدامها كمعامل دالة مضمنة لوظائف أخرى. لقد رأينا بعض حالات الاستخدام وكذلك حالات عدم استخدامها.
â € <
عند البرمجة ، من المهم أن تضع في اعتبارك اقتباس دونالد كنوث: "البرامج مصممة ليقرأها البشر وعلى سبيل العرض فقط لكي تنفذها أجهزة الكمبيوتر." بوضع هذا بعين الاعتبار، lambda الوظائف هي أداة مفيدة لتبسيط الكود الخاص بنا ، ولكن يجب استخدامها بحكمة.

الطابع الزمني:

اكثر من ستاكابوز