Menu
Coddy logo textTech

O *args

Parte da seção Object Oriented Programming do Journey de Python da Coddy — lição 42 de 64.

O parâmetro *args permite que um método aceite qualquer número de argumentos posicionais. O asterisco coleta todos os argumentos posicionais extras em uma tupla.

Aqui está um exemplo de um método usando *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}")

Chame o método com 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

O *args coleta todos os argumentos em uma tupla:

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

Saída:

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

Combine parâmetros regulares com *args:

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

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

Use *args em métodos construtores:

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

Saída:

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

Você também pode desempacotar argumentos ao chamar métodos:

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

Ponto Chave: *args coleta qualquer número de argumentos posicionais em uma tupla. Use-o quando você não souber quantos argumentos serão passados para um método. O nome args é convencional - você poderia usar qualquer nome após o asterisco, mas args é o padrão.

challenge icon

Desafio

Fácil

Neste desafio, você implementará uma função utilitária de números flexível.

Edite o arquivo number_utils.py para implementar a função sum_all_numbers que aceita qualquer quantidade de argumentos numéricos e retorna a soma deles. A função deve:

  • Retornar 0 se nenhum argumento for fornecido
  • Exibir "Error: All arguments must be numbers" e retornar None se quaisquer argumentos não numéricos forem fornecidos

O arquivo number_utils.py contém comentários TODO detalhados para guiar sua implementação. Siga estes comentários cuidadosamente para garantir que sua solução atenda a todos os requisitos.

Folha de consulta

O parâmetro *args permite que um método aceite qualquer número de argumentos posicionais. O asterisco coleta todos os argumentos posicionais extras em uma 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

Combine parâmetros regulares com *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")

Use *args em métodos construtores:

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

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

Desempacote argumentos ao chamar métodos:

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

Ponto Chave: *args coleta qualquer número de argumentos posicionais em uma tupla. O nome args é convencional, mas você pode usar qualquer nome após o asterisco.

Experimente você mesmo

from number_utils import sum_all_numbers

# Manipulador abrangente de casos de teste
test_case = input()

if test_case == "basic_test":
    # Testa a funcionalidade básica com inteiros positivos
    print(sum_all_numbers(1, 2, 3))  # Deve retornar 6
    print(sum_all_numbers())  # Deve retornar 0
    print(sum_all_numbers(10, 20, 30, 40))  # Deve retornar 100
    print(sum_all_numbers(1, 2, "three"))  # Deve imprimir erro e retornar None

elif test_case == "float_test":
    # Testa com números de ponto flutuante
    print(sum_all_numbers(1.1, 2.2, 3.3))  # Deve retornar 6.6
    print(sum_all_numbers(5.5, 5.0))  # Deve retornar 10.5

elif test_case == "mixed_numbers_test":
    # Testa com uma mistura de inteiros e floats
    print(sum_all_numbers(5, 5.5))  # Deve retornar 10.5
    print(sum_all_numbers(10, 20.5, 30, 40))  # Deve retornar 100.5

elif test_case == "zero_values_test":
    # Testa com valores zero
    print(sum_all_numbers(0, 0, 0))  # Deve retornar 0
    print(sum_all_numbers(0))  # Deve retornar 0
    print(sum_all_numbers())  # Deve retornar 0

elif test_case == "negative_values_test":
    # Testa com valores negativos
    print(sum_all_numbers(-1, -2, -3))  # Deve retornar -6
    print(sum_all_numbers(-5, -5))  # Deve retornar -10
    print(sum_all_numbers(-5, 5))  # Deve retornar 0

elif test_case == "large_values_test":
    # Testa com valores muito grandes
    print(sum_all_numbers(1000000000, 1000000000))  # Deve retornar 2000000000
    print(sum_all_numbers(1000000000, 2000000000.5))  # Deve retornar 3000000000.5

elif test_case == "single_value_test":
    # Testa com um único valor
    print(sum_all_numbers(5))  # Deve retornar 5
    print(sum_all_numbers(-10))  # Deve retornar -10
    print(sum_all_numbers(3.5))  # Deve retornar 3.5

elif test_case == "error_handling_test":
    # Testa com vários valores não numéricos
    print(sum_all_numbers("string"))  # Deve imprimir erro e retornar None
    print(sum_all_numbers([1, 2, 3]))  # Deve imprimir erro e retornar None
    print(sum_all_numbers({"key": "value"}))  # Deve imprimir erro e retornar None
    print(sum_all_numbers(True))  # Deve imprimir erro e retornar None
    print(sum_all_numbers(None))  # Deve imprimir erro e retornar None

elif test_case == "mixed_valid_invalid_test":
    # Testa com uma mistura de valores válidos e inválidos
    print(sum_all_numbers(1, 2, "three"))  # Deve imprimir erro e retornar None
    print(sum_all_numbers(1, [2, 3], 4))  # Deve imprimir erro e retornar None
    print(sum_all_numbers(1.5, "two", 3))  # Deve imprimir erro e retornar None

elif test_case == "empty_args_test":
    # Testa sem argumentos
    print(sum_all_numbers())  # Deve retornar 0
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Object Oriented Programming