10

Lambda ופונקציות מתקדמות

Lambda, Map, Filter

🎯 מטרות הלמידה

  • Lambda functions
  • map()
  • filter()
  • sorted with key

10.1Lambda

⚡ פונקציות אנונימיות

# פונקציה רגילה
def double(x):
    return x * 2

# Lambda - שורה אחת
double = lambda x: x * 2
print(double(5))  # 10

# מיון לפי קריטריון
names = ['Bob', 'Alice', 'Charlie']
sorted_names = sorted(names, key=lambda x: len(x))
print(sorted_names)  # ['Bob', 'Alice', 'Charlie']

10.2Lambda Functions

λ Lambda - פונקציה אנונימית

Lambda היא פונקציה קצרה ואנונימית (ללא שם) שנכתבת בשורה אחת. מחזירה ערך אוטומטית ללא return.

def רגילLambda
def add(a, b):
  return a + b
add = lambda a, b: a + b
# Lambda בסיסית
greet = lambda name: f'שלום {name}!'
print(greet('דני'))  # שלום דני!

# עם מספר פרמטרים
multiply = lambda a, b: a * b
print(multiply(3, 4))  # 12

# Lambda בתוך ביטוי
print((lambda x: x ** 2)(5))  # 25 (IIFE)
⚠️ Lambda מוגבלת לביטוי אחד! אין אפשרות לכתוב if/else מרובת שורות, לולאות, או return מפורש.

10.3map() ו-filter() עם Lambda

🗺️ map() ו-filter()

שתי פונקציות מובנות שפועלות על אוספים ומחזירות אובייקט עצל (iterator) — חייבים להמיר ל-list כדי לראות תוצאה!

numbers = [1, 2, 3, 4, 5, 6]

# map() - מפעיל פונקציה על כל איבר
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16, 25, 36]

# filter() - מסנן לפי תנאי
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # [2, 4, 6]

# שרשור map ו-filter
result = list(map(lambda x: x**2, filter(lambda x: x > 3, numbers)))
print(result)  # [16, 25, 36]
⚠️ מלכודת מבחן: map() ו-filter() מחזירים iterator, לא list! print(map(...)) ידפיס <map object at 0x...> ולא את הערכים!

10.4sorted() עם key=lambda

🔤 מיון מותאם אישית

sorted() מקבלת פרמטר key — פונקציה שנקראת על כל איבר לפני השוואה.

# מיון מחרוזות לפי אורך
words = ['Python', 'is', 'awesome', 'and', 'fun']
sorted_by_len = sorted(words, key=lambda w: len(w))
print(sorted_by_len)  # ['is', 'and', 'fun', 'Python', 'awesome']

# מיון טאפלים לפי האיבר השני
pairs = [('Alice', 30), ('Bob', 25), ('Charlie', 35)]
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs)  # [('Bob', 25), ('Alice', 30), ('Charlie', 35)]

# מיון הפוך
desc = sorted(words, key=lambda w: len(w), reverse=True)
print(desc)  # ['awesome', 'Python', 'and', 'fun', 'is']
💡 key=lambda לא משנה את הרשימה המקורית. sorted() תמיד מחזיר רשימה חדשה.

10.5Closures ו-nonlocal

🔐 Closure - פונקציה שזוכרת

פונקציה פנימית יכולת לזכור את הסביבה של הפונקציה החיצונית שהגדירה אותה — גם אחרי שהחיצונית סיימה לרוץ.

def make_counter(start=0):
    count = start

    def increment():
        nonlocal count  # חובה לשנות משתנה חיצוני!
        count += 1
        return count

    return increment

counter = make_counter(10)
print(counter())  # 11
print(counter())  # 12
print(counter())  # 13

# כל קריאה ל-make_counter יוצרת closure עצמאי
counter2 = make_counter(0)
print(counter2())  # 1  ← עצמאי מ-counter!
⚠️ בלי nonlocal: count += 1 יזרוק UnboundLocalError כי פייתון תנסה לקרוא משתנה מקומי שלא הוגדר עדיין.

שאלות תרגול

5 שאלות בנושא זה

התחל תרגול →