**Задание 1. Математический калькулятор**
```python
def calculate(operation, *args):
if operation == "sum":
return sum(args)
elif operation == "product":
result = 1
for num in args:
result *= num
return result
elif operation == "max":
return max(args) if args else None
elif operation == "min":
return min(args) if args else None
elif operation == "avg":
return sum(args) / len(args) if args else None
else:
print("Ошибка: неизвестный режим")
return None
```
**Задание 2. Приветствие группы**
```python
def greet_all(greeting, *names):
if not names:
print("Некого приветствовать")
else:
for name in names:
print(f"{greeting}, {name}!")
```
**Задание 3. Карточка пользователя**
```python
def print_profile(**kwargs):
if not kwargs:
print("Профиль пуст")
else:
for key, value in kwargs.items():
print(f"{key}: {value}")
```
**Задание 4. Чек заказа**
```python
def print_order(customer, **items):
print(f"Заказ для: {customer}")
total_sum = 0
for item, price in items.items():
print(f"{item} — {price} руб.")
total_sum += price
print(f"Итого: {total_sum} руб.")
```
**Задание 5. Фильтр чисел**
```python
def filter_numbers(*args, min=None, max=None):
filtered = []
for num in args:
if (min is None or num >= min) and (max is None or num <= max):
filtered.append(num)
return filtered
```
**Ответы на контрольные вопросы:**
1. **В чём разница между *args и обычным параметром-списком?**
*args автоматически упаковывает переданные через запятую аргументы в кортеж, тогда как параметр-список требует передачи одного готового объекта (списка).
2. **Можно ли передать в *args именованный аргумент?**
Нет. *args предназначен исключительно для позиционных аргументов. Передача именованного аргумента приведет к ошибке TypeError.
3. **Что произойдёт, если написать def f(**kwargs, *args)?**
Возникнет синтаксическая ошибка SyntaxError, так как *args должен всегда стоять перед **kwargs.
4. **Каков порядок следования параметров в сигнатуре функции?**
1. Обычные (позиционные). 2. *args. 3. Именованные (keyword-only). 4. **kwargs.