{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<table align=right>\n",
    "    <tr>\n",
    "        <td align=center>\n",
    "            <font size=5><b>Программирование $-$ 2026</b></font> \n",
    "        </td>\n",
    "        <td align=right>\n",
    "<img src=\"logoMM.png\" align=right width=120>\n",
    "        </td>\n",
    "    </tr>\n",
    "    </table>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "jp-MarkdownHeadingCollapsed": true
   },
   "source": [
    "### Элементы программы на Python\n",
    "\n",
    "Программа (или скрипт) представляет собой последовательность **определений** и **команд**\n",
    "- Определения обрабатываются и команды выполняются в специальной **среде** (оболочка, *shell*)\n",
    "- Они могут быть набраны прямо в оболочке, или сохранены в файле, который впоследствии может быть загружен в оболочку и выполнен\n",
    "\n",
    "**Команда** (или **оператор**) – инструкция интерпретатору осуществить то или иное действие"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Объекты\n",
    "\n",
    "Суть работы программы – манипулирование с данными, обработка объектов, содержащих данные.\n",
    "\n",
    "Каждый такой объект имеет важную характеристику – **тип**, определяющий, что за данные он содержит, и какие операции к нему применимы.\n",
    "\n",
    "Основная классификация объектов:\n",
    "- Скалярные (их нельзя разделить на составные части)\n",
    "- Не скалярные (составные, имеющие внутреннюю структуру, к которой можно получить доступ)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Скалярные объекты\n",
    "\n",
    "`int` – целые числа (5, -23, 1234567890)  \n",
    "`float` – действительные числа (3.14, 9.81, 1.2e-5)  \n",
    "`bool` – используется для представления двух логических значений: `True` (истина) и `False` (ложь)  \n",
    "\n",
    "Встроенная функция `type` служит для определения типа объекта\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "int"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Выражения\n",
    "\n",
    "**Объекты** и **знаки операций** объединяются в **выражения**, каждое из которых представляет собой объект определенного типа\n",
    "\n",
    "Синтаксис простейшего выражения:  \n",
    "     <**объект**> <**знак операции**> <**объект**>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Операции с числовыми объектами\n",
    "\n",
    "`a + b` –  сумма. Если оба числа – целые, то результат – объект `int`, в остальных случаях результат – `float`\n",
    "\n",
    "`a – b` – разность\n",
    "\n",
    "`a * b` – произведение\n",
    "\n",
    "`a/b`   – частное (в Python 3 всегда `float`)\n",
    "\n",
    "`a//b`  – результат деления нацело  \n",
    "`a % b`   – остаток от деления\n",
    "\n",
    "В двух предыдущих операциях, как правило, `a` и `b` – `int`, результат - `int`\n",
    "\n",
    "`a**b`  – возведение в степень, $a^b$.\n",
    "\n",
    "**Порядок действий:**\n",
    "- Сначала выражения в скобках\n",
    "- Потом слева направо:\n",
    "\n",
    "```python\n",
    "**\n",
    "*, /\n",
    "+, -\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "512"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2**10//2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Операции сравнения\n",
    "```python\n",
    "    a > b\n",
    "    a >= b\n",
    "    a < b\n",
    "    a <= b\n",
    "    a == b\n",
    "    a != b\n",
    "``` \n",
    "\n",
    "Результат сравнения - истина или ложь, `True`  или `False`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "5 < 8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Операции с объектами логического типа\n",
    "\n",
    "```python\n",
    "    a and b  (результат True, если оба аргумента истинны)\n",
    "    a or b   (результат True, если хотя бы один аргумент истинен)\n",
    "    not a    (противоположное значение)\n",
    "``` "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Преобразование типов (type casting)\n",
    "\n",
    "На основе объекта одного типа может быть создан объект другого типа. \n",
    "Для преобразования используется имя типа."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100.0"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "float(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int(3.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Что получится?\n",
    "bool(3.9)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Переменные и значения"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "394.0810495999999"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pi = 3.14159\n",
    "radius = 11.2\n",
    "area = pi*(radius**2)\n",
    "area"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Что происходит с памятью:\n",
    "\n",
    "<img src='memory1.png' width=300>\n",
    "\n",
    "Сначала в памяти создается объект $-$ результат вычислений, а потом он получает **имя**, позволяющее программе получать доступ к этому объекту.\n",
    "\n",
    "**Важно**: имя, или переменная, получает тип в момент присваивания выражению в правой части. Это $-$ **динамическая типизация**.\n",
    "\n",
    "Другой вариант (в других языках программирования): тип переменной определяется в программе в момент ее описания и не может быть изменен. Область памяти для хранения значения такой переменной тоже выделяется в момент ее описания (с некоторыми оговорками). Это $-$ **статическая типизация**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Изменение значения переменной"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "394.0810495999999"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "radius = 14.3\n",
    "area"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='memory2.png' width=300>\n",
    "\n",
    "Обратите внимание на оставшееся в памяти неиспользуемое значение 11.2. Оно \"засоряет память\", является \"мусором\". Его сборкой занимается специальная программа $-$ сборщик мусора (garbage collector)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "!!! Про допустимые и недопустимые имена переменных поговорим чуть позже"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Пример нескалярного объекта: строки"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'123'"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'abc'\n",
    "\"abc\"\n",
    "'''Привет!\n",
    "В этой строке - \n",
    "сразу три строчки'''\n",
    "'123'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Некоторые операции\n",
    "\n",
    "(будем подробно изучать позже)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "str"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type('123')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'мехмат'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'мех' + 'мат'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'AAA'"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'A'*3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'100'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "str(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('100')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Оператор вывода\n",
    "\n",
    "Команды могут выполняться в shell, но **программой** будем называть текст на Питон, сохраненный в файле.\n",
    "\n",
    "В случае выполнения команды в shell результат выполнения сразу выводится на экран. В случае программы требуется специальный оператор: оператор вывода"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n",
      "1872\n",
      "I'll be back!\n",
      "Привет!\n",
      "В этой строке - \n",
      "сразу три строчки\n"
     ]
    }
   ],
   "source": [
    "# Примеры\n",
    "print('hello')\n",
    "print(156*12)\n",
    "print(\"I'll\", \"be\", \"back!\")\n",
    "print('''Привет!\n",
    "В этой строке - \n",
    "сразу три строчки''')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Общий вид\n",
    "\n",
    "```python\n",
    "print(a, b, ..., end='\\n', sep=' ')\n",
    "```\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Ввод данных\n",
    "\n",
    "- Простейший способ взаимодействия программы с пользователем: запрос ввода каких-то данных\n",
    "- Такой ввод осуществляется в Python с помощью функции `input()`\n",
    "- Ее результат имеет тип `str`, поэтому необходимо преобразование типа"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "name = input('Как Вас зовут?  ')\n",
    "age = int(input('Сколько Вам лет? '))\n",
    "weight = float(input('Каков Ваш вес в кг? '))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "age\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Перед тем, как начать программировать...\n",
    "\n",
    "<img src='monk.jpg' align=center width=400>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import this"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Дзен Питона\n",
    "\n",
    "- Красивое лучше, чем уродливое. \n",
    "- Явное лучше, чем неявное.\n",
    "- Простое лучше, чем сложное.\n",
    "- Сложное лучше, чем запутанное.\n",
    "- Плоское лучше, чем вложенное.\n",
    "- Разреженное лучше, чем плотное.\n",
    "- Читаемость имеет значение.\n",
    "- Особые случаи не настолько особые, чтобы нарушать правила.\n",
    "- При этом практичность важнее безупречности.\n",
    "- Ошибки никогда не должны замалчиваться.\n",
    "- Если они не замалчиваются явно.\n",
    "- Встретив двусмысленность, отбрось искушение угадать.\n",
    "- Должен существовать один и, желательно, только один очевидный способ сделать это.\n",
    "- Хотя он поначалу может быть и не очевиден, если вы не голландец.\n",
    "- Сейчас лучше, чем никогда.\n",
    "- Хотя никогда зачастую лучше, чем прямо сейчас.\n",
    "- Если реализацию сложно объяснить — идея плоха.\n",
    "- Если реализацию легко объяснить — идея, возможно, хороша.\n",
    "- Пространства имён — отличная штука! Будем делать их больше!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Стиль кода:\n",
    "\n",
    "<div align=center>\n",
    "    <a href = \"https://pep8.ru/doc/pep8/\">\n",
    "        PEP8 - стиль кода в языке Python</a> <br><br>\n",
    "   <a href = \"https://www.python.org/dev/peps/pep-0008/\"> \n",
    "    PEP 8 -- Style Guide for Python Code! </a> \n",
    "</div>    \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Правила именования переменных\n",
    "\n",
    "<img src=\"camel.png\" align=right width=120>\n",
    "\n",
    "- Имена переменных, функций, методов:  \n",
    "`lower_case_with_underscores`\n",
    "- Константы:  \n",
    "`ALL_CAPS`\n",
    "- Имена Классов:  \n",
    "`CapitalizeWords` (он же `StudlyCaps`)\n",
    "- В крайнем случае (для совместимости с уже имеющимся кодом):  \n",
    "`mixedCase` (он же `camelCase`)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Имена, которых следует избегать\n",
    "Никогда не используйте символы   \n",
    "`l` (маленькая латинская буква «эль»),   \n",
    "`O` (заглавная латинская буква «о») или  \n",
    "`I` (заглавная латинская буква «ай») как однобуквенные идентификаторы.\n",
    "\n",
    "В некоторых шрифтах эти символы неотличимы от цифры один и нуля (и символа вертикальной палочки). \n",
    "\n",
    "Если очень-очень нужно использовать имя переменной из одной буквы `l`, пишите вместо неё заглавную `L`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "Имена переменных ни в коем случае не должны совпадать с ключевыми словами языка"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']\n"
     ]
    }
   ],
   "source": [
    "import keyword\n",
    "print(keyword.kwlist)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.11.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
