Аргументы *args
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 42 из 64.
Параметр *args позволяет методу принимать любое количество позиционных аргументов. Звездочка собирает все дополнительные позиционные аргументы в кортеж.
Вот пример метода, использующего *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}")Вызовите метод с разным количеством аргументов:
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 собирает все аргументы в кортеж:
calc.show_numbers(5, 10, 15, 20)Вывод:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Сочетайте обычные параметры с *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")
logger.log_message("ERROR", "Connection", "failed")Используйте *args в методах конструктора:
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()Вывод:
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Вы также можете распаковывать аргументы при вызове методов:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Распаковывает список
print(result) # 15Ключевой момент: *args собирает любое количество позиционных аргументов в кортеж. Используйте его, когда вы не знаете, сколько аргументов будет передано методу. Имя args является общепринятым — вы можете использовать любое имя после звездочки, но args является стандартом.
Задание
ЛегкоВ этом испытании вы реализуете гибкую вспомогательную функцию для работы с числами.
Отредактируйте файл number_utils.py, чтобы реализовать функцию sum_all_numbers, которая принимает любое количество числовых аргументов и возвращает их сумму. Функция должна:
- Возвращать 0, если аргументы не предоставлены
- Выводить "Error: All arguments must be numbers" и возвращать None, если предоставлены любые нечисловые аргументы
Файл number_utils.py содержит подробные комментарии TODO, которые помогут вам в реализации. Внимательно следуйте этим комментариям, чтобы ваше решение соответствовало всем требованиям.
Шпаргалка
Параметр *args позволяет методу принимать любое количество позиционных аргументов. Звездочка собирает все дополнительные позиционные аргументы в кортеж.
Базовое использование *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Сочетание обычных параметров с *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")Использование *args в методах конструктора:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
team = Team("Warriors", "Alice", "Bob", "Charlie")Распаковка аргументов при вызове методов:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Распаковывает списокКлючевой момент: *args собирает любое количество позиционных аргументов в кортеж. Имя args является общепринятым, но вы можете использовать любое имя после звездочки.
Попробуйте сами
from number_utils import sum_all_numbers
# Комплексный обработчик тестовых случаев
test_case = input()
if test_case == "basic_test":
# Тестирование базовой функциональности с положительными целыми числами
print(sum_all_numbers(1, 2, 3)) # Должно вернуть 6
print(sum_all_numbers()) # Должно вернуть 0
print(sum_all_numbers(10, 20, 30, 40)) # Должно вернуть 100
print(sum_all_numbers(1, 2, "three")) # Должно вывести ошибку и вернуть None
elif test_case == "float_test":
# Тестирование с числами с плавающей запятой
print(sum_all_numbers(1.1, 2.2, 3.3)) # Должно вернуть 6.6
print(sum_all_numbers(5.5, 5.0)) # Должно вернуть 10.5
elif test_case == "mixed_numbers_test":
# Тестирование со смесью целых и вещественных чисел
print(sum_all_numbers(5, 5.5)) # Должно вернуть 10.5
print(sum_all_numbers(10, 20.5, 30, 40)) # Должно вернуть 100.5
elif test_case == "zero_values_test":
# Тестирование с нулевыми значениями
print(sum_all_numbers(0, 0, 0)) # Должно вернуть 0
print(sum_all_numbers(0)) # Должно вернуть 0
print(sum_all_numbers()) # Должно вернуть 0
elif test_case == "negative_values_test":
# Тестирование с отрицательными значениями
print(sum_all_numbers(-1, -2, -3)) # Должно вернуть -6
print(sum_all_numbers(-5, -5)) # Должно вернуть -10
print(sum_all_numbers(-5, 5)) # Должно вернуть 0
elif test_case == "large_values_test":
# Тестирование с очень большими значениями
print(sum_all_numbers(1000000000, 1000000000)) # Должно вернуть 2000000000
print(sum_all_numbers(1000000000, 2000000000.5)) # Должно вернуть 3000000000.5
elif test_case == "single_value_test":
# Тестирование с одним значением
print(sum_all_numbers(5)) # Должно вернуть 5
print(sum_all_numbers(-10)) # Должно вернуть -10
print(sum_all_numbers(3.5)) # Должно вернуть 3.5
elif test_case == "error_handling_test":
# Тестирование с различными нечисловыми значениями
print(sum_all_numbers("string")) # Должно вывести ошибку и вернуть None
print(sum_all_numbers([1, 2, 3])) # Должно вывести ошибку и вернуть None
print(sum_all_numbers({"key": "value"})) # Должно вывести ошибку и вернуть None
print(sum_all_numbers(True)) # Должно вывести ошибку и вернуть None
print(sum_all_numbers(None)) # Должно вывести ошибку и вернуть None
elif test_case == "mixed_valid_invalid_test":
# Тестирование со смесью валидных и невалидных значений
print(sum_all_numbers(1, 2, "three")) # Должно вывести ошибку и вернуть None
print(sum_all_numbers(1, [2, 3], 4)) # Должно вывести ошибку и вернуть None
print(sum_all_numbers(1.5, "two", 3)) # Должно вывести ошибку и вернуть None
elif test_case == "empty_args_test":
# Тестирование без аргументов
print(sum_all_numbers()) # Должно вернуть 0В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User