{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Python для анализа данных\n", "\n", "*Алла Тамбовцева*\n", "\n", "### Домашнее задание 3\n", "\n", "В этом домашнем задании две части: задачи 1-5 стандартные и проверяются автоматически в системе, задачи 6-8 творческие, более объемные, просматриваются преподавателем после дедлайна." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Активировать тесты\n", "Запустите следующие ячейку, чтобы иметь возможность запускать тесты. Эту операцию нужно проделывать каждый раз, когда вы перезапускаете ядро. Если какой-то из тестов говорит `NameError: name 'Tester' is not defined`, нужно запустить эту ячейку ещё раз." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Фабрика тестов для проверки программ, принимающих данные через input()\n", "\n", "from collections import deque\n", "\n", "class Tester(object):\n", " def __init__(self, inp):\n", " self.outputs = []\n", " self.inputs = deque(inp)\n", " def print(self, *args, sep = \" \", end = \"\\n\"):\n", " text = sep.join(map(str, args)) + end\n", " newlines = text.splitlines(keepends=True)\n", " if self.outputs and self.outputs[-1] and self.outputs[-1][-1] != \"\\n\" and newlines:\n", " self.outputs[-1] += newlines[0]\n", " self.outputs.extend(newlines[1:])\n", " else:\n", " self.outputs.extend(newlines)\n", " \n", " def input(self, *args):\n", " assert self.inputs, \"Вы пытаетесь считать больше элементов, чем предусмотрено условием\"\n", " return self.inputs.popleft()\n", " def __enter__(self):\n", " global print\n", " global input\n", " print = self.print\n", " input = self.input\n", " return self.outputs\n", " def __exit__(self, *args):\n", " global print\n", " global input\n", " del print\n", " del input" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1 \n", "\n", "Напишите программу, которая просит пользователя последовательно ввести с клавиатуры два числа (каждое с новой строчки), число пройденных экзаменов и общее число экзаменов, и выводит на экран сообщение вида `Пройдено 40.00% пути.` Число процентов должно представляться в виде целого числа; если оно дробное, то дробная часть должна отбрасываться.\n", "\n", "**Пример работы программы:**\n", "\n", "Ввод:\n", "\n", " Введите число пройденных экзаменов: 2\n", " Введите общее число экзаменов: 8\n", " \n", "Вывод: \n", " \n", " Пройдено 25 процентов пути." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "nbgrader": { "grade": false, "grade_id": "p1", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def my_count():\n", " ### BEGIN SOLUTION\n", " e = int(input('Введите число пройденных экзаменов: '))\n", " t = int(input('Введите общее число экзаменов: '))\n", " a = int(e / t * 100)\n", " print('Пройдено %i процентов пути.' % a)\n", " ### END SOLUTION\n", "my_count()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "nbgrader": { "grade": true, "grade_id": "p1-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"6 8\", [\"Пройдено 75 процентов пути.\\n\"]),\n", " (\"1 10\", [\"Пройдено 10 процентов пути.\\n\"]),\n", " (\"2 8\", [\"Пройдено 25 процентов пути.\\n\"]),\n", " (\"3 8\", [\"Пройдено 37 процентов пути.\\n\"])]\n", "\n", "for inp, out in test_data:\n", " with Tester(inp.split()) as t:\n", " my_count()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t == out, \"Неверный ответ, была введена строка\" + inp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2\n", "\n", "Напишите программу `col_music()`, которая просит пользователя ввести название цвета, и, если цвет равен `yellow`, она выводит на экран строку \"We all live in a yellow submarine\", если `green`, то \"And the green grass grows all around, all around\", если `black`, то \"Black night is not right\". Если пользователь вводит какой-то другой цвет или один из перечисленных цветов в другом регистре или с опечатками, программа должна выводить на экран строку \"Too hard. Make up something else.\" \n", "\n", "**Пример работы программы:**\n", "\n", "На входе:\n", "\n", " Enter color: black\n", "\n", "На выходе (вывод на экране):\n", "\n", " Black night is not right" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "nbgrader": { "grade": false, "grade_id": "p2", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter color: 4\n", "Too hard. Make up something else\n" ] } ], "source": [ "def col_music():\n", " ### BEGIN SOLUTION\n", " c = input('Enter color: ')\n", " if c == 'yellow':\n", " print('We all live in a yellow submarine')\n", " elif c == 'green':\n", " print('And the green grass grows all around, all around')\n", " elif c == 'black':\n", " print('Black night is not right')\n", " else:\n", " print('Too hard. Make up something else')\n", " ### END SOLUTION\n", "col_music()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "nbgrader": { "grade": true, "grade_id": "p2-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"black\", [\"Black night is not right\\n\"]),\n", " (\"green\", [\"And the green grass grows all around, all around\\n\"]),\n", " (\"yellow\", [\"We all live in a yellow submarine\\n\"]),\n", " (\"Yellowe\", [\"Too hard. Make up something else\\n\"])]\n", "\n", "for inp, out in test_data:\n", " with Tester([inp]) as t:\n", " col_music()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t == out, \"Неверный ответ, была введена строка \" + inp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3\n", "\n", "Впишите недостающий код в функцию `make_double()`, которая принимает на вход некоторый список `L`, а возвращает кортеж `T` из двух списков: принятого на вход (старого) и преобразованного (нового). Преобразованный список представляет собой продублированный список, принятый на вход. \n", "\n", "**Пример работы программы:**\n", "\n", "На входе – список `L`:\n", "\n", " ['a', 'b', 3]\n", "\n", "На выходе – кортеж `T`:\n", "\n", " (['a', 'b', 3], ['a', 'b', 3, 'a', 'b', 3])\n", " \n", "Ничего менять в готовом коде ниже не нужно, ваша задача – просто вписать строки, которые позволяют создать нужный кортеж `T`." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "nbgrader": { "grade": false, "grade_id": "p3", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [ { "data": { "text/plain": [ "(['a', 'b', 3], ['a', 'b', 3, 'a', 'b', 3])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L = ['a', 'b', 3]\n", "\n", "def make_double(L):\n", " ### BEGIN SOLUTION\n", " T = (L, L+L)\n", " ### END SOLUTION\n", " return T\n", "make_double(L)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "nbgrader": { "grade": true, "grade_id": "p3-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "assert make_double(['a', 'b', 3]) == (['a', 'b', 3], ['a', 'b', 3, 'a', 'b', 3]), \"Ошибка при вводе \" + str(['a', 'b', 3])\n", "assert make_double([1, 0, 3, 3]) == ([1, 0, 3, 3], [1, 0, 3, 3, 1, 0, 3, 3]), \"Ошибка при вводе \" + str([1, 0, 3, 3])\n", "assert make_double([-1, 6, 5, 9, 'q']) == ([-1, 6, 5, 9, 'q'], [-1, 6, 5, 9, 'q',-1, 6, 5, 9, 'q']), \"Ошибка при вводе \" + str(-1, 6, 5, 9, 'q')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4\n", "\n", "Допишите недостающий код в функцию `slov_find()`, которая принимает на вход два аргумента\n", "\n", "* слово на русском или словенском языке (`w`)\n", "* целое число, обозначающее перевод языка. 1 – со словенского на русский, 2 – с русского на словенский (`la`)\n", "\n", "и возвращает соответствующий перевод слова (`res`). Считайте, что пользователь вводит слова из готового словаря `my_dict`. Если введенного слова нет в словаре `my_dict`, должна возвращаться строка `res = \"Слово не найдено\"`.\n", "\n", "Ничего в коде ниже менять не нужно, ваша задача – написать строки кода, которые присваивают переменной `res` нужное значение в зависимости от выполнения условий." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Пример работы программы:**\n", " \n", "На входе: \n", "\n", " w = \"fant\"\n", " la = 1\n", " slov_find(w, la)\n", "\n", "На выходе:\n", " \n", " 'парень'\n", " \n", "На входе:\n", "\n", " w = \"язык\"\n", " la = 2\n", " slov_find(w, la)\n", "\n", "На выходе:\n", "\n", " 'jezik'\n", " \n", "На входе:\n", "\n", " w = \"открытка\"\n", " la = 2\n", " slov_find(w, la)\n", "\n", "На выходе:\n", "\n", " 'Слово не найдено'" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "nbgrader": { "grade": false, "grade_id": "p4", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите слово: 4\n", "Введите число, 1 ‒ перевод со словенского на русский, 2 ‒ переводс русского на словенский: 2\n" ] }, { "data": { "text/plain": [ "'Слово не найдено'" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = input(\"Введите слово: \")\n", "la = int(input(\"Введите число, 1 ‒ перевод со словенского на русский, 2 ‒ переводс русского на словенский: \"))\n", "\n", "def slov_find(w, la):\n", " ### BEGIN SOLUTION\n", " back = {v:k for k, v in my_dict.items()}\n", " if w in my_dict.items():\n", " if la == 1:\n", " res = my_dict(w)\n", " if la == 2:\n", " res = back(w)\n", " else:\n", " res = 'Слово не найдено'\n", " ### END SOLUTION \n", " return res\n", "\n", "slov_find(w, la)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "my_dict = {'računalnik': 'компьютер', \n", " 'fant' : 'парень', \n", " 'sladoled' : 'мороженое', \n", " 'kosilo' : 'обед', \n", " 'jezik' : 'язык', \n", " 'hrbetnica' : 'позвоночник', \n", " 'enota' : 'урок'}" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "nbgrader": { "grade": true, "grade_id": "p4-test", "locked": true, "points": 2, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "assert slov_find('fant', 1), \"Ошибка при вводе слова \" + \"fant\"\n", "assert slov_find('računalnik', 1), \"Ошибка при вводе слова \" + \"računalnik\"\n", "assert slov_find('sladoled', 1), \"Ошибка при вводе слова \" + \"sladoled\"\n", "assert slov_find('урок', 2), \"Ошибка при вводе слова \" + \"урок\"\n", "assert slov_find('обед', 2), \"Ошибка при вводе слова \" + \"обед\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 5\n", "\n", "Допишите недостающий код в функцию `my_count()`, которая принимает на вход целое число в формате строки (*string*) и,\n", "\n", "* если число однозначное, возвращает пустой словарь;\n", "* если число состоит более, чем из одной цифры, возвращает словарь вида `{\"сумма цифр\" : 12, \"произведение цифр\": 27}`.\n", "\n", "Пользоваться готовой функцией `sum()` можно. Для произведения можно импортировать библиотеку `numpy` и взять оттуда функцию `prod()`. Например, `numpy.prod([1,6,7])`.\n", "\n", "Ничего в коде ниже менять не нужно, ваша задача – написать строки кода, которые присваивают переменной `res` нужное значение в зависимости от выполнения условий." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "nbgrader": { "grade": false, "grade_id": "p5", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Введите целое число больше 0: 9\n" ] }, { "data": { "text/plain": [ "{}" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = input(\"Введите целое число больше 0: \")\n", "def my_count(n):\n", " ### BEGIN SOLUTION\n", " if len(n) > 1:\n", " n = [int(i) for i in list(n)]\n", " s = sum(n)\n", " import numpy\n", " m = numpy.prod(n)\n", " res = {'сумма цифр' : s, 'произведение цифр' : m}\n", " else:\n", " res = {}\n", " ### END SOLUTION\n", " return res\n", "my_count(n)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "nbgrader": { "grade": true, "grade_id": "p5-test", "locked": true, "points": 2, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "assert my_count('325') == {'произведение цифр': 30, 'сумма цифр': 10}, \"Ошибка при вводе числа 325\"\n", "assert my_count('111') == {'произведение цифр': 1, 'сумма цифр': 3}, \"Ошибка при вводе числа 111\"\n", "assert my_count('45623') == {'произведение цифр': 720, 'сумма цифр': 20}, \"Ошибка при вводе числа 45623\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 6\n", "\n", "Напишите программу, которая просит пользователя заполнить пропуски в предложениях (дописать фразовые глаголы), считает число правильных ответов и выводит сумму баллов из 10 (каждое предложение весит 1 балл).\n", "\n", "Предложения с пропусками и недостающие предлоги сохранены в словаре `answers`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "answers = {\"She turned ___ the light so as to enjoy the darkness.\" : \"off\",\n", " \"It was so hot in the room, so she felt she was going to get ___.\" : \"down\",\n", " \"Mary turned right and came ___ her friend Peter.\" : \"across\", \n", " \"It will be very cold in the mountains, so put ___ all warm clothes you have.\" : \"on\", \n", " \"There was no morning when he did not come ___ with a great idea.\" : \"up\", \n", " \"I can't hear you properly, speak ___, please.\" : \"up\", \n", " \"Give ___ talking when I start to speak.\" : \"up\",\n", " \"We get ___ well with our neighbours, we never argue.\" : \"on\", \n", " \"Be careful, the plane is going to take ___.\" : \"off\",\n", " \"He was very sad while listening to the teacher who called him ___.\" : \"down\"}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы получить отступ в одну строку, в конце предыдущей строки можно поставить \\n, символ перехода на новую строку.\n", "\n", "**Пример:**\n", "\n", " Fill in the gaps in the sentences. \n", "\n", " We get ___ well with our neighbours, we never argue.\n", " Your answer: on\n", " She turned ___ the light so as to enjoy the darkness.\n", " Your answer: off\n", " I can't hear you properly, speak ___, please.\n", " Your answer: up\n", " Be careful, the plane is going to take ___.\n", " Your answer: off\n", " He was very sad while listening to the teacher who called him ___.\n", " Your answer: off\n", " There was no morning when he did not come ___ with a great idea.\n", " Your answer: up\n", " It will be very cold in the mountains, so put ___ all warm clothes you have.\n", " Your answer: on\n", " It was so hot in the room, so she felt she was going to get ___.\n", " Your answer: back\n", " Mary turned right and came ___ her friend Peter.\n", " Your answer: across\n", " Give ___ talking when I start to speak.\n", " Your answer: up\n", "\n", " Your score is: 8 out of 10\n", " You made mistakes in the following sentences: \n", " He was very sad while listening to the teacher who called him ___.\n", " It was so hot in the room, so she felt she was going to get ___." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 7\n", "Напишите программу, которая выбирает первый пример из списка `exer` и предлагает пользователю его решить. Если решение верное, то на экран выводится сообщение \"Верно!\" и программа предлагает пользователю решить следующий пример, если решение неверное, то на экран выводится сообщение \"Попробуйте еще раз!\" и программа предлагает пользователю решить тот же пример. Когда пользователь предлагает верное решение последнего примера, программа выводит на экран сообщение \"Вы решили все примеры! Идите пить чай!\" и останавливается.\n", "\n", "Список `exer`:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "exer = [\"4^2+3*8\", \"25+4^3*5\", \"36^0.5+12\", \n", " \"34-12*3^2\", \"2^3+16^0.5-1\", \"8*0-2^8\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Подсказка:** создайте список ответов на примеры, а затем словарь соотвествий.\n", "\n", "**Пример работы программы:**\n", "\n", " Решите пример \n", "\n", " 34-12*4^2\n", " -74\n", " Верно! \n", "\n", " Решите пример \n", "\n", " 8*0-2^8\n", " 0\n", " Попробуйте еще раз! \n", "\n", " -256\n", " Верно! \n", "\n", " Решите пример \n", "\n", " 25+4^3*5\n", " 345\n", " Верно! \n", "\n", " Решите пример \n", "\n", " 4^2+3*8\n", " 7\n", " Попробуйте еще раз! \n", "\n", " 40\n", " Верно! \n", "\n", " Решите пример \n", "\n", " 36^0.5+12\n", " 18\n", " Верно! \n", "\n", " Решите пример \n", "\n", " 2^3+16^0.5-1\n", " 11\n", " Верно! \n", "\n", " Вы решили все примеры! Идите пить чай!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 8\n", "\n", "*Поле чудес (почти)*\n", "\n", "Напишите программу-игру, которая делает следующее: загадывает слово и просит пользователя угадать его по первой и последней букве (\"скелет\" слова выводится на экран). Если пользователь угадал слово, на экран выводится сообщение \"Так держать!\", если нет ‒ сообщение вида \"Подсказка: \" и слово с двумя первыми буквами. Если пользователь опять не угадывает, выводится сообщение вида \"Подсказка: \" и слово с тремя первыми буквами и так далее, до тех пор, пока пользователь не угадает слово.\n", "\n", "Для удобства приведен код, который залезает в txt-файл, в котором хранятся слова (каждое с новой строки), составляет из этих слов список и выбирает из них случайное. [Скачайте](http://math-info.hse.ru/f/2017-18/py-prog/words.txt) файл и сохраните его в ту же папку, что и текущий ноутбук (иначе Python не найдет файл и выдаст ошибку `No such file or directory`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# список слов из файла words.txt\n", "word_list = []\n", "with open('words.txt') as f: # or whatever the wordlist is saved as\n", " for line in f.readlines():\n", " word_list.append(line.strip())\n", "word_list" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# выбор случайного слова - используйте вторую строчку для выбора слова\n", "from random import choice\n", "rword = choice(word_list)\n", "rword" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Примеры работы программы:**\n", "\n", "**Пример 1:**\n", "\n", " Угадайте слово: в _ _ _ а\n", " Введите слово: вилка\n", " Подсказка: вы _ _ а\n", " Введите слово: вышка\n", " Так держать!\n", "\n", "**Пример 2:**\n", "\n", " Угадайте слово: с _ _ _ _ я\n", " Введите слово: сессия\n", " Так держать!\n", "\n", "**Пример 3:**\n", "\n", " Угадайте слово: с _ _ _ _ _ ь\n", " Введите слово: сырость\n", " Подсказка: сл _ _ _ _ ь\n", " Введите слово: слякоть\n", " Подсказка: сло _ _ _ ь\n", " Введите слово: словарь\n", " Так держать!" ] } ], "metadata": { "celltoolbar": "Create Assignment", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }