Education 1.1 Help

Задачи

Задача 1

Напишите функцию arithmetic_operation(operation), которая принимает символ одной из четырех арифметических операций, а возвращает функцию двух аргументов для соответствующей операции.

Пример

Ввод

operation = arithmetic_operation('+') print(operation(1, 4))

Вывод

5

Задача 2

Напишите свою функцию simple_map(transformation, values), которая из одного списка делает другой. Каждый элемент результирующего списка должен получаться применением функции преобразования transformation к соответствующему элементу списка values.

Пример

Ввод

values = [1, 3, 1, 5, 7] print(*simple_map(lambda x: x + 5, values))

Вывод

6 8 6 10 12

Задача 3

Посчитайте сумму квадратов всех двузначных чисел, делящихся на 9.

При решении задачи используйте комбинацию функций filter, map, sum.

Задача 4

У вас есть код, который вы не можете менять (так часто бывает, когда код в глубине программы используется множество раз и вы не хотите ничего сломать):

transformation = <???> values = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] # или любой другой список transformed_values = list(map(transformation, values))

Единственный способ вашего взаимодействия с этим кодом – посредством задания функции transformation.

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

Напишите такое лямбда-выражение transformation, чтобы transformed_values получился копией values. Переменная transformation должна быть глобальной, чтобы проверяющая система смогла его найти. Кроме transformation вам ничего писать не нужно. Печатать на экран – тоже.

Пример

Ввод

values = [1, 23, 42, "asdfg"] transformed_values = list(map(transformation, values)) if values == transformed_values: print('ok') else: print('fail')

Вывод

ok

Задача 5

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

Во-первых, это упрощает код, который пользуется вашей функцией.

Во-вторых, бывают программы, в которых несколько наборов команд выполняется параллельно и независимо друг от друга. Например, когда ваша программа подключается к интернету, это обычно делается параллельно с работой остальной программы, ведь запрос может занять как долю секунды, так и минуты. Так же обычно поступают, когда вычисление занимает очень много времени. Взаимодействие с пользователем тоже может занимать очень много времени по меркам компьютерной программы - секунды на то, чтобы пользователь ввёл текст. Было бы очень неудобно, если бы, пока выполняется запрос, зависла бы вся программа.

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

Зато сам запрос точно знает, когда он завершился и может что-то сделать по завершении. Например, показать вам загруженную картинку или обновить ленту сообщений. А иногда – сообщить о том, что произошла ошибка.

Но на результат завершения одного и того же запроса можно реагировать по-разному: иногда не нужно делать ничего, в других случаях – показать результат, в третьих – сохранить результат в файл и так далее.

Значит, программе нужно знать, как реагировать на окончание запроса. Это делается при помощи так называемых коллбэков (callback), что переводится как обратный звонок. Коллбэком называется специальная функция, которая вызывается, когда ваше вычисление завершилось. Для программы, запустившей запрос или долгое вычисление, коллбэк – это способ сообщить, что надлежит сделать, когда вычисление завершится. Коллбэк обычно передают как аргумент функции запуска вычисления.

Ваша задача – написать функцию ask_password(login, password, success, failure), которая получает логин и пароль пользователя и проверяет их правильность.

Пароль считается правильным, если в нём содержится ровно три английские гласные буквы (гласными считать буквы a, e, i, o, u, y) и ровно такой же набор согласных (все буквы, кроме перечисленных шести), как в логине. Порядок и количество согласных также должно совпадать.

Логин и пароль могут передаваться в любом регистре, однако символы, написанные в разных регистрах, считаются одинаковыми. Не будет ошибкой, если вы все введённые символы логина и пароля, сразу приведете к нижнему регистру.

Пример: для логина “ login” подойдут пароли “ aaalgn” и “ luagon“.

Если пароль правильный, функция должна вызвать коллбэк success, передав ему в качестве аргумента логин. А если пароль был неверный - failure, передав ему в качестве аргументов логин и сообщение об ошибке (в таком порядке). Сообщение об ошибке должно быть одним из трёх вариантов:

  • “Wrong number of vowels”, если в пароле неверное число гласных;

  • “Wrong consonants”, если в пароле набор согласных отличается от набора согласных логина;

  • “Everything is wrong”, если оба условия нарушены.

Также напишите функцию main(login, password), которая вызывает написанную функцию ask_password так, чтобы в случае успеха она печатала “ Привет, {логин}!”, а в случае ошибки – “ Кто-то пытался притвориться пользователем {логин}, но в пароле допустил ошибку: {текст ошибки, большими буквами}.”.

Пример 1

Ввод

main("anastasia", "nsyatos")

Вывод

Привет, anastasia!

Пример 2

Ввод

main("eugene", "aanig")

Вывод

Кто-то пытался притвориться пользователем eugene, но в пароле допустил ошибку: WRONG CONSONANTS

Пример 3

Ввод

ask_password("anastasia", "nsyatos", lambda login: print('super'), lambda login, err: print('bad'))

Вывод

super

Задача 6

Планеты вращаются вокруг звезд по эллиптическим орбитам. Назовём самой далёкой планетой ту, орбита которой имеет самую большую площадь.

Напишите функцию find_farthest_orbit(list_of_orbits), которая среди списка орбит планет найдет ту, по которой вращается самая далёкая планета. Круговые орбиты не учитывайте: вы знаете, что у вашей звезды таких планет нет, зато искусственные спутники были запущены на круговые орбиты.

Результатом функции должен быть кортеж, содержащий длины полуосей эллипса орбиты самой далёкой планеты.

Каждая орбита представляет из себя кортеж из пары чисел – полуосей её эллипса. Площадь эллипса вычисляется по формуле S = πab, где a и b – длины полуосей эллипса.

При решении задачи используйте списочные выражения.

Гарантируется, что самая далёкая планета ровно одна.

Пример

Ввод

orbits = [(1, 3), (2.5, 10), (7, 2), (6, 6), (4, 3)] print(*find_farthest_orbit(orbits))

Вывод

2.5 10

Задача 7

Напишите функцию same_by(characteristic, objects), которая проверяет, все ли объекты имеют одинаковое значение некоторой характеристики, и возвращает True, если это так. Если значение характеристики для разных объектов отличается – то False. Для пустого набора объектов, функция должна возвращать True. Аргумент characteristic – это функция, которая принимает объект и вычисляет его характеристику.

Пример 1

Ввод

values = [0, 2, 10, 6] if same_by(lambda x: x % 2, values): print('same') else: print('different')

Вывод

same

Пример 2

Ввод

values = [1, 2, 3, 4] if same_by(lambda x: x % 2, values): print('same') else: print('different')

Вывод

different
Last modified: 12 June 2024