Python lambda?
Was macht lambda in diesem Code und wofür steht x?
def sort_tasks_by_due_date():
tasks.sort(key=lambda x: datetime.strptime(x["due_date"], "%d.%m.%Y"))
Hier der Komplette Code:
from datetime import datetime, timedelta
tasks = []
def add_task(description, due_date, priority):
task = {"description": description, "due_date": due_date, "priority": priority, "completed": False}
tasks.append(task)
def mark_completed(task_index):
if 0 <= task_index < len(tasks):
tasks[task_index]["completed"] = True
else:
print("Ungültiger Index für Aufgabe!")
def remove_task(task_index):
task_index = int(task_index)
if 0 <= task_index < len(tasks):
del tasks[task_index]
else:
print("Ungültiger Index für Aufgabe!")
def show_tasks():
for task_number, task in enumerate(tasks):
status = "Erledigt" if task["completed"] else "Offen"
print(f"{task_number + 1}. Beschreibung: {task['description']}, Fälligkeitsdatum: {task['due_date']}, Priorität: {task['priority']} - {status}")
def sort_tasks_by_due_date():
tasks.sort(key=lambda x: datetime.strptime(x["due_date"], "%d.%m.%Y"))
def remind_near_due_dates(days_before):
today = datetime.today()
for task in tasks:
due_date = datetime.strptime(task["due_date"], "%d.%m.%Y")
#Das Datum der Aufgabe minus des heutigen Datums, gleichviele Tage wie die Festgelgten Tage ist, dann gib eine Erinnerung aus.
if due_date - today <= timedelta(days=days_before) and not task["completed"]:
print(f"Erinnerung: Die Aufgabe '{task['description']}' ist bald fällig am {task['due_date']}!")
while True:
print("\n--- ToDo-Liste ---")
print("1. Aufgabe hinzufügen")
print("2. Aufgabe als erledigt markieren")
print("3. Aufgabe entfernen")
print("4. Aufgaben anzeigen")
print("5. Aufgaben nach Fälligkeitsdatum sortieren")
print("6. Erinnerung an nahende Fälligkeitsdaten einrichten")
print("7. Beenden")
choice = input("Wähle eine Option: ")
if choice == "1":
description = input("Beschreibung: ")
while True:
due_date = input("Fälligkeitsdatum (TT.MM.JJJJ): ")
try:
due_date_obj = datetime.strptime(due_date, "%d.%m.%Y")
if due_date_obj < datetime.today():
print("Fehler: Das Datum liegt in der Vergangenheit! Bitte geben Sie ein zukünftiges Datum ein.")
else:
break
except ValueError:
print("Fehler: Ungültiges Datumsformat! Bitte geben Sie das Datum im Format TT.MM.JJJJ ein.")
priority = input("Priorität: ")
add_task(description, due_date, priority)
elif choice == "2":
task_index = int(input("Index der erledigten Aufgabe: ")) - 1
mark_completed(task_index)
elif choice == "3":
try:
task_index = int(input("Index der zu entfernenden Aufgabe: ")) - 1
remove_task(task_index)
except ValueError:
print("Ungültige Eingabe! Bitte geben Sie eine Ganzzahl ein.")
elif choice == "4":
show_tasks()
elif choice == "5":
sort_tasks_by_due_date()
elif choice == "6":
try:
days_before = int(input("Tage vor Fälligkeitsdatum für Erinnerung: "))
remind_near_due_dates(days_before)
except ValueError:
print("Gib eine gültige Eingabe ein!")
elif choice == "7":
break
else:
print("Ungültige Auswahl!")
2 Antworten
Lambdas sind anonyme Funktionen, also Funktionen, die keinen Namen tragen und nicht via Name referenziert werden können. Natürlich mußt Du die Parameter irgendwie benennen x ist hier der Name des Parameters.
>>> def plusone(x):
... return x+1
...
>>> plusone(12)
13
Einfache Funktion, soweit so klar.
>>> t=lambda x: x+1
>>> t(12)
13
Hier habe ich einem Lambda einen Namen gegeben, um es aufrufen zu können, genausogut kann ich dieses Lambda eben als namenlos Funktion als Parameter übergeben, wie in Deinem Beispiel, man kann das übrigens auch mit mehreren Parametern machen:
>>> t=lambda x,y:x if x<y else y
>>> t(3,4)
3
>>> t(8,4)
4
Lambdas werden gerne im Kontext von Sortieren verwendet, weil man dadurch flexibler Vergleichskriterien festlegen kann, ohne daß man einen Operator überladen müsste.
Hier mal eine Nutzung als 'Closure':
>>> def calc(x):
... return {'+': lambda x,y:x+y, '-': lambda x,y:x-y, '*': lambda x,y:x*y, '/': lambda x,y:x/y}[x]
...
>>> calc('+')(3,4)
7
>>> calc('/')(8,3)
2.6666666666666665
Was macht lambda in diesem Code und wofür steht x?
Mit Lambdas kann man kleine, namenlose Funktionen direkt an Ort und Stelle definieren, statt dem üblichen Weg mit def: https://www.python-kurs.eu/lambda.php
Das ist z.B. dann sinnvoll, wenn die Funktion eh nur an einer Stelle benötigt wird. In diesem Programm wird sie zum Sortieren nach Datum ("due date") verwendet: man kann der sort-Methode so mitgeben, wonach sie eigentlich sortieren soll.
x steht für den übergebenen Wert, also für einen formalen Parameter, so wie bei jeder Funktionsdefinition.