5.2. Практикум

Примечание

При выполнении заданий используйте заготовки решений: -> Репозиторий.

Подробнее: см. Цикл выполнения и защиты заданий.

Примечание

При решении задач данного раздела обратите внимание:

  • для каждой задачи данного раздела сначала создаются функции, а затем, используя их, выполняется решение задачи;

  • ввод и вывод данных для функции необходимо обеспечить самостоятельно;

  • для каждой написанной функции нужно:

    • избегать побочного эффекта;

    • использовать строки документации;

  • при выводе вещественных результатов оставьте два знака после запятой.

В заданиях, где функции используются несколько раз, подумайте, насколько бы увеличился объем кода без их использования.

5.2.1. Глобальные и локальные функции

№ 5.2.1

Определите значение \(z = \cfrac{sgn(x) + y^2}{sgn(y) - \sqrt{|x|}}\), где sgn - сигнум-функция, а \(x\) и \(y\) - вещественные числа:

\[\begin{split}sgn(a) = \begin{cases} 1, & \mbox a > 0 \mbox{,} \\ 0, & \mbox a = 0 \mbox{,} \\ -1, & \mbox a < 0 \end{cases}\end{split}\]

№ 5.2.2

Дан список температурных изменений в течение дня (целые числа). Известно, что измеряющее устройство иногда сбоит и записывает отсутствие температуры (значение None).

Выведите среднюю температуру за наблюдаемый промежуток времени, предварительно очистив список от неопределенных значений. Гарантируется, что хотя бы одно определенное значение в списке есть.

№ 5.2.3

Выведите все счастливые номера билетов в диапазоне от \(a\) до \(b\) (положительные целые числа, \(a < b\)), если известно, что счастливым считается номер, у которого количество четных цифр равно количеству нечетных.

№ 5.2.4

Дата характеризуется тремя натуральными числами: день, месяц и год. Учитывая, что год может быть високосным, реализуйте две функции, которые определяют вчерашнюю и завтрашнюю дату.

№ 5.2.5

В задаче № 5.2.4 замените функции получения вчерашней и завтрашней даты на одну:

def another_date(day, month, year, delta=1):
    pass

где delta - ключевой параметр, определяющий сколько дней необходимо добавить или вычесть (если аргумент отрицательный) из переданной даты. Функции, реализованные в задаче № 5.2.4 сделайте локальными для another_date(), вызывая их внутри необходимое количество раз.

№ 5.2.6

Дан список из чисел.

Определите их НОК (наименьшее общее кратное) и НОД (наибольший общий делитель).

№ 5.2.7

Даны \(n\) предложений. Определите, сколько из них содержат хотя бы одну цифру.

№ 5.2.8

Дана строка \(s\) и символ \(k\). Реализуйте функцию, рисующую рамку из символа \(k\) вокруг данной строки, например:

***************
*Текст в рамке*
***************

№ 5.2.9

Напишите функции для перевода числа (\(N \in \left [ 2; 16 \right ]\)):

  • из 10-й системы счисления в N-ю;

  • из N-й системы счисления в 10-ю.

№ 5.2.10

Для введенного предложения выведите статистику символ=количество. Регистр букв не учитывается.

№ 5.2.11

Используя шифр Цезаря (достаточно только букв русского алфавита, знаки препинания не изменяются), зашифруйте, а затем расшифруйте введенную строку.

№ 5.2.12

В вагоне-купе имеется некоторое количество купе, в каждом из которых по 4 места. Разработчик хранит информацию о занятости одного купе в виде словаря:

{1: 'м', 2: None, 3: None, 4: 'ж'}

где:

  • ключ определяет номер места (нечетные номера - нижние места, четные - верхние);

  • значение может быть одно из трех: None, "м" и "ж", если место не занято, занято мужчиной или женщиной соответственно.

Информация о занятости всего вагона хранится как список указанных словарей.

Определите:

  • список полностью свободных купе;

  • список свободных мест в вагоне;

  • список свободных нижних или верхних мест;

  • список свободных мест в купе с исключительно мужской компанией;

  • список свободных мест в купе с исключительно женской компанией.

Совет

Купе считается с исключительно мужской компанией, если:

  • занято хотя бы одно место;

  • все несвободные места заняты мужчинами.

№ 5.2.13

Дан список с результатами голосования на выборах в виде:

[1, 3, 2, 2, 2, 5, -1, ...]

где номер определяет голос за партию из списка:

1. Партия №1.
2. Партия №2.
3. Партия №3.
4. Партия №4.
5. Партия №5.
-1. Испорченный бланк.

Подведите итоги выборов, выведя на экран список партий в соответствии с убыванием количества полученных голосов и их процентным соотношением:

1. Партия №2 | 1111 | 58.21%
2. Партия №4 |  999 | 38.14%
...

5.2.2. Упаковка и распаковка аргументов

№ 5.2.14

Напишите функцию, которая принимает неограниченное количество числовых аргументов и возвращает кортеж из двух списков:

  • отрицательных значений (отсортирован по убыванию);

  • неотрицательных значений (отсортирован по возрастанию).

№ 5.2.15

Валовой внутренний продукт может определяться по расходам:

\[Y = C + I + G + E{x} - I{m},\]

где:

  • \(C\) - конечное потребление;

  • \(I\) - валовое накопление капитала (инвестиции в фирму, то есть покупка станков, оборудования, запасов, места производства);

  • \(G\) - государственные расходы;

  • \(E{x}\) - экспорт;

  • \(I{m}\) - импорт.

Все величины - целые числа.

Выполните:

  • введите с клавиатуры все 5 значений формулы и сохраните их в список и словарь вида

    {'c': 3, 'i': 1, ..., 'im': 2}
    
  • напишите функцию для вычисления ВВП, которая содержит 5 параметров, соответствующих формуле;

  • используя распаковку аргументов, вызовите функцию с данными введенных списка и словаря и выведите их на экран.

5.2.3. Рекурсия

№ 5.2.16

Составьте две функции для возведения числа в степень: один из вариантов реализуйте в рекурсивном стиле.

№ 5.2.17

Дано натуральное число. Напишите рекурсивные функции для определения:

  • суммы цифр числа;

  • количества цифр в числе.