## Цели домашнего задания Уметь: - описывать list comprehensions и преимущества его использования; - использовать list comprehensions (с условной логикой и без неё) для генерации списков; - использовать срезы списков для создания копии, получения части списка и изменения объектов внутри списка; - работать с индексами и срезами строк для решения задач. ## Что входит в задание - Задача 1. Гласные буквы. - Задача 2. Генерация. - Задача 3. Случайные соревнования. - Задача 4. Тренируемся со срезами. - Задача 5. Разворот. - Задача 6. Двумерный список. - Задача 7. Список списков. - Задача 8. Шифр Цезаря. Во всех задачах для генерации списков используйте list comprehensions. ## Задача 1. Гласные буквы ### Что нужно сделать Команде лингвистов понравилось качество ваших программ, и они решили заказать у вас функцию для анализатора текста, которая создавала бы список гласных букв текста, а заодно считала бы их количество. Напишите программу, которая запрашивает у пользователя текст и генерирует список из гласных букв этого текста (сама строка вводится на русском языке). Выведите в консоль сам список и его длину. Пример: ``` Введите текст: Нужно отнести кольцо в Мордор! Список гласных букв: ['у', 'о', 'о', 'е', 'и', 'о', 'о', 'о', 'о'] Длина списка: 9 ``` ### Что оценивается - Результат вычислений корректен. - Input содержит корректные приглашения для ввода. - Формат вывода соответствует примеру. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 2. Генерация ### Что нужно сделать Пользователь вводит целое число N. Напишите программу, которая генерирует список из N чисел, на чётных местах в нём стоят единицы, а на нечётных — числа, равные остатку от деления своего номера на 5. Пример: ``` Введите длину списка: 10 Результат: [1, 1, 1, 3, 1, 0, 1, 2, 1, 4] ``` ### Что оценивается - Результат вычислений корректен. - Input содержит корректные приглашения для ввода. - Формат вывода соответствует указанному в задаче. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 3. Случайные соревнования ### Что нужно сделать Мы хотим протестировать работу электронной таблицы для участников некоторых соревнований. Есть два списка (то есть две команды) по 20 участников в каждом. В этих списках хранятся очки каждого участника (это вещественные числа с двумя знаками после точки, например 4.03). Участник одной команды соревнуется с участником другой команды под таким же номером. То есть первый соревнуется с первым, второй — со вторым и так далее. Напишите программу, которая генерирует два списка участников (по 20 элементов) из случайных вещественных чисел (от 5 до 10). Для этого найдите подходящую функцию из модуля random. Затем сгенерируйте третий список, в котором окажутся только победители из каждой пары. Пример: ``` Первая команда: [7.86, 6.76, 9.97, 9.08, 5.45, 6.9, 8.65, 5.17, 8.17, 5.06, 7.56, 7.1, 7.18, 8.25, 5.53, 7.95, 8.91, 7.11, 8.29, 9.52] Вторая команда: [7.13, 5.7, 8.89, 5.36, 5.62, 9.46, 5.82, 8.67, 8.41, 7.0, 5.31, 7.8, 9.93, 7.76, 7.4, 8.26, 7.94, 5.71, 7.89, 7.77] Победители тура: [7.86, 6.76, 9.97, 9.08, 5.62, 9.46, 8.65, 8.67, 8.41, 7.0, 7.56, 7.8, 9.93, 8.25, 7.4, 8.26, 8.91, 7.11, 8.29, 9.52] ``` ### Что оценивается - Результат вычислений корректен. - Формат вывода соответствует примеру. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 4. Тренируемся со срезами ### Что нужно сделать Дана строка, в которой хранятся первые семь букв английского алфавита. `alphabet = 'abcdefg'` Напишите программу, которая выводит на экран десять вот таких результатов: 1. Копию строки. 1. Элементы строки в обратном порядке. 1. Каждый второй элемент строки (включая самый первый). 1. Каждый второй элемент строки после первого. 1. Все элементы до второго. 1. Все элементы начиная с конца до предпоследнего. 1. Все элементы в диапазоне индексов от 3 до 4 (не включая 4). 1. Последние три элемента строки. 1. Все элементы в диапазоне индексов от 3 до 4. 1. То же, что и в предыдущем пункте, но в обратном порядке. Для получения и вывода результатов используйте только команду print и срезы. Результаты работы программы: ``` 1: abcdefg 2: gfedcba 3: aceg 4: bdf 5: a 6: g 7: d 8: efg 9: de 10: ed ``` ### Что оценивается - Результат вычислений корректен. - Формат вывода соответствует примеру. - Для получения результата используются только print и срезы переменной alphabet. ## Задача 5. Разворот ### Что нужно сделать На вход в программу подаётся строка, в которой буква h встречается как минимум два раза. Реализуйте код, который разворачивает последовательность символов, заключённую между первым и последним появлением буквы h, в противоположном порядке. Пример 1: ``` Введите строку: hqwehrty Развёрнутая последовательность между первым и последним h: ewq. ``` Пример 2: ``` Введите строку: hh Развёрнутая последовательность между первым и последним h: ``` Пример 3: ``` Введите строку: hhqwerh Развёрнутая последовательность между первым и последним h: rewqh. ``` ### Что оценивается - Результат вычислений корректен. - input содержит корректные приглашения для ввода. - Формат вывода соответствует примеру. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 6. Двумерный список ### Что нужно сделать Как мы говорили ранее, в программировании часто приходится писать код исходя из результата, который требует заказчик. В этот раз заказчику нужно получить вот такой двумерный список: `[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]` Напишите программу, которая генерирует такой список и выводит его на экран. Используйте только list comprehensions. ### Что оценивается - Результат вычислений корректен. - Формат вывода соответствует примеру: без текста, просто двумерный список с числами. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 7. Список списков ### Что нужно сделать Дан вот такой (уже многомерный!) список: ```python nice_list = [[[1, 2, 3], [4, 5, 6], [7, 8, 9]], [[10, 11, 12], [13, 14, 15], [16, 17, 18]]] ``` Напишите код, который «раскрывает» все вложенные списки, то есть оставляет только внешний список. Для решения используйте только list comprehensions. `Ответ: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]` ### Что оценивается - Результат вычислений корректен. - Формат вывода соответствует ответу. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Задача 8. Шифр Цезаря ### Что нужно сделать Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через K позиций по кругу. Если взять русский алфавит и K = 3, то в слове, которое мы хотим зашифровать, буква А станет буквой Г, Б станет Д и так далее. Пользователь вводит сообщение, а также значение сдвига. Напишите программу, которая зашифрует это сообщение при помощи шифра Цезаря. Пример: ``` Введите сообщение: это питон. Введите сдвиг: 3 Зашифрованное сообщение: ахс тлхср. ``` ### Что оценивается - Результат вычислений корректен. - input содержит корректные приглашения для ввода. - Формат вывода соответствует примеру. - Алгоритм шифрования вынесен в отдельную функцию. - Переменные и функции имеют значащие имена, не только a, b, c, d (подробнее об этом в видео 2.3). ## Что оценивается в домашнем задании - Практическая работа сдана через GitLab. - Структура папок и файлов репозитория соответствует репозиторию python_basic. - Все задачи выполнены в соответствующих папках и файлах `main.py`. - Описания коммитов осмысленны и понятны: `111`, `done`, `«я сделалъ»` — неверно; `added m15 homework`, `14.3 fix: variables naming` — верно. - Использованы именованные индексы, не просто `i` (подробнее в видео 7.2). - Использованы правильные числа, без дополнительных действий со стороны пользователя, без `+1` (подробнее об этом в видео 7.4). - Правильно оформлен `input`, без пустого приветствия для ввода (подробнее об этом в видео 2.3). - Переменные и функции имеют значащие имена, не только `a`, `b`, `c`, `d` (подробнее об этом в видео 2.3). - Есть пробелы после запятых и при бинарных операциях. - Нет пробелов после имён функций и перед скобками: `print ()`, `input ()` — неверно; `print()` — верно. - Правильно оформлены блоки `if-elif-else`, циклы и функции; отступы одинаковы во всех блоках одного уровня. - Во всех задачах для генерации списков использованы `list comprehensions`. ## Советы и рекомендации - Арифметические операции [PEP8](https://docs.python.org/3.7/reference/expressions.html#operator-precedence) остаются в приоритете. Необходимо вводить and, or. - Руководство по стилю Python [PEP8](https://www.python.org/dev/peps/pep-0008/) на английском языке. - Руководство по стилю Python [PEP8](https://pep8.ru/doc/pep8/) на русском языке. - [Список встроенных функций](https://docs.python.org/3.7/library/functions.html). ## Как отправить задание на проверку Чтобы выполнить домашнее задание, обновите репозиторий python_basic на своём компьютере при помощи IDE PyCharm. Задачи находятся в папке Module17. Сдайте домашние работы этого модуля через систему контроля версий Git сервиса Skillbox GitLab. В уроке с домашним заданием напишите «Сделано» и прикрепите ссылку на репозиторий. Ссылки на реплит оставлять не нужно.