{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python\n",
    "\n",
    "## Вводная лекция\n",
    "\n",
    "### Раздел 1. Общие соображения\n",
    "\n",
    "#### Мотивация для изучения Python\n",
    "\n",
    "Несколько плюсов языка Python:\n",
    "\n",
    "- Python - один из самых широко используеммых языков программирования. В рейтингах популярности и востребованности языков он давно уже не опускается ниже 5 позиции.\n",
    "\n",
    "- Python очень гибкий с точки зрения используеммых конструкций и подходов. Он позволяет вам писать классический императивный (процедурный код), объектно-ориентированный код, функциональный код или любую их комбинацию. Эта особенность способствует очень высокой скорости разработки (при этом, на мой взгляд, снижает читаемость по сравнению с \"чистыми\" языками программирования, где есть возможность придерживаться только одной парадигмы).\n",
    "\n",
    "- Python очень требователен к оформлению кода по сравнению с другими языками программирования. К тому же, есть документ [PEP 8](https://www.python.org/dev/peps/pep-0008/), который содержит соглашения относительно оформления кода, которые не являются обязательными, но строго рекомендуются к исполнению. Все это влечет к простоте прочтения кода на Python.\n",
    "\n",
    "- Python обладает невероятно большим списком областей применения: утилитарные скрипты; анализ, обработка, хранение, визуализация и передача данных; web- и сетевое программирование; программирование приложений для desktop- и mobile-систем; web-scrapping, offensive-security и тестирование приложений; программирование микроконтроллеров — и многие другие задачи могут быть эффективно решены при помощи Python.\n",
    "\n",
    "Основными недостатками Python можно назвать:\n",
    "\n",
    "- Ограниченный набор базовых конструкций языка и ограниченный функционал стандартной библиотеки.\n",
    "\n",
    "- Низкая скорость выполнения кода.\n",
    "\n",
    "- Реализация многих реальных механизмов взаимодействия в коде скрывается \"под капотом\" от пользователя.\n",
    "\n",
    "#### Литература для этого курса\n",
    "\n",
    "Единственная книга, которая является обязательной для этого курса:\n",
    "\n",
    "**Programming in Python 3 : a complete introduction to the Python language / Mark Summerfield. — 2nd ed.**\n",
    "\n",
    "В природе существует ее *перевод на русский язык*.\n",
    "\n",
    "Еще книги, которые будут полезны:\n",
    "\n",
    "- **Learning Python, Fifth Edition by Mark Lutz** — какое-то издание точно переведено на русский.\n",
    "\n",
    "- **Python Pocket Reference, Fifth Edition by Mark Lutz** — какое-то издание точно переведено на русский.\n",
    "\n",
    "- **Python Cookbook, Second Edition Edited by Alex Martelli, Anna Martelli Ravenscroft, and David Ascher** — не встречал, но наверняка есть перевод.\n",
    "\n",
    "- Любая другая литература, которую найдете (с некоторыми оговорками).\n",
    "\n",
    "#### Темы и модули, которые будут затронуты в этом курсе.\n",
    "\n",
    "В ходе этих лекций мы постараемся затронуть как можно больше областей и модулей, поэтому характер изучения конкретных модулей может оказаться весьма поверхностным. Приведенный ниже список не является исчерпывающим.\n",
    "\n",
    "##### Работа с данными (получение, передача, хранение, выборка, визуализация)\n",
    "\n",
    "- sqlite3;\n",
    "- MySQLdb;\n",
    "- psycopg2;\n",
    "- pymongo;\n",
    "- Pandas;\n",
    "- Vedis;\n",
    "- matplotlib;\n",
    "- bokeh.\n",
    "\n",
    "##### Обработка данных\n",
    "\n",
    "- NumPy;\n",
    "- SymPy;\n",
    "- SciPy.\n",
    "\n",
    "*Более подробное изучение этой области смотрите в курсе \"Машинное обучение на Python\" (ссылка появится позже)*\n",
    "\n",
    "##### Web\n",
    "\n",
    "- pika;\n",
    "- CherryPy;\n",
    "- Django;\n",
    "- Flask;\n",
    "- Sphinx.\n",
    "\n",
    "##### Тестирование\n",
    "\n",
    "- selenium.\n",
    "\n",
    "##### Web-scrapping\n",
    "\n",
    "- BeautifulSoup;\n",
    "- scrapy.\n",
    "\n",
    "#### Варианты установки и запуска Python\n",
    "\n",
    "На момент написания курса у меня стоит версия Python 3.6.5, на нее и будем ориентироваться.\n",
    "\n",
    "Основных способов написания Python-кода 3:\n",
    "\n",
    "1. Скачать один из дистрибутивов, который будет содержать сразу IDE и интерпретатор.\n",
    "\n",
    "2. Скачать отдельно интерпретатор и писать код в текстовом редакторе или IDE по выбору.\n",
    "\n",
    "3. Пользоваться сервисом Jupyter с онлайн-доступом, ничего не скачивая.\n",
    "\n",
    "##### 1. Дистрибутивы\n",
    "\n",
    "- [Официальный дистрибутив с IDLE](https://www.python.org/downloads/).\n",
    "- [Anaconda — очень популярный дистрибутив](https://www.anaconda.com/download/).\n",
    "- [Python(x, y) — дистрибутив, ориентированный на научные вычисления и визуализацию](https://python-xy.github.io/).\n",
    "\n",
    "##### 2. Интерпретатор\n",
    "\n",
    "В Windows скачиваем [официальный дистрибутив](https://www.python.org/downloads/), после чего создаем свои файлы с расширением .py и запускаем в командной строке команду python, передавая ей в качестве аргумента путь (абсолютный или относительный) к файлу .py.\n",
    "\n",
    "В Linux-based системах, скачиваем пакет python3 (иногда называется python) с помощью своего пакетного менеджера, после чего создаем свои файлы с расширением .py и запускаем в командной строке команду python3 (или python), передавая ей в качестве аргумента путь (абсолютный или относительный) к файлу .py. Также необходимо поставить менеджер пакетов для python — pip (как правило, пакет python3-pip).\n",
    "\n",
    "Сам интерпретатор можно запустить и без аргументов, тогда он запустится в интерактивном режиме.\n",
    "\n",
    "После того, как вы установили интерпретатор, вы можете воспользоваться любым удобным IDE (самые популярные: PyCharm и Visual Studio) или текстовым редактором (neovim, spacemacs, Sublime, Atom, Visual Studio Code и др.).\n",
    "\n",
    "##### 3. Jupyter notebook\n",
    "\n",
    "Jupyter можно [использовать онлайн без установки](http://jupyter.org/try). Просто загрузите свой iPython notebook файл и эксперементируйте!\n",
    "\n",
    "#### Где искать информацию?\n",
    "\n",
    "Загугли!\n",
    "\n",
    "Если не получилось загуглить — спроси в канале Slack #python.\n",
    "\n",
    "Стесняешься спросить — напиши мне в личку в ВК, телеге, твиттере или слаке (@devsagul).\n",
    "\n",
    "Совсем не стесняешься спросить — сделай mention в твиттере, может отвечу :)\n",
    "\n",
    "#### Куда слать домашку?\n",
    "\n",
    "Если ты вдруг что-то сделал и хочешь похвастаться — залей на github или gitlab, а ссылку присылай мне. Как прислать? Смотри пункт выше + почта [s.guliaev@lambda-it.ru](mailto:s.guliaev@lambda-it.ru)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Раздел 2. It's time to get our hands dirty или императивное (процедурное) программирование в Python\n",
    "\n",
    "#### Hello, World!\n",
    "\n",
    "Изучение любого языка программирования начинается с программы \"Hello, World!\", давайте не отходить от этой славной традиции:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Hello, World!\n"
     ]
    }
   ],
   "source": [
    "print(\"Hello, World!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Сразу можно отметить, что функция вывода сообщения на экран в Python вызывается как совершенно обычная функция. Также видно, что никаких точек запятой после завершения утверждения нет. В Python точка с запятой используется только для разделения нескольких утверждений на одной строке."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Типы данных в Python\n",
    "\n",
    "Python содержит огромное количество разнообразных типов данных, но пока мы сосредоточим свое внимание на двух из них:\n",
    "целочисленный и строковый тип. Целочисленный тип обозначается ключевым словом int, а строковый — ключевым словом str. Исходя из названия, легко понять, что целочисленный тип предназначен для хранения целых чисел, а строковый — строковых литералов. Вот примеры нескольких литералов:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'It is really useful, что можно использовать символы Юникода в строковых литералах. Εύρηκα!'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "123\n",
    "3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067\n",
    "0\n",
    "-12\n",
    "\"Hello, World!\"\n",
    "'I prefer Python over PHP'\n",
    "''\n",
    "'It is really useful, что можно использовать символы Юникода в строковых литералах. Εύρηκα!'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Как можно заключить по второму числу, тип int в Python не ограничен каким-то конкретным размером, а зависит от объема памяти на вашем компьютере. Строковые литералы можно заключать в одинарные или двойные кавычки и использовать в них символы Юникода. Пустая строка обозначается просто парой кавычек."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Строки в Python можно рассматривать как массивы символов. Следовательно, для них есть операции получения элемента по индексу и получения среза:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "N\n",
      "Do\n",
      "P\n"
     ]
    }
   ],
   "source": [
    "print(\"The New York Times\"[4])\n",
    "print(\"Hot Dogs\"[4:6])\n",
    "print(\"Python\"[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Нумерация индексов начинается с нуля, отрицательные индексы отсчитываются с конца в обратном направлении. Более подробно операция получения среза будет рассмотрена позже."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для перевода данных их одного типа в другой, нужно вызвать этот тип данных в качестве функции и передать ему значение, которое будем переводить:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1605"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int('45')\n",
    "str(10000)\n",
    "int(' 1605 ')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Как видно из последнего примера, int при переводе строкового литерала удаляет все лидирующие и завершающие пробельные символы."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Переменные\n",
    "\n",
    "Python — язык со слабой (утиной) типизацией. Более того, нет необходимости указывать тип переменной. Более того, переменная может принять значение любого другого типа в любой момент:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = 1605\n",
    "x = \"November fifth\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Соглашения относительно именования различных сущностей можно посмотреть в [PEP 8](https://www.python.org/dev/peps/pep-0008/#naming-conventions)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Типы данных-коллекции\n",
    "\n",
    "Все типы данных в Python делятся на *изменяемые* и *неизменяемые*. Многие типы, которые мы будем рассматривать, можно будет разделить на пары, очень близкие по смыслу, но отличающиеся только тем, что одни изменяемы, а другие — нет. С практической точки зрения, неизменяемые типы необходимы для того, чтобы их можно было хешировать.\n",
    "\n",
    "Первая коллекция которую мы рассмотрим — *кортежи*. Кортежи — неизменяемые упорядоченные последовательности элементов. Для получения кортежа можно просто выражения через запятую:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('HTML', 'CSS', 'JavaScript')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"HTML\", \"CSS\", \"JavaScript\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Также кортежи могут быть заключены в скобки. Для создания кортежа из одного элемента необходимо поставить запятую, даже если мы заключаем его в скобки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('React',)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"React\","
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('Vue',)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(\"Vue\", )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для создания пустого кортежа необходимо поставить скобки:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "()"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Списки — очень близкие родственники кортежей, но они изменяемы. Для создания списка необходимо перечислить его элементы в квадратных скобках через запятую:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[4, 8, 15, 16, 23, 42]\n",
    "['Rust', 'Haskell', 'Racket']\n",
    "[-12, 'Farenheit', 451]\n",
    "[]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Последний пример — создание пустого списка."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для получения количества элементов в коллекции используется функция len:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(['Rust', 'Haskell', 'Racket'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Для добавления элемента в список можно использовать метод append:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['Harris', 'Summerfield', 'Tanenbaum', 'Ritchie']\n"
     ]
    }
   ],
   "source": [
    "x = ['Harris', 'Summerfield']\n",
    "x.append('Tanenbaum')\n",
    "list.append(x, 'Ritchie')\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Как и было сказано выше, у коллекций есть возможность обращаться к элементу по индексу:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Summerfield'"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = ['Harris', 'Summerfield']\n",
    "x[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Логические операторы\n",
    "\n",
    "Оператор тождественности (идентичности), или оператор is, проверяет, являются ли две сущности ссылками на один объект:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "a = [451, \"Farenheit\"]\n",
    "b = [451, \"Farenheit\"]\n",
    "print(a is b)\n",
    "b = a\n",
    "print(a is b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Наиболее распространенный способ использования оператора is — сравнение со встроенным Null-объектом, None:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False True\n"
     ]
    }
   ],
   "source": [
    "a = 100\n",
    "b = None\n",
    "print(a is None, b is None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Операторы сравнения\n",
    "\n",
    "В питоне присутствует вполне обычный набор операторов сравнения:\n",
    "\n",
    "- < — меньше;\n",
    "\n",
    "- <= — меньше или равно;\n",
    "\n",
    "- == — равно;\n",
    "\n",
    "- != — не равно;\n",
    "\n",
    "- \\>= — больше или равно;\n",
    "\n",
    "- \\> — больше."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(True, True, False, False)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "2 < 3, 4 != 16, 1 >= 8, 8 > 12"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Оператор вхождения\n",
    "\n",
    "Для типов данных, которые являются наборами данных, существует проверка на вхождение:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True False True False\n"
     ]
    }
   ],
   "source": [
    "Nebuchadnezzar = ['Neo', 'Trinity', 'Morpheus', 'Mouse',\n",
    "                  'Dozer', 'Tank', 'Cypher', 'Apoc', 'Switch']\n",
    "print('Neo' in Nebuchadnezzar, 'Smith' in Nebuchadnezzar,\n",
    "      'V' in 'Vendetta', 'Я' in 'Команда')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Логические операторы\n",
    "\n",
    "В Python есть следующие логические операторы:\n",
    "\n",
    "- not — логическое НЕ;\n",
    "\n",
    "- or — логическое ИЛИ;\n",
    "\n",
    "- and — логическое И;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True False\n",
      "False True True\n",
      "False False True\n"
     ]
    }
   ],
   "source": [
    "print(not False, not True)\n",
    "print(False or False, False or True, True or True)\n",
    "print(False and False, False and True, True and True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Выражения, контролирующие порядок выполнения программы\n",
    "\n",
    "Конструкции, которые мы изучили на данный момент, хоть и позволяют строить простейшие программы, но все же предоставляют весьма ограниченный инструментарий. Нам необходимы конструкции, которые позволяют анализировать ход выполнения программы и передавать управления тем или иным инструкциям. Сейчас мы рассмотрим ветвление, циклы и исключения.\n",
    "\n",
    "\n",
    "##### Ветвление (if, if-else, if-elif, if-elif-else)\n",
    "\n",
    "Конструкция ветвления if позволяет проверить выполнение условия и, в зависимости от того, является ли утверждение истинным, выполнить тот или иной блок операторов:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Don't worry, everythin is alright!\n"
     ]
    }
   ],
   "source": [
    "if 'PHP' is 'Viable Programming Language':\n",
    "    print('It must be snowing!')\n",
    "else:\n",
    "    print(\"Don't worry, everythin is alright!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Обратите внимание, что вложенный блок отделяется четыремя пробелами. Так в Python форматируются все вложенные блоки, что позволяет писать крайне читаемый код без каких-либо фигурных скобок.\n",
    "\n",
    "Конструкция if предусматривает использование без else. К тому же между if и else можно расположить любое количество elif (сокращенный вариант словосочетания \"else if\"). В таком случае также можно опустить последний else:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I don't know that color!\n"
     ]
    }
   ],
   "source": [
    "color = 'magenta'\n",
    "\n",
    "if color == 'blue':\n",
    "    print('Color is blue!')\n",
    "elif color == 'red':\n",
    "    print('Color is red!')\n",
    "elif color == 'green':\n",
    "    print('Color is green!')\n",
    "else:\n",
    "    print(\"I don't know that color!\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Цикл с предусловием (while)\n",
    "\n",
    "Конструкция while позволяет проверять на истинность некоторое выражение и выполнять некоторый блок кода, пока это выражение является истинным:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100\n"
     ]
    }
   ],
   "source": [
    "i = 1\n",
    "while i < 100:\n",
    "    i += 1\n",
    "print(i)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Итеративный цикл (for ... in ...)\n",
    "\n",
    "Итеративный цикл позволяет проходить все члены некоторой последовательности, например мы задались целью перечислить всех членов экипажа Навуходоносора:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Neo\n",
      "Trinity\n",
      "Morpheus\n",
      "Mouse\n",
      "Dozer\n",
      "Tank\n",
      "Cypher\n",
      "Apoc\n",
      "Switch\n"
     ]
    }
   ],
   "source": [
    "Nebuchadnezzar = ['Neo', 'Trinity', 'Morpheus', 'Mouse',\n",
    "                  'Dozer', 'Tank', 'Cypher', 'Apoc', 'Switch']\n",
    "for crew_member in Nebuchadnezzar:\n",
    "    print(crew_member)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Обработка исключительных ситуаций\n",
    "\n",
    "Python содержит в себе механизм исключений. Это специальный механизм, который позволяет обрабатывать исключительные ситуации, возникающие в ходе выполнения программы не вместе, где эта исключительная ситуация возникла, а там, где нам это удобно. Например, давайте попробуем привести пользовательский ввод к целому числу, а если не получится — сообщим ему, что именно нас не устраивает:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите целое число: 3.1415\n",
      "Не было введено целое число\n",
      "invalid literal for int() with base 10: '3.1415'\n"
     ]
    }
   ],
   "source": [
    "in_s = input(\"Введите целое число: \")\n",
    "try:\n",
    "    i = int(in_s)\n",
    "    print(\"Все верно, введено число \", i)\n",
    "except ValueError as e:\n",
    "    print(\"Не было введено целое число\")\n",
    "    print(e)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Пока остановися на такой базовой обработке исключений. Отметим, что ValueError — специальный класс исключений, предназначений для обработки ошибок значений, передаваемых в некоторую функцию. Более подробно исключения будут рассмотрены позже."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Арифметические операторы\n",
    "\n",
    "Очевидно, в Python есть базовые арифметические операторы:\n",
    "\n",
    "- \\+ — сложение;\n",
    "\n",
    "- \\- — вычитание;\n",
    "\n",
    "- \\* — умножение;\n",
    "\n",
    "- / — деление.\n",
    "\n",
    "К тому же для каждого из этих операторов есть комбинированный оператор присваивания:\n",
    "\n",
    "- += — присваивание с суммированием;\n",
    "\n",
    "- -= — присваивание с вычитанием;\n",
    "\n",
    "- \\*= — присваивание с умножением;\n",
    "\n",
    "- /= — присваивание с делением.\n",
    "\n",
    "Есть и другие арифметические операторы, а также модуль math, содержащий много всего интересного, но пока мы остановимся на этом."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "7\n",
      "3\n",
      "10\n",
      "2.5\n",
      "11\n",
      "7\n",
      "70\n",
      "35.0\n"
     ]
    }
   ],
   "source": [
    "a = 5\n",
    "b = 2\n",
    "\n",
    "print(a + b)\n",
    "print(a - b)\n",
    "print(a * b)\n",
    "print(a / b)\n",
    "\n",
    "a += 6\n",
    "print(a)\n",
    "\n",
    "a -= 4\n",
    "print(a)\n",
    "\n",
    "a *= 10\n",
    "print(a)\n",
    "\n",
    "a /= 2\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Хотелось бы отметить, что в отношении последовательностий операция + имеет смысл \"конкатенации\", а операция * — повторения. Например, рассмотрим на строках:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "I love Python\n",
      "I love Python 3\n",
      "Python Python \n",
      "Python Python Python Python Python Python Python Python Python Python \n"
     ]
    }
   ],
   "source": [
    "s = \"I love \" + \"Python\"\n",
    "print(s)\n",
    "\n",
    "s += \" 3\"\n",
    "print(s)\n",
    "\n",
    "s = \"Python \" * 2\n",
    "print(s)\n",
    "\n",
    "s *= 5\n",
    "print(s)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Ввод и вывод данных\n",
    "\n",
    "Мы уже столкнулись с фукциями input и print, но давайте рассмотрим их подробно. Функция input может вызываться с аргументом или без аргументов. Смысл этого аргумента в том, что это будет строка подсказки при вводе. Например:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Как тебя зовут: Семен\n",
      "Приветствую тебя, Семен!\n"
     ]
    }
   ],
   "source": [
    "name = input('Как тебя зовут: ')\n",
    "print('Приветствую тебя, ' + name + '!')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Функция считает строку с потока чтения, пока не встретит последовательность символов, означающую конец строки или символ конца файла (EOF)\n",
    "\n",
    "Для вывода данных используется функция print, которой передается любое количество аргументов, которые будут приведены к строкам:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "None True False 12 Просто строка ('Кортеж', 'из', '4', 'строк')\n"
     ]
    }
   ],
   "source": [
    "print(None, True, False, 12, 'Просто строка', ('Кортеж', 'из', '4', 'строк'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Написание и вызов функций\n",
    "\n",
    "Функции предназначены для тех ситуациий, когда один и тот же участок программного кода необходимо выполнить, но с разными входными параметрами. Для определения функции используется конструкция def, после нее идет имя функции, потом в скобках ее аргументы и во вложенном блоке тело функции. Соединим все знания, которые мы получили за сегодня и напишем функцию, которая считывает целое число, ввобдимое пользователем. При этом в качестве аргумента мы ей передадим строку-подсказку. Если пользователь не вводит целое число, то мы выведем ему сообщение о том, что это необходимо. Наша функция будет выполняться, пока число не будет получено:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Введите количество дверей в вашем автомобиле: 3\n",
      "Количество дверей равно  3\n"
     ]
    }
   ],
   "source": [
    "def get_int_from_input(message):\n",
    "    while True:\n",
    "        try:\n",
    "            i = input(message)\n",
    "            i = int(i)\n",
    "            return i\n",
    "        except ValueError as e:\n",
    "            print('Не было введено целое число!')\n",
    "            print(e)\n",
    "            \n",
    "doors = get_int_from_input('Введите количество дверей в вашем автомобиле: ')\n",
    "print('Количество дверей равно ', doors)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Обратите внимание, что для возвращения значения из функции используется конструкция return."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Раздел 3. Домашнее задание\n",
    "\n",
    "Прочитать первую главу Саммерфилда, выполнить упражения из нее.\n",
    "\n",
    "Написать игру 'быки и коровы'.\n",
    "\n",
    "Решить [задачу](https://lambda-it.ru/post/20).\n",
    "\n",
    "Почитать на вики про циклы, рекурсию.\n",
    "\n",
    "Найти информацию о классификациях языков программирования.\n",
    "\n",
    "Поискать сравнительный анализ интерпретируемых, частично-интерпретируемых и компилируемых языков программирования.\n",
    "\n",
    "Прочитать [PEP 8](https://www.python.org/dev/peps/pep-0008/?)\n",
    "\n",
    "Дойти до нашего Slack. Задавать все вопросы мне, либо своим пирам (товарищам, проходящим этот курс), либо просто в канале #python. Не согласен с чем-то — напиши мне. Хочешь помочь — тоже пиши."
   ]
  }
 ],
 "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.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}