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: 20Combinez 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
- DianaVous 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) # 15Point 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.
Défi
FacileDans 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 siboolest une sous-classe deint
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 0Cette 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
1Les fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe paramètre selfMéthodesAttributsMéthode constructeur (__init__)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLa fonction super()Redéfinition de méthodeHéritage multipleOrdre de résolution des méthodesRécapitulatif - Hiérarchie des employés7Méthodes spéciales
Introduction aux méthodes magiquesSurcharge d'opérateursMéthodes magiques de conteneurRécapitulatif - Liste personnalisée10Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron Strategy2Décorateurs
Introduction aux décorateursDécorateur de propriétéDécorateur de méthode statiqueDécorateur de méthode de classe5Polymorphisme
Retour sur la redéfinition de méthodeDuck TypingClasses et méthodes abstraitesConception d'interfacesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageMixinsMéthodes statiques et de classeDécorateurs de classeGestionnaires de contexte11Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode TemplatePatron ÉtatPatron Composite3Propriétés de classe
Variables d'instance vs variables de classeDécorateurs de propriétéAttributs privésRécapitulatif - Gestionnaire de compte bancaireEntraînez-vous par vous-même : Compilateur Python en ligne