Упражнения

A: Среднее значение

Напишите функцию average(a), которая получает на вход список чисел и возвращает среднее значение элементов данного списка. Список содержит только числа и не пуст.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
average([1, 7, 9])
5.666666666666667

B: Медиана трех чисел

Напишите функцию median(a, b, c), которая получает на вход три числа и возвращает их медиану. В решении нельзя использовать циклы.

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
median(1, 9, 7)
7

C: Принадлежит ли точка квадрату - 1

Даны два действительных числа \(x\) и \(y\). Проверьте, принадлежит ли точка с координатами \((x,y)\) заштрихованному квадрату (включая его границу). На рисунке сетка проведена с шагом 1.

Решение оформите в виде функции is_point_in_square(x, y), возвращающую True, если точка принадлежит квадрату и False, если не принадлежит.

Функция is_point_in_square не должна содержать инструкцию if и должна иметь такой вид:

def is_point_in_square(x, y):
    return ...

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_point_in_square(0, 0)
True
is_point_in_square(3, -7)
False

D: Принадлежит ли точка квадрату - 2

Решите аналогичную задачу для такого квадрата:

Решение должно соответствовать требованиям для решения задачи C.

Функция должна называться is_point_in_rhombus.

Вызов функции Возвращаемое значение
is_point_in_rhombus(0, 0)
True
is_point_in_rhombus(1, 1)
False

E: Принадлежит ли точка кругу

Даны пять действительных чисел: \(x\), \(y\), \(x_c\), \(y_c\), \(r\). Проверьте, принадлежит ли точка \((x,y)\) кругу с центром \((x_c,y_c)\) и радиусом \(r\).

Решение оформите в виде функции is_point_in_circle(x, y, xc, yc, r).

Решение должно соответствовать требованиям для решения задачи C.

Вызов функции Возвращаемое значение
is_point_in_circle(0.5, 0.5, 0, 0, 1)
True
is_point_in_circle(0.5, 0.5, 1, 1, 0.1)
False

F: Принадлежит ли точка области

Проверьте, принадлежит ли точка данной закрашенной области. Область неограничена снизу.

Решение оформите в виде функции is_point_in_area(x, y).

Инструкцию if использовать по-прежнему нельзя.

Вызов функции Возвращаемое значение
is_point_in_area(-1, 2)
True
is_point_in_area(0, 0)
False

G: Разверните число

Дано число, получите число, составленное из тех же цифр, записанных в обратном порядке.

Решение оформите в виде функции reverse(n), которая получает на вход значение типа int и возвращает значение типа int.

Вызов функции Возвращаемое значение
reverse(179)
971

H: Следующий палиндром

Для данного числа \(n\) определите следующее за ним число, запись которого является палиндромом.

Решение оформите в виде функции next_palindrome(n), которая получает на вход значение типа int и возвращает значение типа int.

В решении используйте функцию из предыдущей задачи. Сдайте на проверку две функции: reverse и next_palindrome.

Вызов функции Возвращаемое значение
next_palindrome(179)
181

I: Минимальный делитель числа

Дано натуральное число \(n>1\). Найдите его наименьший делитель, отличный от 1.

Решение оформите в виде функции min_divisor(n). Алгоритм должен иметь сложность \(O(\sqrt{n})\).

Указание. Если у числа \(n\) нет делителя не превосходящего \(\sqrt{n}\), то число \(n\) — простое и ответом будет само число \(n\).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
min_divisor(4)
2
min_divisor(5)
5

J: Проверка числа на простоту

Дано натуральное число \(n>1\). Проверьте, является ли оно простым.

Решение оформите в виде функции is_prime(n), которая возвращает True для простых чисел и False для составных чисел. Решение должно иметь сложность \(O(\sqrt{n})\).

Сдайте на проверку только тело функции.

Вызов функции Возвращаемое значение
is_prime(2)
True
is_prime(4)
False

K: Разложение на множители

Дано натуральное число \(n>1\). Постройте его разложение на простые множители. Решение должно быть оформлено в виде функции factor(n), возвращающей список делителей числа в порядке неубывания. Каждый делитель должен быть включен в список с учетом его кратности.

Функция должна перебирать делители до \(\sqrt{n}\), при уменьшении числа \(n\) граница перебора также должна уменьшатся.

Использование функций sqrt, pow, операции ** для извлечения квадратного корня может быть причиной долгого работы программы. Используйте вместо них возведение в квадрат при помощи операции умножения.

Вызов функции Возвращаемое значение
factor(132)
[2, 2, 3, 11]
factor(2)
[2]

L: Произведение цифр

Дано натуральное число \(n\). Посчитайте произведение его цифр, не используя строковые операции (напишите цикл, перебирающий цифры числа). Решение оформите в виде функции product_of_digits.

Вызов функции Возвращаемое значение
product_of_digits(179)
63

Упражнения на реализацию логических функций

В этих упражнениях необходимо реализовать функции, которые принимают в качестве параметров два или три значения типа bool и возвращают значение типа bool. Сама функция должна содержать только одну инструкцию return и какие-то логические операции с параметрами.

M: Исключающее ИЛИ (XOR)

Реализуйте функцию xor(x, y), реализующую логическую операцию XOR (исключающее или, обозначается \(x \oplus y\)). Функция возвращает True, если одно (но не оба одновременно!) из значений параметров функции есть True. То есть функция задаётся следующей таблицей истинности (для удобства в ней использованы числа 0 и 1 для обозначения логических величин):

\(\ x\ \)\(\ y\ \)\(x\oplus y\)
000
011
101
110

Вызов функции Возвращаемое значение
xor(False, True)
True

N: Импликация (следование)

Реализуйте функцию imp(x, y), реализующую логическую операцию “импликация” (следование, обозначается \(x\Rightarrow y\)). Функция возвращает True, если из утверждения \(x\) следует утверждение \(y\), а именно, из ложного утверждения следует как ложное, так и истинное утверждение, а из истинного утверждения следует только истинное утверждение. То есть функция задаётся следующей таблицей истинности.

\(\ x\ \)\(\ y\ \)\(x\Rightarrow y\)
001
011
100
111

Вызов функции Возвращаемое значение
imp(False, True)
True

O: Функция голосования

Реализуйте функцию голосования (или большинства) major(x, y, z) (обозначается\(\langle x, y, z\rangle\)). Функция возвращает то значение, которое встречается чаще среди её аргументов. Функцию можно задать следующей таблицей:

\(\ x\ \)\(\ y\ \)\(\ z\ \)\(\langle x, y, z\rangle\)
0000
0010
0100
0111
1000
1011
1101
1111

Вызов функции Возвращаемое значение
major(False, True, False)
False

Упражнения на вывод текста из функции

В данных упражнениях функция выводит что-то на экран, при помощи функции print, но не возвращает значения.

P: Гистограмма

Напишите функцию histogram(a), принимающей в качестве параметра список целых неотрицательных чисел. Функция должна напечатать на экран столько строчек, сколько элементов в списке. \(i\)-я строка должна содержать \(a[i]\) символов “#” (в нумерации с нуля). Функция не возвращает значения.

Вызов функции Вывод на экран
histogram([1, 7, 9])
#
#######
#########

Q: Напечатать треугольник

Напишите функцию triangle(n), получающую в качестве параметра целое положительное число \(n\) и выводящую на экран треугольник из \(n\) строк, составленный из символов “*”. Первая строка содержит одну звёздочку, каждая следующая строка содержит на 2 звёздочки больше, чем предыдущая. При этом все строки, кроме последней, должны содержать в начале один или несколько пробелов так, чтобы строки были выровнены по центру последней строки.

Вызов функции Вывод на экран
triangle(4)
   *
***
*****
*******

R: Напечатать ёлочку

Напишите функцию fir(a, b), получающую на вход два целых числа \(1\le a\le b\), и выводящую ёлочку из \(b - a + 1\) треугольников высоты \(a\), \(a + 1\), ..., \(b\). Используйте функцию triangle из предыдущей задачи, модифицировав её так, чтобы она получала второй параметр: дополнительное число пробелов, которое нужно добавить в начало каждой строки выводимого треугольника. Самая нижняя строка ёлочки не должна содержать пробелов в начале строки. Сдайте на проверку две функции.

По правилам оформления программ функции должны отделяться друг от друга двумя пустыми строками.

Вызов функции Вывод на экран
fir(2, 4)
   *
***
*
***
*****
*
***
*****
*******

Упражнения на считывание данных

В следующих задачах функция должна считать данные с клавиатуры при помощи функции input и вернуть что-то при помощи инструкции return.

S: Вернуть только чётные числа

Напишите функцию read_even(), которая

  1. считывает при помощи функции input список чисел, записанных в одной строке через пробел,
  2. составляет новый список, содержащий только чётные из считанных чисел,
  3. возвращает полученный список.

Вызов функции Входные данные Возвращаемое значение
read_even()
1 2 3 4 5 6
[2, 4, 6]

T: Вернуть числа, больше данного

Напишите функцию read_greater(x), которая

  1. считывает при помощи функции input список чисел, записанных в одной строке через пробел,
  2. составляет новый список, содержащий те числа, которые больше x
  3. возвращает полученный список.

Вызов функции Входные данные Возвращаемое значение
read_greater(2)
1 2 3 4 5 6
[3, 4, 5, 6]
read_greater(3)
6 5 4 3 2 1
[6, 5, 4]

U: Считать последовательность до нуля

Напишите функцию read, которая будет считывать последовательность чисел, записанных по одному в строке, пока не встретит строку, содержащую число 0. Числа, следующие за числом 0, считывать не нужно. Функция должна создать и вернуть список из считанных чисел (не включая 0).

Вызов функции Входные данные Возвращаемое значение
read()
1
2
3
0
[1, 2, 3]

V: Считать последовательность до двух равных чисел

Напишите функцию read, которая будет считывать последовательность чисел, записанных по одному в строке, пока не встретит два подряд идущих равных числа. Функция должна вернуть это число. Последующие числа считывать не нужно.

Вызов функции Входные данные Возвращаемое значение
read()
1
2
3
3
4
3

W: Читайте условия внимательно

Напишите функцию read(k), которая будет считывать список чисел, записанных в одной строке через пробел. После этого функция должна вывести список тех же чисел, увеличенных на \(k\), через пробел, и вернуть список тех же чисел, уменьшенных на \(k\).

Вызов функции Входные данные Вывод на экран Возвращаемое значение
read(7)
1 2 3
8 9 10
[-6, -5, -4]

Упражнения на глобальные переменные

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

X: Сумма элементов списка

Напишите функцию sum_list(a), которая получает в качестве параметра список целых чисел, суммирует его элементы и добавляет их к глобальной переменной total_sum. Сама функция не возвращает значения.

Пример программы Вывод на экран
total_sum = 0
sum_list([1, 2, 3])
print(total_sum)
sum_list([1, 7, 9])
print(total_sum)
6
23

Y: Наибольшая цифра числа

Напишите функцию max_digit(n), которая получает в качестве параметра целое положительное число n, определяет его наибольшую цифру и сравнивает полученное значение с глобальной переменной max_digit_value. Если значение наибольшей цифры числа больше, чем max_digit_value, то необходимо обновить значение max_digit_value. Сама функция не возвращает значения.

Опять не используем работу со строками, а используем целочисленную арифметику.

Пример программы Вывод на экран
max_digit_value = 0
max_digit(321)
print(max_digit_value)
max_digit(179)
print(max_digit_value)
3
9

Z: Последняя бессмысленная задача

Напишите функцию read(), которая считывает с клавиатуры целое число и сравнивает его с предыдущим считанным этой функцией числом. Значение предыдущего считанного числа сохраняется в глобальной переменной prev. Если новое значение совпадает с предыдущим считанным значением, то функция должна вернуть True, а если не совпадает (или если это первый вызов функции), то функция должна вернуть False. В любом случае, функция должна обновить значение переменной prev.

В этой задаче глобальная переменная prev не обязана существовать. Для того, чтобы проверить, существует ли глобальная переменная с именем prev можно использовать такой код:

if 'prev' in globals():

Если нужно проверить наличие переменной среди локальных переменных, то используется словарь locals().

Пример программы Ввод Вывод
print(read())
print(prev)
print(read())
print(prev)
print(read())
print(prev)
print(read())
print(prev)
8
8
7
8
False
8
True
8
False
7
False
8