إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

دالة لامدا

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • [شرح] دالة لامدا

    هي طريقة لكتابة الدالة
    فمثلا
    كود:
    [LEFT]a = lambda x: x + 1 
    print a(1) 
    assert(a(1) == 2)[/LEFT]
    هي نفسها

    كود:
    [LEFT]def a(x): return x + 1 
     print a(1)
    assert(a(1) == 2)
    [/LEFT]
    استعملنا (assert) للتأكد من الناتج


    كل شيء تفعله بدوال اللامبدا تستطيع فعله بالدوال العادية لهذا يعتبرها البعض طريقة أخرى لكتابة الدوال أو شيء جمالي(sugar syntax) ،ولكن فائدتها تظهر في البرمجة ا لوظيفية(functional programming)




    اللامبدا دالة ولكن تختلف عن الدالة العادية

    كود:
    [LEFT]  >>> a = lambda x: x + 1
     >>> type(a)
     <type 'function'>
     
    [/LEFT]
    لتسهيل قراءة اللامبدا استبدل كلمة (lambda) بـ(function) في نفسك

    كود:
    [LEFT]  >>> f = lambda x: x + 1
     >>> f(3)
     4
    [/LEFT]
    لتصبح هكذا

    كود:
    [LEFT]  > f = function(x) { x + 1 }
     > f(3)
     4[/LEFT]

    لذا يصفها البعض بأنها دالة بدون اسم.


    كثيرا ماتأتي اللامبدا مع هذه الدوال (map)(filter)وبدرجة أقل مع (reduce)


    وجميعها النموذج لها(prototype) هكذا

    كود:
    [LEFT]                       
    map(function, sequence)
     
    filter(function, sequence)
     
    reduce(function, sequence)[/LEFT]
    sequence أي نطاق أومدى

    يمكن اعتبار(map) و(filter) و(redue) دوال تحتوي على دوال



    1.map
    نأخذ مثال
    كود:
    [LEFT]
     def addOne(x): return x + 1
     result = map(addOne, [1, 2, 3, 4, 5, 6, 7])
     assert(result == [2, 3, 4, 5, 6, 7, 8])
    [/LEFT]

    لنشرح هذا الكود
    :
    يؤخذ كل عنصر من القائمة وتطبق عليها الدالة فينتج عندنا قائمة أخرى بالنتائج وهي:[2, 3, 4, 5, 6, 7, 8]
    فعمل ال(map) هو أخذ كل العناصر الموجود وإدخالها في الدالة تباعا ولهذا سميت بهذا الاسم لأن القائمة الأولى أصبحت كالمفاتيح والقائمة الثانية كالقيم في القواميس.




    ونستطيع كتابتها هكذا بدون استخدام ال(map)

    كود:
    [LEFT]                        
    result = [x + 1 for x in [1, 2, 3, 4, 5, 6, 7]] 
     
    assert(result == [2, 3, 4, 5, 6, 7, 8])[/LEFT]


    الآن مارأيك لو بدلنا الدالة باللامبدا


    كود:
    [LEFT]  result = map(lambda x: x+1, [1, 2, 3, 4, 5, 6, 7])
     assert(result == [2, 3, 4, 5, 6, 7, 8])
     
    [/LEFT]
    الآن لو بدلنا القائمة بالمدى(range)

    كود:
    [LEFT] [FONT=Times New Roman, serif][FONT=DejaVu Sans Mono, monospace]result = map(lambda x: x + 1, range(1, 8)) [/FONT][/FONT]
     [FONT=Times New Roman, serif][FONT=DejaVu Sans Mono, monospace]assert(result == [2, 3, 4, 5, 6, 7, 8])[/FONT][/FONT]
     
    
     [/LEFT]


    كلها طرق مختلفة لنتيجة واحدة.






    2. filter
    عملها معاكس لعمل ال(map) حيث كان ال(map) نعطيه القائمة ثم يطبق على كل عناصرها أم ال(filter) فنعطيه قائمة لا تخرج النتائج عنها
    بالمثال يتضح المقال

    كود:
    [LEFT] result = filter(lambda x: x % 3 == 0, [1, 2, 3, 4, 5, 6, 7, 8, 9])
     assert(result == [3, 6, 9])
    [/LEFT]
    أعطيناه شرط وهو الأعداد التي يكون باقي القسمة على ثلاثة يساوي 0 ولم تحقق هذا الشرط من العناصر المعطاة إلا [3, 6, 9]


    نكتبها بطريقة أخرى

    كود:
    [LEFT] result = [x for x in [1, 2, 3, 4, 5, 6, 7, 8, 9] if x % 3 == 0]
     assert(result == [3, 6, 9])
    [/LEFT]
    فهي شرعت في عملية تصفية(filter) وأخذت من القائمة ما تنطبق عليها الشروط فقط






    2. reduce
    قليلة الإستعمال يتضح كمها من هذا الكود

    كود:
    [LEFT] def add(x,y): return x+y
     result = reduce(add, range(1, 11))
     assert (result == 55)
     عمل ال(reduce)[/LEFT]
    هذه الخطوات:
    1. يأخذ أول عنصرين ويطبق عليها الدالة.
    2. يأخذ الناتج من الخطوة السابقة والعنصر الثالث ويطبق عليها الدالة.
    3. يأخذ الناتج من الخطوة السابقة والعنصر الرابع ويطبق عليها الدالة.
      وهكذا حتى تنتهي العناصر ففي كل خطوة تقل عناصر القائمة ولهذا تسمى بهذا الاسم.


    -----------------------------------------
    المصادر 1, 2, 3, 4
    التعديل الأخير تم بواسطة حمد محمد; الساعة 06-02-2011, 08:01 PM.
    سبحان الله وبحمده سبحان الله العظيم
يعمل...
X