Les *args
Fait partie de la section Object Oriented Programming du Journey Python de Coddy — leçon 42 sur 64.
Le paramètre *args permet à une méthode d'accepter n'importe quel nombre d'arguments positionnels. L'astérisque collecte tous les arguments positionnels supplémentaires dans un tuple.
Voici un exemple d'une 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) # 150Le *args collecte 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 des paramètres classiques 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 constructeurs :
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éballer des arguments lors de l'appel de méthodes :
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Déballe la liste
print(result) # 15Point clé : *args collecte n'importe quel nombre d'arguments positionnels dans un tuple. Utilisez-le lorsque vous ne savez pas combien d'arguments seront passés à une méthode. Le nom args est conventionnel - vous pourriez utiliser n'importe quel nom après l'astérisque, mais args est la norme.
Défi
FacileDans ce défi, vous allez implémenter une fonction utilitaire numérique flexible.
Modifiez le fichier number_utils.py pour implémenter la fonction sum_all_numbers qui accepte n'importe quel nombre d'arguments numériques et retourne leur somme. La fonction doit :
- Retourner 0 si aucun argument n'est fourni
- Afficher "Error: All arguments must be numbers" et retourner None si des arguments non numériques sont fournis
Le fichier number_utils.py contient des commentaires TODO détaillés pour guider votre implémentation. Suivez attentivement ces commentaires pour vous assurer que votre solution répond à toutes les exigences.
Aide-mémoire
Le paramètre *args permet à une méthode d'accepter n'importe quel nombre d'arguments positionnels. L'astérisque collecte tous les arguments positionnels supplémentaires dans un tuple.
Utilisation basique de *args :
class Calculator:
def add_numbers(self, *args):
return sum(args)
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3) # 6
result2 = calc.add_numbers(10, 20, 30, 40, 50) # 150Combiner des 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()
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")Utiliser *args dans les méthodes constructeurs :
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
team = Team("Warriors", "Alice", "Bob", "Charlie")Déballer (Unpack) des arguments lors de l'appel de méthodes :
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Déballe la listePoint clé : *args collecte n'importe quel nombre d'arguments positionnels dans un tuple. Le nom args est conventionnel, mais vous pouvez utiliser n'importe quel nom après l'astérisque.
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":
# Teste 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":
# Teste 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":
# Teste 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":
# Teste avec des valeurs nulles
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":
# Teste 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":
# Teste 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":
# Teste 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":
# Teste 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":
# Teste 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":
# Teste 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 Object Oriented Programming
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 bancaire