{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "## Практикум 3: решения" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Общий комментарий:** если в задаче не сказано явно, что функция принимает на вход информацию, введенную пользователем с клавиатуры, не нужно добавлять `input()`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1\n", "Напишите функцию `square()`, которая принимает на вход число и:\n", "\n", "* возвращает его квадрат;\n", "* выводит на экран сообщение вида \"Квадрат числа равен: n\" и ничего не возвращает;\n", "* выводит на экран сообщение вида \"Квадрат числа равен: n\" и возвращает квадрат числа;" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# возвращает квадрат числа\n", "def square(x):\n", " return x**2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "36" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "square(6)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "36" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res1 = square(6)\n", "res1 # результат сохранен" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# выводит на экран сообщение и ничего не возвращает\n", "def square2(x):\n", " print(\"Квадрат числа равен: \", x**2)\n", " # без return" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# или так (тот же код)\n", "def square2(x):\n", " print(\"Квадрат числа равен: \", x**2)\n", " # с пустым return\n", " return" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Квадрат числа равен: 36\n" ] } ], "source": [ "square2(6)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Квадрат числа равен: 36\n" ] } ], "source": [ "res2 = square2(6)\n", "res2 # результат не сохранен" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] } ], "source": [ "print(res2) # вместо результата - пустота" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# и возвращает результат, и выводит сообщение\n", "def square3(x):\n", " print(\"Квадрат числа равен: \", x**2)\n", " return x**2" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Квадрат числа равен: 36\n" ] }, { "data": { "text/plain": [ "36" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "square3(6) " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Квадрат числа равен: 36\n" ] }, { "data": { "text/plain": [ "36" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "res3 = square3(6)\n", "res3 # результат сохранен" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2\n", "Напишите функцию `nums()`, которая принимает на вход целое число, а возвращает список из двух элементов: целое число, предшествующее принятому на вход, и число, следующее за ним.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " 7\n", "\n", "*Выходные данные:*\n", "\n", " [6, 8]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def nums(n):\n", " r = [n - 1, n + 1]\n", " return r" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-1, 1]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nums(0)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# или совсем в две строчки\n", "def nums(n):\n", " return [n - 1, n + 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3\n", "Напишите функцию `str_lower()`, которая принимает на вход строку (набор слов через пробел), а возвращает список ее элементов в нижнем регистре. \n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " \"В лесу родилась ёлочка В лесу она росла\"\n", "\n", "*Выходные данные:*\n", "\n", " ['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла']" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def str_lower(s):\n", " s_list = s.split() # разбиваем строку по пробелу\n", " new_list = [] # создаем пустой список\n", " for i in s_list:\n", " new_list.append(i.lower()) # приводим каждый элемент к нижнему регистру и добавляем в новый список\n", " return new_list" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str_lower(\"В лесу родилась ёлочка В лесу она росла\")" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# или более компактно и быстро - списковые включения\n", "def str_lower(s):\n", " s_list = s.split() # разбиваем строку по пробелу\n", " new_list = [i.lower() for i in s_list]\n", " return new_list" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['в', 'лесу', 'родилась', 'ёлочка', 'в', 'лесу', 'она', 'росла']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str_lower(\"В лесу родилась ёлочка В лесу она росла\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4\n", "Напишите функцию `my_log()`, которая принимает на вход список чисел, и возвращает список их натуральных логарифмов. Если число меньше или равно 0, на его месте в возвращаемом списке должно быть None.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " [1, 3, 2.5, -1, 9, 0, 2.71]\n", "\n", "*Выходные данные:*\n", "\n", " [0.0,\n", " 1.0986122886681098,\n", " 0.9162907318741551,\n", " None,\n", " 2.1972245773362196,\n", " None,\n", " 0.9969486348916096]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# можно импортировать math внутри функции, но тогда Python не будет понимать команды с math за пределами my_log\n", "import math \n", "def my_log(L):\n", " logs = []\n", " for i in L:\n", " if i > 0:\n", " logs.append(math.log(i))\n", " else:\n", " logs.append(None) # None без кавычек\n", " return logs" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.0,\n", " 1.0986122886681098,\n", " 0.9162907318741551,\n", " None,\n", " 2.1972245773362196,\n", " None,\n", " 0.9969486348916096]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "my_log([1, 3, 2.5, -1, 9, 0, 2.71])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 5\n", "Напишите функцию, которая принимает на вход два списка (имена людей и их возраст) и делает следующее:\n", "\n", "* если эти два списка имеют одинаковую длину, то возвращает словарь с парами имя-возраст;\n", "\n", "* если эти два списка имеют разную длину, то функция выводит на экран сообщение \"Списки имеют разную длину\" и возвращает пустой словарь.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " [\"Ann\", \"Tim\", \"Sam\"]\n", " [12, 23, 17]\n", "\n", "*Выходные данные:*\n", "\n", " {\"Ann\": 12, \"Tim\": 23, \"Sam\": 17}\n", "\n", "*Входные данные:*\n", "\n", " [\"Ann\", \"Tim\", \"Sam\"]\n", " [12, 23, 17, 45]\n", "\n", "*Выходные данные:*\n", " \n", " Списки имеют разную длину\n", " {}" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def ages(L1, L2):\n", " if len(L1) == len(L2):\n", " d = dict(zip(L1, L2))\n", " else:\n", " print(\"Списки имеют разную длину\")\n", " d = {}\n", " return d" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# альтернативный код\n", "def ages(L1, L2):\n", " if len(L1) == len(L2):\n", " return dict(zip(L1, L2))\n", " else:\n", " print(\"Списки имеют разную длину\")\n", " return {}" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# еще альтернативный код\n", "def ages(L1, L2):\n", " d = {}\n", " if len(L1) == len(L2):\n", " d = dict(zip(L1, L2))\n", " else:\n", " print(\"Списки имеют разную длину\")\n", " return d" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'Ann': 12, 'Sam': 17, 'Tim': 23}" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ages([\"Ann\", \"Tim\", \"Sam\"], [12, 23, 17])" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Списки имеют разную длину\n" ] }, { "data": { "text/plain": [ "{}" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ages([\"Ann\", \"Tim\", \"Sam\"], [12, 23])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 6\n", "\n", "Напишите функцию `binom_prob()`, которая считает вероятность того, что проведя `n` испытаний Бернулли с вероятностью успеха `p`, мы получим ровно `k` успехов. Эта функция принимает на вход три аргумента: `p`, `n` и `k` и возвращает такой результат:\n", "\n", "$P(X = k) = С_n^k \\cdot p^k \\cdot (1-p)^{n-k}$\n", "\n", "Для расчета биномиального коэффициента можно использовать функцию, написанную на лекции." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# функция для факториала с лекции\n", "\n", "def factorial(n):\n", " f = 1\n", " for i in range(2, n + 1):\n", " f = f * i\n", " return f\n", "\n", "# функция для биномиального коэффициента с лекции\n", "\n", "def binom(n, k):\n", " c = factorial(n) // (factorial(k) * factorial(n-k))\n", " return c" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "def binom_prob(p, n, k):\n", " r = binom(n, k) * p **k * (1-p)**(n-k)\n", " return r" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3125" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "binom_prob(0.5, 5, 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 7\n", "\n", "Напишите функцию `all_sort()`, которая принимает на вход перечень целых чисел через запятую (не список, а просто сколько угодно значений через запятую) и возвращает список этих значений, отсортированный по возрастанию.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " 7, 6, 1, 3, 8, 0, -2\n", "\n", "*Выходные данные:*\n", "\n", " [-2, 0, 1, 3, 6, 7, 8]" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "def all_sort(*args):\n", " res = sorted(args)\n", " return res" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-2, 0, 1, 3, 6, 7, 8]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "all_sort(7, 6, 1, 3, 8, 0, -2)" ] } ], "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.2" } }, "nbformat": 4, "nbformat_minor": 2 }