L'argomento *args
Fa parte della sezione Programmazione orientata agli oggetti del percorso Python di Coddy. Lezione 42 di 64.
Il parametro *args consente a un metodo di accettare un numero qualsiasi di argomenti posizionali. L'asterisco raccoglie tutti gli argomenti posizionali aggiuntivi in una tupla.
Ecco un esempio di metodo che usa *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}")Chiama il metodo con un numero diverso di argomenti:
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 raccoglie tutti gli argomenti in una tupla:
calc.show_numbers(5, 10, 15, 20)Risultato:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Combina i parametri regolari con *args:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # Nuova riga
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")Usa *args nei metodi del costruttore:
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()Output:
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
- DianaPuoi anche decomporre gli argomenti quando chiami i metodi:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Decomprime la lista
print(result) # 15Punto chiave: *args raccoglie un numero qualsiasi di argomenti posizionali in una tupla. Usalo quando non sai quanti argomenti verranno passati a un metodo. Il nome args è convenzionale: potresti usare qualsiasi nome dopo l'asterisco, ma args è quello standard.
Sfida
FacileIn questa sfida implementerai una funzione di utilità flessibile per i numeri.
Modifica il file number_utils.py per implementare la funzione sum_all_numbers, che accetta un numero qualsiasi di argomenti numerici e ne restituisce la somma. La funzione dovrebbe:
- Restituire 0 se non viene fornito alcun argomento
- Stampare "Error: All arguments must be numbers" e restituire None se vengono forniti argomenti non numerici
- I valori booleani (
True/False) qui non sono considerati numeri e devono essere rifiutati, anche seboolè una sottoclasse diint
Il file number_utils.py contiene commenti dettagliati TODO che ti guideranno nell'implementazione. Segui attentamente questi commenti per assicurarti che la tua soluzione soddisfi tutti i requisiti.
Provalo tu
from number_utils import sum_all_numbers
# Gestore completo dei casi di test
test_case = input()
if test_case == "basic_test":
# Verifica la funzionalità di base con numeri interi positivi
print(sum_all_numbers(1, 2, 3)) # Dovrebbe restituire 6
print(sum_all_numbers()) # Dovrebbe restituire 0
print(sum_all_numbers(10, 20, 30, 40)) # Dovrebbe restituire 100
print(sum_all_numbers(1, 2, "three")) # Dovrebbe stampare un errore e restituire None
elif test_case == "float_test":
# Verifica con numeri in virgola mobile
print(sum_all_numbers(1.1, 2.2, 3.3)) # Dovrebbe restituire 6.6
print(sum_all_numbers(5.5, 5.0)) # Dovrebbe restituire 10.5
elif test_case == "mixed_numbers_test":
# Verifica con una combinazione di numeri interi e numeri in virgola mobile
print(sum_all_numbers(5, 5.5)) # Dovrebbe restituire 10.5
print(sum_all_numbers(10, 20.5, 30, 40)) # Dovrebbe restituire 100.5
elif test_case == "zero_values_test":
# Verifica con valori pari a zero
print(sum_all_numbers(0, 0, 0)) # Dovrebbe restituire 0
print(sum_all_numbers(0)) # Dovrebbe restituire 0
print(sum_all_numbers()) # Dovrebbe restituire 0
elif test_case == "negative_values_test":
# Verifica con valori negativi
print(sum_all_numbers(-1, -2, -3)) # Dovrebbe restituire -6
print(sum_all_numbers(-5, -5)) # Dovrebbe restituire -10
print(sum_all_numbers(-5, 5)) # Dovrebbe restituire 0
elif test_case == "large_values_test":
# Verifica con valori molto grandi
print(sum_all_numbers(1000000000, 1000000000)) # Dovrebbe restituire 2000000000
print(sum_all_numbers(1000000000, 2000000000.5)) # Dovrebbe restituire 3000000000.5
elif test_case == "single_value_test":
# Verifica con un solo valore
print(sum_all_numbers(5)) # Dovrebbe restituire 5
print(sum_all_numbers(-10)) # Dovrebbe restituire -10
print(sum_all_numbers(3.5)) # Dovrebbe restituire 3.5
elif test_case == "error_handling_test":
# Verifica con vari valori non numerici
print(sum_all_numbers("string")) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers([1, 2, 3])) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers({"key": "value"})) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers(True)) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers(None)) # Dovrebbe stampare un errore e restituire None
elif test_case == "mixed_valid_invalid_test":
# Verifica con una combinazione di valori validi e non validi
print(sum_all_numbers(1, 2, "three")) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers(1, [2, 3], 4)) # Dovrebbe stampare un errore e restituire None
print(sum_all_numbers(1.5, "two", 3)) # Dovrebbe stampare un errore e restituire None
elif test_case == "empty_args_test":
# Verifica senza argomenti
print(sum_all_numbers()) # Dovrebbe restituire 0Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti di OOP
File esterniIntroduzione a OOPClassi vs. oggettiIl parametro selfMetodiAttributiMetodo costruttore (__init__)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa funzione super()Sovrascrittura dei metodiEreditarietà multiplaOrdine di risoluzione dei metodiRiepilogo - Gerarchia dei dipendenti7Metodi speciali
Introduzione ai metodi magiciSovraccarico degli operatoriMetodi magici dei contenitoriRiepilogo - Lista personalizzata10Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneModello SingletonModello FactoryModello ObserverModello Strategy2Decoratori
Introduzione ai decoratoriDecoratore di proprietàDecoratore di metodo staticoDecoratore di metodo di classe5Polimorfismo
Ripasso dell'override dei metodiDuck typingClassi e metodi astrattiProgettazione delle interfacceRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàMixinMetodi statici e di classeDecorator di classeContext manager11Pattern di progettazione - Parte 2
Pattern dei comandiPattern adattatorePattern decoratorePattern metodo templatePattern statoPattern composito3Proprietà delle classi
Variabili di istanza e di classeDecorator delle proprietàAttributi privatiRiepilogo - Gestore di conti bancari6Incapsulamento
Membri pubblici, protetti e privatiModificatori di accessoOccultamento delle informazioniDecorator delle proprietà: avanzatiRipasso - Sistema di registri degli studenti12Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreTest e integrazioneEsercitati da solo: Compilatore Python online