פונקציה שלא טורחים לתת לה שם
רוב הפונקציות ב-Python מוגדרות עם def, יש להן שם, והן יושבות בקובץ שבו אפשר להשתמש בהן שוב. lambda היא חלופה קטנה יותר וללא שם, שימושית במקרים המעטים שבהם הגדרת פונקציה מלאה הייתה יותר טקס ממה שהיא שווה.
הנה שתי הצורות זו לצד זו:
שתי פונקציות שעושות בדיוק את אותו הדבר. גרסת ה-lambda נכנסת בשורה אחת, כי זה בעצם התפקיד שלה: פונקציה חד-פעמית לרגע חד-פעמי.
תחביר
lambda <params>: <expression>
<params>היא אותה רשימת פרמטרים ש-defהייתה משתמשת בה, כולל ערכי ברירת מחדל,*argsו-**kwargs.<expression>הוא ביטוי יחיד שהערך שלו הופך לערך המוחזר.
דוגמאות:
אין מילת מפתח return. הערך של הביטוי מוחזר באופן מרומז.
המגבלה היחידה
lambda יכולה להכיל רק ביטוי אחד. אי אפשר לשים בה פקודות:
אבל אפשר להשתמש בביטוי התנאי (ternary):
אם אתם צריכים יותר מביטוי אחד, זה הסימן לעבור ל-def.
איפה lambda באמת מצדיקה את עצמה
lambda שמושמת למשתנה כמעט תמיד גרועה יותר מ-def עם שם:
זה גרוע יותר באופן חד-משמעי מ-def double(x): return x * 2: אותה קריאוּת, ובנוסף גרסת ה-lambda נותנת לדיבאגרים את השם חסר התועלת <lambda> ב-stack traces.
lambda מבריקה במקום אחד בדיוק: כארגומנט שכותבים ישירות בקריאה לפונקציות מסדר גבוה.
מפתחות מיון מותאמים
המקרה הקלאסי:
הארגומנט key של sorted מצפה לפונקציה שמקבלת פריט ומחזירה את הערך שלפיו ממיינים. lambda של שורה אחת מתאימה בדיוק, ו-def מלאה הייתה מרגישה כבדה למשהו קטן כל כך.
אפשר למיין לפי כמה שדות בעזרת tuple:
min, max, filter, map
אותו סיפור: כולן מקבלות ארגומנט אופציונלי של פונקציה:
עבור map ו-filter, list comprehension בדרך כלל ברורה עוד יותר:
רוב מתכנתי Python מעדיפים comprehensions על פני map/filter מהסיבה הזו. lambda נשארת בחירה טבעית עבור sorted, min ו-max, שבהן אין קיצור של comprehension.
lambda והמודול operator
כשה-lambda שלכם היא רק "קח מפתח" או "קח attribute", למודול operator של Python יש חלופות מהירות וברורות יותר:
לא ניצחון ענק, אבל בקוד שכבר מייבא את operator זה נקרא קצת יותר הצהרתי.
מתי לחזור ל-def
אם אחד מאלה נכון, כתבו def:
- הלוגיקה לא נכנסת בצורה נקייה בביטוי אחד.
- אתם רוצים לתת לפונקציה שם, כי השם ישפר את הקריאוּת.
- הייתם משתמשים באותה לוגיקה ביותר ממקום אחד.
- הפונקציה צריכה docstring (ל-lambda אי אפשר לצרף אחד).
זכרו: ב-Python לא מקבלים ניקוד לפי מספר השורות. פונקציה עם שם בת שלוש שורות כמעט תמיד קריאה יותר מ-lambda של שורה אחת, ברגע שהלוגיקה אינה טריוויאלית.
הצעד הבא: Decorators
lambda מעבירה פונקציות כערכים. Decorators לוקחים את אותו רעיון צעד אחד קדימה: הם מאפשרים לעטוף כל פונקציה בהתנהגות שאפשר לעשות בה שימוש חוזר, כמו לוגים, מדידת זמן, caching או הרשאות, בעזרת @ אחד בשורה שמעליה. זה העמוד הבא.
שאלות נפוצות
מה זה lambda ב-Python?
lambda היא פונקציה קצרה ואנונימית שאפשר לכתוב בשורה אחת. lambda x: x * 2 שקולה ל-def double(x): return x * 2, רק בלי שם. היא שימושית במיוחד כשצריך פונקציה קטנטנה כארגומנט לפונקציה אחרת.
מתי להשתמש ב-lambda במקום ב-def?
השתמשו ב-lambda עבור פונקציות חד-פעמיות של ביטוי אחד שמעבירים ישירות למשהו כמו sorted, max או filter. לכל דבר עם גוף ארוך יותר מביטוי אחד, או לכל דבר שהייתם נותנים לו שם, השתמשו ב-def. פונקציות עם שם כמעט תמיד ברורות יותר.
מהן המגבלות של lambda?
lambda יכולה להכיל רק ביטוי אחד, לא פקודות. אין השמות, אין בלוקי if (אם כי אפשר להשתמש בביטוי התנאי a if cond else b), ואין לוגיקה של כמה שורות. אם אתם נאבקים במגבלות האלה, עברו ל-def.