Menu
Coddy logo textTech

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: 20

Combina 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
- Diana

Puoi anche decomporre gli argomenti quando chiami i metodi:

numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers)  # Decomprime la lista
print(result)  # 15

Punto 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.

challenge icon

Sfida

Facile

In 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 se bool è una sottoclasse di int

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 0
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Python online