Das *args
Teil des Abschnitts Objektorientierte Programmierung der Python-Journey von Coddy. Lektion 42 von 64.
Der Parameter *args ermöglicht es einer Methode, eine beliebige Anzahl von Positionsargumenten zu akzeptieren. Das Sternchen sammelt alle zusätzlichen Positionsargumente in einem Tupel.
Hier ist ein Beispiel für eine Methode, die *args verwendet:
class Calculator:
def add_numbers(self, *args):
return sum(args)
def show_numbers(self, *args):
for i, num in enumerate(args):
print(f"Number {i+1}: {num}")Rufe die Methode mit einer unterschiedlichen Anzahl von Argumenten auf:
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1) # 6
print(result2) # 150*args sammelt alle Argumente in einem Tupel:
calc.show_numbers(5, 10, 15, 20)Ausgabe:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Reguläre Parameter mit *args kombinieren:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # Neue Zeile
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")Verwende *args in Konstruktormethoden:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
def show_team(self):
print(f"Team: {self.team_name}")
for player in self.players:
print(f"- {player}")
team = Team("Warriors", "Alice", "Bob", "Charlie", "Diana")
team.show_team()Ausgabe:
6
150
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20
[INFO] User logged in
[ERROR] Connection failed
Team: Warriors
- Alice
- Bob
- Charlie
- DianaDu kannst Argumente auch beim Aufrufen von Methoden entpacken:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Entpackt die Liste
print(result) # 15Wichtiger Punkt: *args sammelt eine beliebige Anzahl von Positionsargumenten in einem Tupel. Verwende es, wenn du nicht weißt, wie viele Argumente an eine Methode übergeben werden. Der Name args ist konventionell – du könntest nach dem Sternchen jeden beliebigen Namen verwenden, aber args ist der Standard.
Aufgabe
EinfachIn dieser Herausforderung implementierst du eine flexible Zahlen-Hilfsfunktion.
Bearbeite die Datei number_utils.py, um die Funktion sum_all_numbers zu implementieren, die eine beliebige Anzahl numerischer Argumente akzeptiert und ihre Summe zurückgibt. Die Funktion sollte:
- 0 zurückgeben, wenn keine Argumente bereitgestellt werden
- "Error: All arguments must be numbers" ausgeben und None zurückgeben, wenn nicht numerische Argumente bereitgestellt werden
- Boolesche Werte (
True/False) zählen hier nicht als Zahlen und müssen ebenfalls abgelehnt werden, obwohlbooleine Unterklasse vonintist
Die Datei number_utils.py enthält ausführliche TODO-Kommentare, die dich bei der Implementierung unterstützen. Befolge diese Kommentare sorgfältig, um sicherzustellen, dass deine Lösung alle Anforderungen erfüllt.
Probier es selbst
from number_utils import sum_all_numbers
# Umfassender Testfall-Handler
test_case = input()
if test_case == "basic_test":
# Teste grundlegende Funktionalität mit positiven Ganzzahlen
print(sum_all_numbers(1, 2, 3)) # Sollte 6 zurückgeben
print(sum_all_numbers()) # Sollte 0 zurückgeben
print(sum_all_numbers(10, 20, 30, 40)) # Sollte 100 zurückgeben
print(sum_all_numbers(1, 2, "three")) # Sollte Fehler ausgeben und None zurückgeben
elif test_case == "float_test":
# Teste mit Gleitkommazahlen
print(sum_all_numbers(1.1, 2.2, 3.3)) # Sollte 6.6 zurückgeben
print(sum_all_numbers(5.5, 5.0)) # Sollte 10.5 zurückgeben
elif test_case == "mixed_numbers_test":
# Teste mit einer Mischung aus Ganzzahlen und Gleitkommazahlen
print(sum_all_numbers(5, 5.5)) # Sollte 10.5 zurückgeben
print(sum_all_numbers(10, 20.5, 30, 40)) # Sollte 100.5 zurückgeben
elif test_case == "zero_values_test":
# Teste mit Nullwerten
print(sum_all_numbers(0, 0, 0)) # Sollte 0 zurückgeben
print(sum_all_numbers(0)) # Sollte 0 zurückgeben
print(sum_all_numbers()) # Sollte 0 zurückgeben
elif test_case == "negative_values_test":
# Test mit negativen Werten
print(sum_all_numbers(-1, -2, -3)) # Sollte -6 zurückgeben
print(sum_all_numbers(-5, -5)) # Sollte -10 zurückgeben
print(sum_all_numbers(-5, 5)) # Sollte 0 zurückgeben
elif test_case == "large_values_test":
# Test mit sehr großen Werten
print(sum_all_numbers(1000000000, 1000000000)) # Sollte 2000000000 zurückgeben
print(sum_all_numbers(1000000000, 2000000000.5)) # Sollte 3000000000.5 zurückgeben
elif test_case == "single_value_test":
# Test mit einem einzelnen Wert
print(sum_all_numbers(5)) # Sollte 5 zurückgeben
print(sum_all_numbers(-10)) # Sollte -10 zurückgeben
print(sum_all_numbers(3.5)) # Sollte 3.5 zurückgeben
elif test_case == "error_handling_test":
# Test mit verschiedenen nicht-numerischen Werten
print(sum_all_numbers("string")) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers([1, 2, 3])) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers({"key": "value"})) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers(True)) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers(None)) # Sollte Fehler ausgeben und None zurückgeben
elif test_case == "mixed_valid_invalid_test":
# Test mit einer Mischung aus gültigen und ungültigen Werten
print(sum_all_numbers(1, 2, "three")) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers(1, [2, 3], 4)) # Sollte Fehler ausgeben und None zurückgeben
print(sum_all_numbers(1.5, "two", 3)) # Sollte Fehler ausgeben und None zurückgeben
elif test_case == "empty_args_test":
# Test ohne Argumente
print(sum_all_numbers()) # Sollte 0 zurückgebenDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDer self-ParameterMethodenAttributeKonstruktormethode (__init__)Zusammenfassung – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDie super()-FunktionMethodenüberschreibungMehrfachvererbungMethodenauflösungsreihenfolgeWiederholung – Mitarbeiterhierarchie7Spezielle Methoden
Einführung in magische MethodenOperatorüberladungMagische Methoden für ContainerRückblick – Benutzerdefinierte Liste10Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster13Abschließende Herausforderungen
E-Learning-PlattformBankensystemEntwicklung von SpielfigurenFahrzeugvermietungsservice2Dekoratoren
Einführung in DekoratorenProperty-DekoratorDekorator für statische MethodenDekorator für Klassenmethoden5Polymorphie
Methodenüberschreibung erneut betrachtetDuck-TypingAbstrakte Klassen und MethodenSchnittstellendesignRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungMixinsStatische Methoden und KlassenmethodenKlassen-DekoratorenKontextmanager3Klassenattribute
Instanz- vs. KlassenvariablenProperty-DecoratorsPrivate AttributeWiederholung – Bankkontoverwaltung6Kapselung
Öffentliche, geschützte, private MemberZugriffsmodifikatorenInformationsverbergungProperty-Decorators – FortgeschrittenWiederholung – System zur Verwaltung von Studentendaten12Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und BenutzerklassenAusleihsystemSuchfunktionAdministrationsoberflächeTests und IntegrationÜbe selbstständig: Online-Python-Compiler