Menu
Coddy logo textTech

Les *args

Fait partie de la section Programmation orientée objet du Journey Python de Coddy. Leçon 42 sur 64.

Le paramètre *args permet à une méthode d’accepter un nombre quelconque d’arguments positionnels. L’astérisque rassemble tous les arguments positionnels supplémentaires dans un tuple.

Voici un exemple de méthode utilisant *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}")

Appelez la méthode avec différents nombres d’arguments :

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 rassemble tous les arguments dans un tuple :

calc.show_numbers(5, 10, 15, 20)

Sortie :

Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20

Combinez les paramètres réguliers avec *args :

class Logger:
    def log_message(self, level, *messages):
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")
        print()  # Nouvelle ligne

logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")

Utilisez *args dans les méthodes de constructeur :

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()

Sortie :

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

Vous pouvez également décompresser des arguments lors de l’appel de méthodes :

numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers)  # Dépaquette la liste
print(result)  # 15

Point clé : *args rassemble un nombre quelconque d’arguments positionnels dans un tuple. Utilisez-le lorsque vous ne savez pas combien d’arguments seront transmis à une méthode. Le nom args est conventionnel : vous pourriez utiliser n’importe quel nom après l’astérisque, mais args est le nom standard.

challenge icon

Défi

Facile

Dans ce défi, vous allez implémenter une fonction utilitaire flexible pour les nombres.

Modifiez le fichier number_utils.py pour implémenter la fonction sum_all_numbers qui accepte un nombre quelconque d’arguments numériques et renvoie leur somme. La fonction doit :

  • Renvoyer 0 si aucun argument n’est fourni
  • Afficher "Error: All arguments must be numbers" et renvoyer None si des arguments non numériques sont fournis
  • Les booléens (True / False) ne sont pas considérés comme des nombres ici et doivent également être rejetés, même si bool est une sous-classe de int

Le fichier number_utils.py contient des commentaires TODO détaillés pour vous guider dans votre implémentation. Suivez attentivement ces commentaires afin de vous assurer que votre solution respecte toutes les exigences.

Essayez vous-même

from number_utils import sum_all_numbers

# Gestionnaire complet de cas de test
test_case = input()

if test_case == "basic_test":
    # Tester la fonctionnalité de base avec des entiers positifs
    print(sum_all_numbers(1, 2, 3))  # Devrait retourner 6
    print(sum_all_numbers())  # Devrait retourner 0
    print(sum_all_numbers(10, 20, 30, 40))  # Devrait retourner 100
    print(sum_all_numbers(1, 2, "three"))  # Devrait afficher une erreur et retourner None

elif test_case == "float_test":
    # Tester avec des nombres à virgule flottante
    print(sum_all_numbers(1.1, 2.2, 3.3))  # Devrait retourner 6.6
    print(sum_all_numbers(5.5, 5.0))  # Devrait retourner 10.5

elif test_case == "mixed_numbers_test":
    # Tester avec un mélange d'entiers et de flottants
    print(sum_all_numbers(5, 5.5))  # Devrait retourner 10.5
    print(sum_all_numbers(10, 20.5, 30, 40))  # Devrait retourner 100.5

elif test_case == "zero_values_test":
    # Tester avec des valeurs zéro
    print(sum_all_numbers(0, 0, 0))  # Devrait retourner 0
    print(sum_all_numbers(0))  # Devrait retourner 0
    print(sum_all_numbers())  # Devrait retourner 0

elif test_case == "negative_values_test":
    # Test avec des valeurs négatives
    print(sum_all_numbers(-1, -2, -3))  # Devrait retourner -6
    print(sum_all_numbers(-5, -5))  # Devrait retourner -10
    print(sum_all_numbers(-5, 5))  # Devrait retourner 0

elif test_case == "large_values_test":
    # Test avec de très grandes valeurs
    print(sum_all_numbers(1000000000, 1000000000))  # Devrait retourner 2000000000
    print(sum_all_numbers(1000000000, 2000000000.5))  # Devrait retourner 3000000000.5

elif test_case == "single_value_test":
    # Test avec une seule valeur
    print(sum_all_numbers(5))  # Devrait retourner 5
    print(sum_all_numbers(-10))  # Devrait retourner -10
    print(sum_all_numbers(3.5))  # Devrait retourner 3.5

elif test_case == "error_handling_test":
    # Test avec diverses valeurs non numériques
    print(sum_all_numbers("string"))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers([1, 2, 3]))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers({"key": "value"}))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers(True))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers(None))  # Devrait afficher une erreur et retourner None

elif test_case == "mixed_valid_invalid_test":
    # Test avec un mélange de valeurs valides et invalides
    print(sum_all_numbers(1, 2, "three"))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers(1, [2, 3], 4))  # Devrait afficher une erreur et retourner None
    print(sum_all_numbers(1.5, "two", 3))  # Devrait afficher une erreur et retourner None

elif test_case == "empty_args_test":
    # Test sans arguments
    print(sum_all_numbers())  # Devrait retourner 0
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Python en ligne