{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Программирование на языке Python для сбора и анализа данных\n", "*Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ*\n", "\n", "Данный notebook является набором задач по курсу \n", "«Программирование на языке Python для сбора и анализа данных» \n", "(НИУ ВШЭ, 2014-15). Распространяется по лицензии [CC BY-SA \n", "4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ru).\n", "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №6\n", "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 8 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 8 баллов, чтобы подстраховаться.\n", "\n", "Для предварительной проверки задания нужно скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. [здесь](http://math-info.hse.ru/2015-16/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B5_Python_%D0%B4%D0%BB%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%B0_%D0%B8_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85#.D0.9A.D0.B0.D0.BA_.D0.B8.D1.81.D0.BF.D0.BE.D0.BB.D1.8C.D0.B7.D0.BE.D0.B2.D0.B0.D1.82.D1.8C)) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.\n", "\n", "Чтобы сдать ДЗ, его надо будет загрузить на сервер в виде `ipynb`-файла. Куда загрузить — мы скажем дополнительно чуть позже." ] }, { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "locked": false, "points": 0, "solution": false } }, "source": [ "### Задача A. (2 балла.)\n", "**Определение.** Написать функцию `median(x1, x2, ...)`, принимающую на вход несколько чисел и возвращающую их [медиану](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D0%B4%D0%B8%D0%B0%D0%BD%D0%B0_%28%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%29) (для чётного числа элементов возьмите среднее арифметическое между двумя серединными элементами). Пользоваться библиотечными функциями нельзя!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "30753474fba3b5dc227bd97cc078a883", "grade": false, "grade_id": "prA", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "88640f111a1df4b5e39d4f88c5c2f236", "grade": true, "grade_id": "prA_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "from random import shuffle, seed\n", "seed(0)\n", "def shuffle_test(f, inp, outp, n=10):\n", " for i in range(n):\n", " shuffle(inp)\n", " assert abs(f(*inp)-outp)<1E-15\n", "def test(inp,outp, n=10):\n", " return shuffle_test(median, inp, outp)\n", "\n", "test([1,2],1.5)\n", "test([1,2,3], 2)\n", "test([10,20,30],20)\n", "test([10,20,30,40], 25)\n", "test([1, 2, 4, 8, 16], 4)\n", "test([4],4)\n", "test([4]*100+[1000],4)\n", "\n", "del shuffle, seed, shuffle_test, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача B. (1 балл.)\n", "Написать функцию `first_str(str1, str2, ...)`, принимающую на вход несколько строчек и возвращающую ту из них, которая будет идти первой при упорядочивании по алфавиту.\n", "\n", "**Подсказка.** Хотите отсортировать весь список и взять его первый элемент? Это не самое лучшее решение: для сортировки всего списка понадобится много времени, если он большой, а вас интересует лишь самый «маленький» его элемент. Попробуйте исползовать функцию `min()` — посмотрите, можно ли ей скормить строки вместо чисел. Исползовать библиотеки нельзя." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "a082c675342dd11c06f79bece8ff4916", "grade": false, "grade_id": "prB", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "6d46bb484aaa28b519a6dd721be3ff8f", "grade": true, "grade_id": "prB_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "from random import shuffle, seed\n", "seed(0)\n", "def shuffle_test(f, inp, outp, n=10):\n", " for i in range(n):\n", " shuffle(inp)\n", " assert f(*inp)==outp\n", "def test(inp,outp, n=10):\n", " return shuffle_test(first_str, inp, outp)\n", "\n", "test(['Hello'], 'Hello')\n", "test(['Hello', 'World'], 'Hello')\n", "test(['hello', 'World'], 'World')\n", "test(['a','b','c','d','e'], 'a', 20)\n", "test(['hello']*100+['World'], 'World')\n", "test(['a', 'aa', 'aaa','aaaa'], 'a')\n", "\n", "del shuffle, seed, shuffle_test, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача C. (1 балл.)\n", "Написать функцию `get_first_student_grade(students)`, принимающую на вход список `students`, каждый элемент которого является кортежем: первый элемент кортежа является именем студента, а второй его оценкой. Например: `students = [('Bob', 3), ('Alice', 4)]`. Функция должна вернуть оценку студента, имя которого является первым при алфавитной сортировке. (В нашем случае должна вернуть число `4`.) Все студенты имеют разные имена.\n", "\n", "**Подсказка.** См. подсказку к задаче B. Возможно, функции `min()` удастся скормить кортежи? Попробуйте! Кстати, задача решается ровно в одну строчку (не считая `def`). Использовать библиотеки нельзя." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "3b6b261c28ea801af124f3f692e1d2af", "grade": false, "grade_id": "prC", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from random import shuffle, seed\n", "seed(0)\n", "def shuffle_test(f, inp, outp, n=10):\n", " for i in range(n):\n", " shuffle(inp)\n", " assert f(inp)==outp\n", "def test(inp,outp, n=10):\n", " return shuffle_test(get_first_student_grade, inp, outp)\n", "test([('Bob', 3), ('Alice', 4)], 4)\n", "test([('Zzz', 1)], 1)\n", "test([('Haha', 2), ('Hoho', 3), ('Zzz', 4), ('aaaa', 5)], 2)\n", "\n", "del shuffle, seed, shuffle_test, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача D. (2 балла.)\n", "Написать функцию `get_name_of_best_student(students)`, принимающую на вход список `students`, каждый элемент которого является кортежем: первый элемент кортежа является именем студента, а второй его оценкой. Например: `students = [('Bob', 3), ('Alice', 4)]`. Функция должна вернуть имя студента с наибольшей оценкой. Если таких студентов несколько, она должна вернуть имя того из них, кто первый встречается в списке `students` (в том порядке, в котором этот список передан). Например, для списка `[('Bob', 4), ('Alice', 4)]` необходимо вернуть `'Bob'`, а для списка `[('Alice', 4), ('Bob', 4)]` вернуть `'Alice'`.\n", "\n", "**Подсказка.** У функций `min()` и `max()` есть необязательный параметр `key`, работающий так же, как и у функции `sort()`. К чему бы это? Кстати, задача снова решается в одну строчку (не считая `import` и `def`), без циклов и условных операторов. Можно использовать `import`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "33c25446694de5941c63f2c648c719f0", "grade": false, "grade_id": "prD", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "6e4dda6fd258fc7c6aca4e41c60da34d", "grade": true, "grade_id": "prD_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "assert get_name_of_best_student([('Bob', 4), ('Alice', 4)]) == 'Bob'\n", "assert get_name_of_best_student([('Alice', 4), ('Bob', 4)]) == 'Alice'\n", "assert get_name_of_best_student([('Zzz', 3), ('Bob', 4), ('Alice', 4)]) == 'Bob'\n", "assert get_name_of_best_student([('Alice', 4), ('Zzz', 3), ('Bob', 4)]) == 'Alice'\n", "assert get_name_of_best_student([('Zzz', 5), ('Bob', 4), ('Alice', 4)]) == 'Zzz'\n", "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4)]) == 'Zzz'\n", "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4), ('Zzz', 5)]) == 'Zzz'\n", "assert get_name_of_best_student([('Alice', 4), ('Zzz', 5), ('Bob', 4), ('Zzz', 3)]) == 'Zzz'\n", "assert get_name_of_best_student([('Alice', 0)]) == 'Alice'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача E. (4 балла.)\n", "Написать функцию `sort_gradebook(gradebook)`, принимающую на вход некую ведомость в виде списка, элементами которого являются списки такого вида: `[first_name, last_name, grade_1, grade_2, ..., grade_n, final_grade]`, где `first_name` — имя студента, `last_name` — его фамилия, `grade_1, ..., grade_n` — оценки студента по контрольным от 1 до n (число n — общее число контрольных, оно одинаковое для конкретного gradebook, но заранее не известно), `final_grade` — итоговая оценка. Функция должна отсортировать `gradebook` следующим образом (и вернуть его отсортированным):\n", "\n", "- По итоговой оценке\n", "- При совпадении итоговой оценки — по оценке за первую контрольную\n", "- При совпадении всего предыдущего — по оценке за вторую контрольную\n", "- При совпадении всего предыдущего — по оценке за третью контрольную (и т.д. пока контрольные не закончатся)\n", "- При совпадении всех оценок — по фамилии\n", "- При совпадении всех оценок и фамилии — по имени\n", "\n", "Примеры см. в тестах.\n", "\n", "**Подсказка.** Внимательное чтение конспекта лекции №6 вам поможет." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "0492be7632b5df940619fe703abcf50a", "grade": false, "grade_id": "prE", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "d9fa8a2c934835438ff59408671dc3eb", "grade": true, "grade_id": "prE_t", "locked": true, "points": 4, "solution": false } }, "outputs": [], "source": [ "from itertools import permutations\n", "def test_sort(inp, outp):\n", " for i in permutations(inp):\n", " assert sort_gradebook(list(i)) == outp\n", "\n", "test_sort([\n", " ['Alice', 'Smith', 2, 3, 4],\n", " ['John', 'Smith', 2, 3, 5]\n", " ], [\n", " ['John', 'Smith', 2, 3, 5],\n", " ['Alice', 'Smith', 2, 3, 4]\n", "])\n", "\n", "test_sort([\n", " ['Alice', 'Smith', 2, 3, 4],\n", " ['John', 'Smith', 2, 3, 4]\n", " ], [\n", " ['Alice', 'Smith', 2, 3, 4],\n", " ['John', 'Smith', 2, 3, 4]\n", "])\n", "\n", "test_sort([\n", " ['Alice', 'Smith', 1, 3, 4],\n", " ['John', 'Smith', 2, 3, 4]\n", " ], [\n", " ['John', 'Smith', 2, 3, 4],\n", " ['Alice', 'Smith', 1, 3, 4]\n", "])\n", "\n", "test_sort([\n", " ['Alice', 'Smith', 1, 1, 1, 3, 4],\n", " ['John', 'Smith', 1, 1, 2, 3, 4]],\n", " [\n", " ['John', 'Smith', 1, 1, 2, 3, 4],\n", " ['Alice', 'Smith', 1, 1, 1, 3, 4]\n", "])\n", "\n", "test_sort([\n", " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", " ['John', 'Smith', 1, 1, 2, 3, 4]], \n", " [\n", " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", " ['John', 'Smith', 1, 1, 2, 3, 4]\n", "])\n", "\n", "test_sort([\n", " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", " ['John', 'Smith', 2, 1, 2, 3, 4]], \n", " [\n", " ['John', 'Smith', 2, 1, 2, 3, 4],\n", " ['Alice', 'Doe', 1, 1, 3, 3, 4],\n", " ['Alice', 'Smith', 1, 1, 3, 3, 4],\n", "])\n", "\n", "del test_sort" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача F. (1 балл.)\n", "Написать функцию `mail(student, grade, perf)`, возвращающую строку со следующим текстом: `\"Dear ! Your grade is and your performance rate is %\"`. Здесь `student` — имя студента, `grade` — его оценка, являющаяся целым числом, а `perf` — вещественное число, которое необходимо вывести с двумя знаками после точки. Если `perf` целое, оно всё равно должно быть выведено как вещественное число с двумя знаками после точки. (Последний знак процента — это просто знак процента.)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "6ff34977b819abcd9216c5eaef1af98f", "grade": false, "grade_id": "prF", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "3dc9c2ec44278ea3332b2ae8212b98c6", "grade": true, "grade_id": "prF_t", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert mail(\"Nick\", 5, 12) == 'Dear Nick! Your grade is 5 and your performance rate is 12.00%'\n", "assert mail(\"John\", 4, 22.22) == 'Dear John! Your grade is 4 and your performance rate is 22.22%'\n", "assert mail(\"Alice\", 12, 1.2345) == 'Dear Alice! Your grade is 12 and your performance rate is 1.23%'\n", "assert mail(\"Elizabeth\", 14, 1.235) == 'Dear Elizabeth! Your grade is 14 and your performance rate is 1.24%'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача G. (2 балла.)\n", "Написать функцию `pi_digits(n)`, возвращающую число $\\pi$ в виде строки с `n` знаками после десятичной точки, где `n` — целое число от 0 до 15.\n", "\n", "**Подсказка.** Число `pi` можно импортировать из `math`. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "926672a6bb12c62cd4b313496eb9a57c", "grade": false, "grade_id": "prG", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "3cd41c641ec18efdcf6607b740a75a34", "grade": true, "grade_id": "prG_t", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "out = ['3', '3.1', '3.14', '3.142', '3.1416', '3.14159', '3.141593', '3.1415927', '3.14159265', \n", " '3.141592654', '3.1415926536', '3.14159265359', '3.141592653590', '3.1415926535898', \n", " '3.14159265358979', '3.141592653589793']\n", "for i,s in enumerate(out):\n", " assert pi_digits(i) == s" ] } ], "metadata": { "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.5.0" } }, "nbformat": 4, "nbformat_minor": 0 }