{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "c8270781",
   "metadata": {},
   "source": [
    "# Пример. Пишем программу #"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "055a2af7",
   "metadata": {},
   "source": [
    "Сейчас давайте попробуем обобщить все, что мы прошли и напишем небольшую программку.\n",
    "\n",
    "Суть ее сводится к тому, что по нашему IP-адресу мы хотим получить информацию о нашем местоположении. При этом мы пройдем все шаги с начала, используя виртуальное окружение и давайте займемся этим.\n",
    "\n",
    "В Интернете есть замечательный ресурс - `ip-api.com`, который по нашему IP-адресу позволяет посмотреть информацию о нашем местоположении. Доступна эта информация по адресу `ip-api.com/json/`. Мы эту информацию сейчас получим с помощью Python и напечатаем на экран.\n",
    "\n",
    "```json\n",
    "{\n",
    "  \"query\": \"192.168.0.1\",\n",
    "  \"status\": \"success\",\n",
    "  \"countryCode\": \"RU\",\n",
    "  \"country\": \"Russia\",\n",
    "  \"region\": \"CHE\",\n",
    "  \"regionName\": \"Chelyabinsk Oblast\",\n",
    "  \"city\": \"Snezhinsk\",\n",
    "  \"zip\": \"456770\",\n",
    "  \"lat\": 56.0855106,\n",
    "  \"lon\": 60.7314472,\n",
    "  \"timezone\": \"Asia/Yekaterinburg\"\n",
    "}\n",
    "```\n",
    "\n",
    "Обратите внимание, что здесь есть как раз информация о нашей стране. В зависимости от вашего IP-адреса здесь также может присутствовать и другая информация, вплоть до вашего города, например. Она будет содержаться в поле `city`.\n",
    "\n",
    "Давайте начнем. Первое что мы сделаем - это создадим директорию, в которой будем работать. Назовем ее также как всегда - `playground`, перейдем в нее и теперь мы можем создать в ней виртуальное окружение `python3 -m venv` и название директории, в которой будет создаваться наше виртуальное окружение. Как только виртуальное окружение создано, мы можем его активировать.\n",
    "\n",
    "```shell\n",
    ". env/bin/activate\n",
    "```\n",
    "\n",
    "Обратите внимание, что точка - это замена команды `source`, которую я показывал ранее. Виртуальное окружение создано, и мы можем установить пакет. Мы установим пакет `requests`. Это библиотека, как я уже говорил, для работы с `http` запросами, причем очень удобная библиотека, которой пользуются практически все питонисты для работы с `http`.\n",
    "\n",
    "Все успешно установлено. Давайте начнем программировать. Назовем наш файлик `location.py`. Первое, что мы сделаем, это сделаем `import requests`, который мы будем использовать.\n",
    "\n",
    "Далее мы хотим чтобы наша программка работала только тогда, когда мы ее запускаем интерпретатором Python, то есть нам нужно написать конструкцию `if __name__ == \"__main__\":`. Внутри этой конструкции мы напечатаем на экран результат выполнения нашей функции, которая будет называться `get_location_info`.\n",
    "\n",
    "Конечно же нам нужно объявить саму эту функцию. Напомню, что про функции мы вам будем рассказывать более подробно в дальнейшем. В одну строчку мы получим данные с сайта `ip-api.com`, используя библиотеку `requests`. У `requests` есть метод `get` для того, чтобы сделать `get http` запрос, то есть то как мы открывали эту страничку в браузере.\n",
    "\n",
    "Давайте скопируем адрес, вставим его. Также есть метод `json`, который позволит текст, который возвращается, когда мы запрашиваем этот адрес в формате `json` преобразовать во внутреннее представление в Python. В нашем случае этот `json` будет преобразован в словарь. Словарь - это структура данных, которая встроена в язык и про нее мы также будем рассказывать в дальнейшем. В принципе, все готово.\n",
    "\n",
    "```python\n",
    "import requests\n",
    "\n",
    "def get_location_info():\n",
    "    return requests.get(\"http://ip-api.com/json/\").json()\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    print(get_location_info())\n",
    "```\n",
    "\n",
    "Теперь мы можем запустить нашу программу - `python location.py`. Мы получили эти данные. Все очень быстро, все очень удобно, в одну строчку практически решение. Однако, давайте посмотрим на код. Что здесь не хватает? Конечно же, у нас может отсутствовать Интернет соединение, либо сайт `ip-api.com` может быть недоступен. В таком случае упадет ошибка. Ошибки мы в этой программе не обрабатываем. Однако, на практике, чтобы писать хороший код, вы должны обрабатывать все возможные исключения, которые могут произойти. Этому я вас буду учить в следующих лекциях."
   ]
  }
 ],
 "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.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
