{ "cells": [ { "cell_type": "markdown", "metadata": { "nbgrader": { "grade": false, "locked": false, "solution": false } }, "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", "задач, про которые сказано обратное) \n", "На [странице курса](http://math-info.hse.ru/s15/m) находятся другие материалы." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №4\n", "За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 10 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 10 баллов, чтобы подстраховаться.\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": {}, "source": [ "### Задача A (1 балл).\n", "Написать функцию `times2(x)`, принимающую на вход число `x` и возвращающую это число, увеличенное в два раза." ] }, { "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": "e1409765d8f545286d147be9102b054b", "grade": true, "grade_id": "prA_t1", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert(times2(1) == 2)\n", "assert(times2(2) == 4)\n", "assert(times2(-2) == -4)\n", "assert(times2(0) == 0)\n", "assert(times2(100) == 200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача B (1 балла).\n", "Написать функцию `is_odd(n)`, проверяющую, является ли данное число `n` нечётным. Она должна возвращать `True`, если число нечётное, и `False`, если чётное." ] }, { "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": "a63b6bd484f06e68c9cb4ec6c8a6d5c0", "grade": true, "grade_id": "prB_t1", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert(is_odd(1))\n", "assert(not is_odd(2))\n", "assert(not is_odd(0))\n", "assert(is_odd(101))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача C (1 балл).\n", "Написать функцию `hello(n)`, выводящую на экран строчку `Hello` `n` раз подряд и ничего не возвращающую. Например, вызов `hello(3)` должен привести к выводу на экран\n", "```\n", "Hello\n", "Hello\n", "Hello\n", "```" ] }, { "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, "deletable": false, "nbgrader": { "checksum": "51f0ebd8a5d6443555beb281946b4f02", "grade": true, "grade_id": "prC_t1", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "buffer = []\n", "passed = True\n", "def print(*args, end = \"\\n\", sep=\" \"):\n", " buffer.append(sep.join(map(str,args))+end)\n", "def my_assert(q):\n", " global passed\n", " if not q:\n", " passed = False\n", "def test_hello(n):\n", " buffer[:]=[]\n", " s = hello(n)\n", " my_assert(s == None)\n", " my_assert(\"\".join(buffer).strip()==(\"Hello\\n\"*n).strip())\n", " buffer[:]=[]\n", "test_hello(3)\n", "test_hello(10)\n", "test_hello(151)\n", "del(print)\n", "assert(passed)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача D. (2 балла)\n", "Написать функцию `num_div(n)`, вычисляющую, сколько у данного числа `n` делителей (включая 1 и само это число). Функция должна работать с целыми положительными числами." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "33c25446694de5941c63f2c648c719f0", "grade": false, "grade_id": "prD", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "c925af09b58a39235f7c3f5defa8179c", "grade": true, "grade_id": "prD_t1", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "assert(num_div(1) == 1)\n", "assert(num_div(2) == 2)\n", "assert(num_div(3) == 2)\n", "assert(num_div(100) == 9)\n", "assert(num_div(1000) == 16)\n", "assert(num_div(139) == 2)\n", "assert(num_div(1289237) == 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача E (1 балл).\n", "Написать функцию `is_prime(n)`, проверяющую, является ли данное число `n` простым. Она должна возвращать `True`, если число является простым, и `False` в противном случае. **Примечание.** Можете использовать ранее написанную функцию `num_div(n)`. (**Вопрос:** Является ли это самым эффективным способом решения данной задачи?)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "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": "5227acc13b0db6a0c6fb30cbb65b838e", "grade": true, "grade_id": "prE_t1", "locked": true, "points": 1, "solution": false } }, "outputs": [], "source": [ "assert(is_prime(2) and \n", " is_prime(3) and \n", " is_prime(139) and \n", " is_prime(617) and \n", " is_prime(293) and \n", " not is_prime(12) and \n", " not is_prime(13*7))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача F. (2 балла)\n", "Написать функцию `med3(x,y,z)`, возвращающую медиану из чисел `x`, `y`, `z` (то есть то из этих чисел, которое будет стоять посередине, если их упорядочить). Пользоваться какими-либо библиотечными функциями нельзя!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "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": "afc6868363c0028e79b6c119ab4c7bfc", "grade": true, "grade_id": "prF_t1", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "from itertools import permutations\n", "def test_med3(x,y,z,m):\n", " for t in permutations([x,y,z]):\n", " assert(med3(*t) == m)\n", "test_med3(1,1,1,1)\n", "test_med3(1,1,2,1)\n", "test_med3(1,2,2,2)\n", "test_med3(1,2,3,2)\n", "test_med3(0,1,2,1)\n", "test_med3(100,200,300,200)\n", "test_med3(100,101,1000,101)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача G. (2 балла)\n", "Написать функцию `mean(x1,x2,…)`, принимающую на вход несколько чисел и возвращающую их среднее арифметическое." ] }, { "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": true, "deletable": false, "nbgrader": { "checksum": "842ce17240cff479862f92e1934a7972", "grade": true, "grade_id": "prG_t1", "locked": true, "points": 2, "solution": false } }, "outputs": [], "source": [ "assert(mean(1) == 1)\n", "assert(mean(1,2,3) == 2)\n", "assert(mean(1,5, 8, 12) == 6.5)\n", "assert(mean(8, 9, 1, 2, 3, 11, 15) == 7.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача H. (3 балла)\n", "(Источник: informatics.mccme.ru.) Написать функцию `second_occurance(s)`, принимающую на вход строку `s` и возвращающую индекс **второго** вхождения символа `'f'`. Если символ `'f'` в данной строке встречается только один раз, функция должна вернуть число -1, а если не встречается ни разу, функция должна вернуть число -2." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "d0f8e14022a765d1cc4f91af37ea2ca8", "grade": false, "grade_id": "prH", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "a2dba37f6c19bd1da79da3bcb53bb8fd", "grade": true, "grade_id": "prH_t1", "locked": true, "points": 3, "solution": false } }, "outputs": [], "source": [ "assert(second_occurance(\"comfort\") == -1)\n", "assert(second_occurance(\"coffee\") == 3)\n", "assert(second_occurance(\"qwerty\") == -2)\n", "assert(second_occurance(\"f\") == -1)\n", "assert(second_occurance(\"oooooooooooooooooof\") == -1)\n", "assert(second_occurance(\"ff\") == 1)\n", "assert(second_occurance(\"foooooooooooooof\") == 15)\n", "assert(second_occurance(\"oooooooooooooff\") == 14)\n", "assert(second_occurance(\"ofofofofofofofofo\") == 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача J. (3 балла)\n", "Написать функцию `is_increasing(L, strict)`, проверяющую, является ли список `L` монотонно возрастающим/неубывающим. Если параметр `strict` установлен в `True`, то следует осуществить проверку на строгое возрастание (то есть функция должна возвращать `True` только если каждый следующий элемент списка строго больше предыдущего). Если параметр `strict` установлен в `False`, то функция должна проверять неубывание списка, то есть функция должна возвращать `True` если каждый следующий элемент списка не меньше предыдущего. Если параметр `strict` не установлен (функции передан только один параметр), то нужно проводить проверку на строгое возрастание." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": false, "nbgrader": { "checksum": "e025acc4e768a4e1328005075c068f89", "grade": false, "grade_id": "prJ", "locked": false, "solution": true } }, "outputs": [], "source": [ "# Внесите решение в эту ячейку" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "deletable": false, "nbgrader": { "checksum": "e8d8307e64987da108c25b8ba5387ca7", "grade": true, "grade_id": "prJ_t1", "locked": true, "points": 3, "solution": false } }, "outputs": [], "source": [ "assert(is_increasing([1,2,3]))\n", "assert(is_increasing([1,2,2],False))\n", "assert(not is_increasing([1,2,2]))\n", "assert(is_increasing([1,2,5,10,100]))\n", "assert(is_increasing([1,2,5,10,100],True))\n", "assert(not is_increasing([2,1]))\n", "assert(not is_increasing([2,1],True))\n", "assert(not is_increasing([2,1],False))\n", "assert(is_increasing([1,2]))\n", "assert(is_increasing([1,2], True))\n", "assert(is_increasing([1,2], False))\n", "assert(is_increasing([0,0], False))\n", "assert(not is_increasing([0,0], True))\n", "assert(not is_increasing([1,2,3,4,5,5]))\n", "assert(not is_increasing([1,1, 2, 3, 4, 5]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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 }