פונקציות למדא

בשפות תכנות, פונקציית למדא או ביטוי למדא (באנגלית: Lambda Expression) הוא הגדרה של פונקציה שאינה שייכת לשם מזהה, ולכן נקרא גם פונקציה אנונימית.

מכיוון שמדובר בביטוי שהטיפוס שלו הוא פונקציה, ההקשרים שבהם נעשה בו שימוש הם הקשרים שבהם הפונקציה מהווה אובייקט (למשל השמת ערכו למשתנה או שימוש כארגומנט לפונקציה שמקבלת פונקציה כפרמטר), ולכן אופייני מאוד לתכנות פונקציונלי.

מקור 

מקור השם "למדא" (על פי האות היוונית) נגזר מ"תחשיב למדא", שהוא מודל חישובי המהווה את הבסיס התאורטי לתכנות פונקציונלי. ביטויי למדא נכללו בשפת התכנות Lisp (1958), שבה lambda היא מילה שמורה המשמשת אופרטור להגדרת הביטוי. מאז, פונקציות אנונימיות נכללו בשפות תכנות רבות, בהן גם שפות מרובות פרדיגמות (שאינן שפות פונקציונליות טהורות). בחלקן המילה lambda משמשת גם כן כמילה שמורה להגדרת הביטוי, למשל Python ו-Ruby.

שימושים 

בשפות רבות התומכות בפונקציות אנונימיות, היתרון הבולט בהן הוא תחביר מקוצר בהשוואה להגדרת פונקציה רגילה. במצבים שונים עשויים להיות יתרונות נוספים, כגון מניעה מכוונת של שימוש בהגדרת הפונקציה מחוץ להקשר שבו הוגדרה (לטובת כימוס למשל), וכן הימנעות מ"זיהום" של מרחב השם. לכן, השימוש בפונקציות אנונימיות עשוי להועיל כאשר יש צורך בהגדרת פונקציה לשימוש נקודתי וחד-פעמי בקוד המקור, כלומר מקרים שבהם לא צפוי להיעשות שימוש חוזר באותה הגדרה של פונקציה.

דוגמה בפייתון 

בשפת התכנות פייתון, התחביר להגדרת פונקציה אנונימית הוא:
lambda parameters: expression
כאשר parameters הם הפרמטרים של הפונקציה (שהם אופציונליים, ומופרדים בפסיק אם ישנם יותר מאחד), ו-expression הוא ביטוי שבאופן טיפוסי מכיל את אותם הפרמטרים, וערכו הוא תוצאת הפונקציה.

לצורך המחשת ההבדל בין הגדרה כזו לפונקציה רגילה, נדגים שימוש בפונקציה המובנית map, שבתיאור פשטני מקבלת שני פרמטרים: פונקציה ואובייקט רב-איברים (כמו רשימה), ומחזירה אובייקט שהוא תוצאה של הפעלת הפונקציה על כל אחד מהאיברים (זהו תיאור גס שהופשט לשם הבהירות). נניח שהמשתנה my_list הוא רשימת מספרים, והפעולה שהיינו רוצים לבצע על כל איבר היא העלאתו בריבוע. ללא פונקציה אנונימית, ניתן לבצע זאת על ידי הגדרת פונקציה קצרה המעלה מספר נתון בריבוע, ואז להשתמש בה כארגומנט לפונקציה map, למשל כך:
def square(x):
    return x * x

squared_list_iterator = map(square, my_list)
לעומת זאת, בשימוש בפונקציה אנונימית ניתן לבצע זאת בשורה אחת:
squared_list_iterator = map(lambda x: x * x, my_list)

תכנות