الدوال lambda و map و filter
يمكن استخدام بيثون في البرمجة الوظيفية أو في البرمجة الكائنية، والهدف من ذلك جعل بيثون سهلا وقويا في آن. سنتحدث في هذا الموضوع عن الدوال lambda و map و filter
الدوال lambda
هي دوال كغيرها لكن بدون تعريف (بدون اسم)، بمعنى أن كل ما نستطيع القيام به بواسطة دالة lambda يمكننا القيام به بواسطة دالة معرفة، وبالتالي ليس لاستخدام دوال lambda ضرورة خاصة، فهي لا تمثل سوى تيسيرا للمبرمج ليكتب كودا يكون أحيانا اكثر بساطة وتعبيرا.
كيف نكتب دالة lambda
نكتب الكلمة المفتاحية lambda متبوعة بوسيط او اكثر (هنا x) ثم النقطتان متبوعتان بالتعبير الذي نريد تنفيذه
كود :
lambda x: x**2 -1
كود :
fx = lambda x: x**2 -1
fx # <function <lambda> at 0x7f90fc3f2c80>
fx(5)
سنعرف دالة عادية باسم image بسيطة للغاية تأخذ دالة f كوسيط:
كود :
def image(f):
for x in range(10):
print("f({}) = {}".format(x, f(x)))
كود :
image(lambda x: x**2 - 1)
كود :
def f(x):
return x**2 - 1
image(f)
الدوال map و filter
هما دالتان مدمجتان في بيثون مستخدمتان اساسا في البرمجة الوظيفية: map تتيح تطبيق دالة على كل عنصر من عناصر كائن تكراري iterable وترد لنا مكرِّرا (iterator) من نوع map:
كود :
m = map(f, range(10))
m # <map object at 0x7f90fc4164e0>
list(m) # [-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
كود :
m = map(lambda x: x**2 - 1, range(10))
list(m) # [-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
تيح الدالة filter، كما يوضح اسمها، غربلة/تصفية عناصر كائن تكراري iterable حسب تعليمة فرز/انتقاء وترد لنا [b]مكرِّراiterator من نوع filter[/b]
كود :
f = filter (lambda x: x % 2 == 0, range(10))
f # <filter object at 0x7f90fc3e8f98>
list(f) # [0, 2, 4, 6, 8]
كود :
# map vs list comprehension
m = map(lambda x: x**2 - 1, range(10))
list(m) # [-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
m = [x**2 - 1 for x in range(10)]
print(m) # [-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
كود :
# filter vs list comprehension
f = filter (lambda x: x % 2 == 0, range(10))
list(f) # [0, 2, 4, 6, 8]
f = [x for x in range(10) if x % 2 == 0]
print(f) # [0, 2, 4, 6, 8]
نقطة اضافية ربما علينا أن نتذكرها، الا وهي أن ما تنتجه الدالتان map و filter هو [b]مكرِّر(iterator)، اي مؤشر لا نستطيع التنقل بواسطته الا مرة واحدة، فاذا رغبنا في اعادة استخدامه مرة اخرى علينا اعادة انشائه:[/b]
كود :
m = map(lambda x: x**2 - 1, range(10))
list(m) # [-1, 0, 3, 8, 15, 24, 35, 48, 63, 80]
list(m) # []
بعض الاستخدامات البسيطة: استخراج العنصر الاكبر او الاصغر او المجموع (لاحظ انه لا يمكنك استخدام map سوى مرة واحدة):
كود :
# max
m = map(lambda x: x**2 - 1, range(10))
m_max = max(m)
m_max
# min
m = map(lambda x: x**2 - 1, range(10))
m_min = min(m)
m_min
# sum
m = map(lambda x: x**2 - 1, range(10))
m_sum = sum(m)
m_sum
كود :
mlist = [(43, 17), (42, 10), (46, 7), (55, 15)]
كود :
mlist.sort(key = lambda x: x[1])
print(mlist)
كود :
mtuple = ((43, 17), (42, 10), (46, 7), (55, 15))
msorted = sorted(mtuple, key = lambda x:x[1])
print(msorted) # a sorted list
tuple(msorted) # transformed to tuple
print(mtuple) # the original tuple
راجع الدوال المدمجة في لغة بيثون: https://docs.python.org/3/library/functi...-functions
[b]وحول البرمجة الوظيفية راجع الرابط التالي: https://docs.python.org/3/howto/functional.html[/b]
ملاحظة أخيرة:
حاولت ترجمة المفردات التالية قدر المستطاع وربما وقعت في لبس. أرحب بكل الملاحظات المفيدة:
تكراري = iterable
مكرِّر = iterator
تكرار = iteration