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) # 150O *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: 20Combine 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
- DianaVocê 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) # 15Ponto 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.
Desafio
FácilNeste 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) # 150Combine 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 listaPonto 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 0Esta 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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosO Parâmetro selfMétodosAtributosMétodo Construtor (__init__)Recapitulação - Calculadora Simples4Herança
Herança BásicaA Função super()Sobrescrita de MétodoHerança MúltiplaOrdem de Resolução de MétodosRecapitulação - Hierarquia de Funcionários7Métodos Especiais
Introdução aos Métodos MágicosSobrecarga de OperadoresMétodos Mágicos de ContêinerRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução a Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy2Decoradores
Introdução aos DecoradoresDecorador de PropriedadeDecorador de Método EstáticoDecorador de Método de Classe5Polimorfismo
Sobrescrita de Método RevisitadaDuck TypingClasses e Métodos AbstratosDesign de InterfacesRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição vs HerançaMixinsMétodos Estáticos e de ClasseDecoradores de ClasseGerenciadores de Contexto11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Propriedades de Classe
Variáveis de Instância vs de ClasseDecoradores de PropriedadeAtributos PrivadosRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Membros Públicos, Protegidos e PrivadosModificadores de AcessoOcultação de InformaçãoProperty Decorators AvançadosRecapitulação - Sistema de Registro de Alunos12Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário