Menu
Coddy logo textTech

Los *args

Parte de la sección Object Oriented Programming del Journey de Python de Coddy — lección 42 de 64.

El parámetro *args permite que un método acepte cualquier número de argumentos posicionales. El asterisco recopila todos los argumentos posicionales adicionales en una tupla.

Aquí hay un ejemplo de un método que utiliza *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}")

Llama al método con diferentes números de argumentos:

calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1)  # 6
print(result2)  # 150

El *args recoge todos los argumentos en una tupla:

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

Resultado:

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

Combina parámetros regulares con *args:

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

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

Utiliza *args en métodos constructores:

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

Salida:

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

También puedes desempaquetar argumentos al llamar a métodos:

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

Punto clave: *args recopila cualquier número de argumentos posicionales en una tupla. Úselo cuando no sepa cuántos argumentos se pasarán a un método. El nombre args es convencional; podría usar cualquier nombre después del asterisco, pero args es el estándar.

challenge icon

Desafío

Fácil

En este desafío, implementarás una función de utilidad numérica flexible.

Edita el archivo number_utils.py para implementar la función sum_all_numbers que acepte cualquier cantidad de argumentos numéricos y devuelva su suma. La función debe:

  • Devolver 0 si no se proporcionan argumentos
  • Imprimir "Error: All arguments must be numbers" y devolver None si se proporciona cualquier argumento que no sea numérico

El archivo number_utils.py contiene comentarios TODO detallados para guiar tu implementación. Sigue estos comentarios cuidadosamente para asegurar que tu solución cumpla con todos los requisitos.

Hoja de referencia

El parámetro *args permite que un método acepte cualquier número de argumentos posicionales. El asterisco agrupa todos los argumentos posicionales adicionales en una tupla.

Uso básico 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)  # 150

Combinar parámetros regulares con *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")

Usar *args en métodos constructores:

class Team:
    def __init__(self, team_name, *players):
        self.team_name = team_name
        self.players = list(players)

team = Team("Warriors", "Alice", "Bob", "Charlie")

Desempaquetar argumentos al llamar a métodos:

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

Punto clave: *args agrupa cualquier número de argumentos posicionales en una tupla. El nombre args es convencional, pero puedes usar cualquier nombre después del asterisco.

Pruébalo tú mismo

from number_utils import sum_all_numbers

# Manejador de casos de prueba exhaustivo
test_case = input()

if test_case == "basic_test":
    # Probar funcionalidad básica con enteros positivos
    print(sum_all_numbers(1, 2, 3))  # Debería devolver 6
    print(sum_all_numbers())  # Debería devolver 0
    print(sum_all_numbers(10, 20, 30, 40))  # Debería devolver 100
    print(sum_all_numbers(1, 2, "three"))  # Debería imprimir error y devolver None

elif test_case == "float_test":
    # Probar con números de punto flotante
    print(sum_all_numbers(1.1, 2.2, 3.3))  # Debería devolver 6.6
    print(sum_all_numbers(5.5, 5.0))  # Debería devolver 10.5

elif test_case == "mixed_numbers_test":
    # Probar con una mezcla de enteros y flotantes
    print(sum_all_numbers(5, 5.5))  # Debería devolver 10.5
    print(sum_all_numbers(10, 20.5, 30, 40))  # Debería devolver 100.5

elif test_case == "zero_values_test":
    # Probar con valores cero
    print(sum_all_numbers(0, 0, 0))  # Debería devolver 0
    print(sum_all_numbers(0))  # Debería devolver 0
    print(sum_all_numbers())  # Debería devolver 0

elif test_case == "negative_values_test":
    # Probar con valores negativos
    print(sum_all_numbers(-1, -2, -3))  # Debería devolver -6
    print(sum_all_numbers(-5, -5))  # Debería devolver -10
    print(sum_all_numbers(-5, 5))  # Debería devolver 0

elif test_case == "large_values_test":
    # Probar con valores muy grandes
    print(sum_all_numbers(1000000000, 1000000000))  # Debería devolver 2000000000
    print(sum_all_numbers(1000000000, 2000000000.5))  # Debería devolver 3000000000.5

elif test_case == "single_value_test":
    # Probar con un solo valor
    print(sum_all_numbers(5))  # Debería devolver 5
    print(sum_all_numbers(-10))  # Debería devolver -10
    print(sum_all_numbers(3.5))  # Debería devolver 3.5

elif test_case == "error_handling_test":
    # Probar con varios valores no numéricos
    print(sum_all_numbers("string"))  # Debería imprimir error y devolver None
    print(sum_all_numbers([1, 2, 3]))  # Debería imprimir error y devolver None
    print(sum_all_numbers({"key": "value"}))  # Debería imprimir error y devolver None
    print(sum_all_numbers(True))  # Debería imprimir error y devolver None
    print(sum_all_numbers(None))  # Debería imprimir error y devolver None

elif test_case == "mixed_valid_invalid_test":
    # Probar con una mezcla de valores válidos e inválidos
    print(sum_all_numbers(1, 2, "three"))  # Debería imprimir error y devolver None
    print(sum_all_numbers(1, [2, 3], 4))  # Debería imprimir error y devolver None
    print(sum_all_numbers(1.5, "two", 3))  # Debería imprimir error y devolver None

elif test_case == "empty_args_test":
    # Probar sin argumentos
    print(sum_all_numbers())  # Debería devolver 0
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Object Oriented Programming