{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Начинаем программировать #\n",
    "\n",
    "Теперь, когда Python 3 установлен в систему и я надеюсь вы выбрали редактор или среду разработки, в которых будете писать код на Python'е, мы можем начать программировать."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Первое на что мы посмотрим - это интерактивный интерпретатор Python. Чтобы запустить интерактивный интерпретатор, нам нужно в терминале набрать команду `python3`. Обратите внимание, что в зависимости от вашей системы и способа, которым вы устанавливали интерпретатор python'а 3 в систему, запуск, имя команды может отличаться и, например, быть просто `python`. В моем случае это `python3`. Обратите внимание, что когда я запускаю, версия интерпретатора указана вот здесь, в начале приветственной строки и нам нужна версия >=3.6.0.\n",
    "\n",
    "![Python](python.png \"Python\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Интерактивный интерпретатор, по большому счету, - это программа, которая считывает ввод пользователя, интерпретирует его и выдает на экран результат. Интерпретатор - это то, что делает Python таким доступным. В любой момент вы можете открыть интерактивную оболочку и проверить какую-то свою гипотезу, поэкспериментировать или просто воспользоваться ей как калькулятором."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Давайте это и сделаем. Мы можем сложить два числа, либо поделить два числа."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 + 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "1 / 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Давайте попробуем напечатать на экран какую-нибудь строку, используя для этого встроенную функцию `print`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n"
     ]
    }
   ],
   "source": [
    "print(\"hello\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "У нас получилось. В любой момент, находясь в интерактивном интерпретаторе, мы можем воспользоваться встроенной функцией help. Встроенная функция help позволяет получить справку по любому объекту, который доступен в области видимости. Посмотрим справку по объекту help. Это функция, и мы видим, что справка вывелась на экран, описание, что такое функция `print`, какие аргументы она принимает."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on built-in function print in module builtins:\n",
      "\n",
      "print(...)\n",
      "    print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n",
      "    \n",
      "    Prints the values to a stream, or to sys.stdout by default.\n",
      "    Optional keyword arguments:\n",
      "    file:  a file-like object (stream); defaults to the current sys.stdout.\n",
      "    sep:   string inserted between values, default a space.\n",
      "    end:   string appended after the last value, default a newline.\n",
      "    flush: whether to forcibly flush the stream.\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(print)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Для того чтобы из справки выйти, мы можем нажать клавишу `q`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Сейчас мы ненадолго расстанемся с интерактивным интерпретатором. Чтобы выйти из него, можно нажать `Ctrl + D`, либо использовать доступную в интерпретаторе функцию `exit`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "А сейчас давайте поговорим о том, как в реальных проектах пишут код на Python'е. В реальных проектах код на Python'е пишут конечно же не в интерактивном интерпретаторе, а в файлах. А в больших проектах - в большом количестве файлов. Скоро мы вас научим как структурировать код на Python'е по модулям и пакетам, а сейчас нашей целью будет создать простейший файл, который будет содержать код на Python'е и запустить его интерпретатором Python. Давайте это сделаем. Я буду использовать текстовый редактор `vim`, для того чтобы создать файл. Обратите внимание, что я назвал файлик `example.py` и использовал расширение `py`. Это то расширение, которое принято давать файлам, которые содержат код на Python. Внутри файлика напишем простейшую инструкцию `print(\"hello\")`, сохраним его. Теперь, чтобы запустить, мы можем воспользоваться командой `python3`. В качестве аргумента передать ей имя нашего файла, который только что создали, и программа исполнится."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hello\n"
     ]
    }
   ],
   "source": [
    "! python example.py"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Продолжим. Сейчас мы вернемся в интерактивный интерпретатор и поговорим с вами о переменных. Переменная - это то, что позволяет сохранить результат выполнения выражения для того, чтобы использовать его в дальнейшем. Наверняка вы встречались с переменными в других языках программирования. В Python'е для того, чтобы объявить переменную нужно написать следующее, например, `num = 1`. Мы используем знак `=`. Это оператор присваивания. В данном случае мы связываем имя переменной `num` с целочисленным объектом со значением `1`. В любой момент мы можем переприсвоить имени `num` значение другое - `num = 2`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "num = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "num = 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Также в любой момент мы можем присвоить переменной `num` объект другого типа. В данном случае это строковый объект."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "num = \"hello\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Поговорим о названиях переменных в Python. В Python имена переменных могут содержать буквы, цифры и символ нижнего подчеркивания. При этом начинаться переменная должна либо с буквы, либо с символа нижнего подчеркивания, то есть вот это правильное название переменной в Python, а вот, например, вот такое название уже будет неверным."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "hello_world = \"Hello, world!\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "invalid decimal literal (<ipython-input-21-c463ffa3a285>, line 1)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-21-c463ffa3a285>\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m    42_answer = 42\u001b[0m\n\u001b[1;37m      ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid decimal literal\n"
     ]
    }
   ],
   "source": [
    "42_answer = 42"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "В данном случае происходит ошибка, выбрасывается исключение, это синтаксическая ошибка. Мы видим `SyntaxError`. В дальнейших лекциях нашего курса я научу вас обрабатывать эти исключения. Что важно отметить еще это то, что если переменная состоит из нескольких слов, то есть это длинное название переменной, то ее принято называть так называемым snake_case'ом. То есть слова начинаются с маленькой буквы, и отдельные слова разделены символом нижнего подчеркивания. В других языках вы могли видеть, что переменные называются в так называемом camelCase'ом. В Python'е так делать не принято.\n",
    "\n",
    "Свод рекомендаций в оформлению кода представлен в PEP8 (https://www.python.org/dev/peps/pep-0008/)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Поговорим еще об одной особенности синтаксиса Python, а именно о том, как отделять блоки кода. В других языках вы могли видеть, что блоки кода отделяются фигурными скобочками, в Python'е не так. В Python'е блоки кода нужно отделять с помощью отступов.\n",
    "\n",
    "Что это значит? Давайте напишем небольшую программку, которая будет печатать на экран числа от 0 до 3. Обратите внимание, что блок кода внутри конструкции for, о которой мы еще с вами будем говорить в дальнейшем, я отделил с помощью четырех пробелов."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "2\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "for item in range(4):\n",
    "    print(item)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Это то, как принято отделять блоки кода в Python. Вам, конечно, не придется каждый раз нажимать клавишу Пробел четыре раза. Зачастую это будет делать за вас редактор или IDE, которое вы используете. Последнее на что мы посмотрим, это то как комментировать код. Давайте вернемся в файл `example.py`, который создавали незадолго до этого и попробуем написать комментарий."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "# комментарий"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "В Python'е комментарий пишется с использованием специального символа \"решетка\", после которого идет текст комментария. Также комментарий можно писать на строках с выражениями. Это так называемые `inline` комментарии."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [],
   "source": [
    "'''\n",
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n",
    "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n",
    "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n",
    "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n",
    "'''\n",
    "\n",
    "num = 42 # Answer to the Ultimate Question of Life, The Universe, and Everything"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Также вы можете увидеть, что время от времени в программах встречаются многострочные комментарии. Однако этот комментарий не игнорируется интерпретатором Python. Это строковый литерал, который зачастую вы будете видеть, как часть документации функции, либо класса. Этот строковый литерал становится частью объекта, к которому можно достучаться, используя специальное свойство `doc` у объекта."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "print(value, ..., sep=' ', end='\\n', file=sys.stdout, flush=False)\n",
      "\n",
      "Prints the values to a stream, or to sys.stdout by default.\n",
      "Optional keyword arguments:\n",
      "file:  a file-like object (stream); defaults to the current sys.stdout.\n",
      "sep:   string inserted between values, default a space.\n",
      "end:   string appended after the last value, default a newline.\n",
      "flush: whether to forcibly flush the stream.\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    print.__doc__\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Давайте на это посмотрим. Например, функция print, которую мы использовали содержит атрибут doc, в котором содержится строка документирования, которая определена у этой функции."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "В этой лекции мы с вами познакомились с интерактивным интерпретатором Python, посмотрели на особенности синтаксиса Python, поговорили о том, как отделять блоки кода в Python'е, как называть переменные и написали первую небольшую программу в отдельном файле. В дальнейшем нас ждет знакомство с основными типами, которые есть в языке."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Дополнительные материалы к лекции ##\n",
    "\n",
    "- REPL — Википедия (https://ru.wikipedia.org/wiki/REPL)\n",
    "- Как запустить скрипт на Python (https://mkdev.me/posts/kak-zapustit-skript-na-python)\n",
    "- Комментирование Python кода (https://dev-gang.ru/article/kommentirovanie-python-koda-auf6lgv2vv/)\n",
    "- Правильный выбор имен переменных в Python (http://pythonlearn.ru/python-dlya-nachinayushhix/imena-dlya-peremennyx-v-python/)\n",
    "\n",
    "[Далее...](Полезные%20ссылки.ipynb)"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Слайд-шоу",
  "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
