213 lines
15 KiB
Markdown
213 lines
15 KiB
Markdown
## Цели домашнего задания
|
||
Уметь:
|
||
|
||
- описывать 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. В уроке с домашним заданием напишите «Сделано» и прикрепите ссылку на репозиторий. Ссылки на реплит оставлять не нужно.
|
||
|