ما هي وظائف لامدا؟
â € <
في 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**2
def named_square(x): return x**2
print(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
الوظائف هي أداة مفيدة لتبسيط الكود الخاص بنا ، ولكن يجب استخدامها بحكمة.