Parametr *args
Część sekcji Programowanie obiektowe ścieżki Python w Coddy. Lekcja 42 z 64.
Parametr *args pozwala metodzie przyjmować dowolną liczbę argumentów pozycyjnych. Gwiazdka zbiera wszystkie dodatkowe argumenty pozycyjne w krotkę.
Oto przykład metody używającej *args:
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}")Wywołaj metodę z różną liczbą argumentów:
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 zbiera wszystkie argumenty do krotki:
calc.show_numbers(5, 10, 15, 20)Wynik:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Łącz zwykłe parametry z *args:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # Nowa linia
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")Używaj *args w metodach konstruktora:
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()Wynik:
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
- DianaMożesz także rozpakowywać argumenty podczas wywoływania metod:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Rozpakowuje listę
print(result) # 15Najważniejsze: *args zbiera dowolną liczbę argumentów pozycyjnych w krotkę. Używaj go, gdy nie wiesz, ile argumentów zostanie przekazanych do metody. Nazwa args jest umowna — po gwiazdce możesz użyć dowolnej nazwy, ale args jest standardem.
Wyzwanie
ŁatwyW tym wyzwaniu zaimplementujesz elastyczną funkcję narzędziową do obsługi liczb.
Edytuj plik number_utils.py, aby zaimplementować funkcję sum_all_numbers, która przyjmuje dowolną liczbę argumentów liczbowych i zwraca ich sumę. Funkcja powinna:
- Zwracać 0, jeśli nie podano żadnych argumentów
- Wypisywać "Error: All arguments must be numbers" i zwracać None, jeśli podano argumenty nienumeryczne
- Wartości logiczne (
True/False) nie są tutaj uznawane za liczby i również muszą zostać odrzucone, mimo żebooljest podtypemint
Plik number_utils.py zawiera szczegółowe komentarze TODO, które pomogą Ci w implementacji. Uważnie stosuj się do tych komentarzy, aby mieć pewność, że Twoje rozwiązanie spełnia wszystkie wymagania.
Spróbuj swoich sił
from number_utils import sum_all_numbers
# Kompleksowa obsługa przypadków testowych
test_case = input()
if test_case == "basic_test":
# Test podstawowej funkcjonalności z dodatnimi liczbami całkowitymi
print(sum_all_numbers(1, 2, 3)) # Powinno zwrócić 6
print(sum_all_numbers()) # Powinno zwrócić 0
print(sum_all_numbers(10, 20, 30, 40)) # Powinno zwrócić 100
print(sum_all_numbers(1, 2, "three")) # Powinno wyświetlić błąd i zwrócić None
elif test_case == "float_test":
# Test z liczbami zmiennoprzecinkowymi
print(sum_all_numbers(1.1, 2.2, 3.3)) # Powinno zwrócić 6.6
print(sum_all_numbers(5.5, 5.0)) # Powinno zwrócić 10.5
elif test_case == "mixed_numbers_test":
# Test z mieszanką liczb całkowitych i zmiennoprzecinkowych
print(sum_all_numbers(5, 5.5)) # Powinno zwrócić 10.5
print(sum_all_numbers(10, 20.5, 30, 40)) # Powinno zwrócić 100.5
elif test_case == "zero_values_test":
# Test z wartościami zerowymi
print(sum_all_numbers(0, 0, 0)) # Powinno zwrócić 0
print(sum_all_numbers(0)) # Powinno zwrócić 0
print(sum_all_numbers()) # Powinno zwrócić 0
elif test_case == "negative_values_test":
# Test z wartościami ujemnymi
print(sum_all_numbers(-1, -2, -3)) # Powinno zwrócić -6
print(sum_all_numbers(-5, -5)) # Powinno zwrócić -10
print(sum_all_numbers(-5, 5)) # Powinno zwrócić 0
elif test_case == "large_values_test":
# Test z bardzo dużymi wartościami
print(sum_all_numbers(1000000000, 1000000000)) # Powinno zwrócić 2000000000
print(sum_all_numbers(1000000000, 2000000000.5)) # Powinno zwrócić 3000000000.5
elif test_case == "single_value_test":
# Test z pojedynczą wartością
print(sum_all_numbers(5)) # Powinno zwrócić 5
print(sum_all_numbers(-10)) # Powinno zwrócić -10
print(sum_all_numbers(3.5)) # Powinno zwrócić 3.5
elif test_case == "error_handling_test":
# Test z różnymi wartościami nienumerycznymi
print(sum_all_numbers("string")) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers([1, 2, 3])) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers({"key": "value"})) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers(True)) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers(None)) # Powinno wyświetlić błąd i zwrócić None
elif test_case == "mixed_valid_invalid_test":
# Test z mieszanką poprawnych i niepoprawnych wartości
print(sum_all_numbers(1, 2, "three")) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers(1, [2, 3], 4)) # Powinno wyświetlić błąd i zwrócić None
print(sum_all_numbers(1.5, "two", 3)) # Powinno wyświetlić błąd i zwrócić None
elif test_case == "empty_args_test":
# Test bez argumentów
print(sum_all_numbers()) # Powinno zwrócić 0Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektyParametr selfMetodyAtrybutyMetoda konstruktora (__init__)Powtórzenie – prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaFunkcja super()Nadpisywanie metodDziedziczenie wielokrotneKolejność rozwiązywania metodPodsumowanie – hierarchia pracowników7Metody specjalne
Wprowadzenie do metod magicznychPrzeciążanie operatorówMagiczne metody kontenerówPowtórka – własna lista10Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy2Dekoratory
Wprowadzenie do dekoratorówDekorator propertyDekorator metody statycznejDekorator metody klasowej5Polimorfizm
Ponowne omówienie nadpisywania metodTypowanie kaczeKlasy i metody abstrakcyjneProjektowanie interfejsówPodsumowanie — kalkulator kształtów8Zaawansowane koncepcje programowania obiektowego
Kompozycja a dziedziczenieMiksyMetody statyczne i klasoweDekoratory klasMenedżery kontekstu11Wzorce projektowe, część 2
Wzorzec PolecenieWzorzec AdapterWzorzec DekoratorWzorzec Metoda szablonowaWzorzec StanWzorzec Kompozyt3Właściwości klas
Zmienne instancji a zmienne klasoweDekoratory właściwościAtrybuty prywatnePowtórzenie — menedżer kont bankowych6Hermetyzacja
Public, Protected, Private — pamięćModyfikatory dostępuUkrywanie informacjiDekoratory właściwości — zaawansowanePodsumowanie — system ewidencji uczniów12Projekt: System zarządzania biblioteką
Przegląd projektuKlasy Book i UserSystem wypożyczeńFunkcja wyszukiwaniaInterfejs administratoraTestowanie i integracjaPoćwicz samodzielnie: Kompilator Python online