{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cell-0",
   "metadata": {},
   "source": [
    "# Повторение уроков 1-3\n",
    "## 15 практических задач\n",
    "\n",
    "**Темы:**\n",
    "- Урок 1: типы, ввод, условия\n",
    "- Урок 2: циклы, списки, срезы\n",
    "- Урок 3: tuple/set/dict, функции, *args/**kwargs, lambda\n",
    "\n",
    "**Как решать:** замените `pass` на код, нажмите Shift+Enter."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sec-1",
   "metadata": {},
   "source": [
    "---\n",
    "# Раздел 1. Урок 1: типы и условия"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t1-md",
   "metadata": {},
   "source": [
    "## Задание 1. Конвертация температуры\n",
    "\n",
    "Дано значение в Цельсиях. Переведите в Фаренгейты по формуле `F = C * 9/5 + 32` и выведите с двумя знаками после запятой.\n",
    "\n",
    "Подсказка: `f\"{value:.2f}\"`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "t1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25.0C=77.0F\n"
     ]
    }
   ],
   "source": [
    "c = 25.0\n",
    "\n",
    "f=c*9/5+32\n",
    "\n",
    "print(f'{c}C={f}F')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t2-md",
   "metadata": {},
   "source": [
    "## Задание 2. Калькулятор скидки\n",
    "\n",
    "Дана цена товара и категория (`\"vip\"`, `\"regular\"`, `\"new\"`). Выведите итог:\n",
    "- VIP: скидка 20%\n",
    "- regular: скидка 10%\n",
    "- new: без скидки\n",
    "- иначе: \"неизвестная категория\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "t2",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "vip: 800.0\n",
      "regular: 900.0\n",
      "new: 1000\n",
      "unknown: weqweq\n"
     ]
    }
   ],
   "source": [
    "price = 1000\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "categories= ['vip', 'regular', 'new', 'unknown']\n",
    "\n",
    "for category in categories:\n",
    "    if category == 'vip':\n",
    "        total = price*0.8\n",
    "    elif category == 'regular':\n",
    "        total = price*0.9\n",
    "    elif category == 'new':\n",
    "        total = price*1\n",
    "    else:\n",
    "        total = 'weqweq' \n",
    "    print(f'{category}: {total}')  \n",
    "        \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "13ace9ff",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "t3-md",
   "metadata": {},
   "source": [
    "## Задание 3. Оценка по баллам\n",
    "\n",
    "Дан балл от 0 до 100. Выведите оценку:\n",
    "- 90-100: \"A\"\n",
    "- 75-89:  \"B\"\n",
    "- 60-74:  \"C\"\n",
    "- 0-59:   \"F\"\n",
    "- иначе:  \"некорректный балл\"\n",
    "\n",
    "Проверьте: 95, 75, 60, 40, 150."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "t3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "95=A\n",
      "75=B\n",
      "60=C\n",
      "40=F\n",
      "150=Некоректный балл\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "scores = [95,75,60,40,150]\n",
    "\n",
    "\n",
    "def grade(score):\n",
    "    if 90 <= score <= 100:\n",
    "        return \"A\"\n",
    "    elif 75 <= score < 90:\n",
    "        return 'B'\n",
    "    elif 60 <= score < 75:\n",
    "        return 'C'\n",
    "    elif 0 <= score < 60:\n",
    "        return 'F'\n",
    "    else:\n",
    "        return 'Некоректный балл'\n",
    "    \n",
    "for i in scores:\n",
    "    print(f'{i}={grade(i)}')\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "3a4575eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'A'"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grade(95)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sec-2",
   "metadata": {},
   "source": [
    "---\n",
    "# Раздел 2. Урок 2: циклы и списки"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t4-md",
   "metadata": {},
   "source": [
    "## Задание 4. Сумма чисел от 1 до n\n",
    "\n",
    "Дано `n`. Посчитайте сумму чисел от 1 до n включительно через цикл (без `sum()`).\n",
    "m\n",
    "Проверьте: для n=100 ответ 5050."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b3fd8118",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "t4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5050\n"
     ]
    }
   ],
   "source": [
    "n=100\n",
    "\n",
    "total=0\n",
    "\n",
    "for i in range(1,n+1):\n",
    "    total += i   # total = total + i\n",
    "print(total)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t5-md",
   "metadata": {},
   "source": [
    "## Задание 5. Реверс списка через срез\n",
    "\n",
    "Дан список. Получите его реверс одной строкой через срез `[::-1]`.\n",
    "\n",
    "```python\n",
    "items = [\"a\", \"b\", \"c\", \"d\", \"e\"]\n",
    "# Ожидаемо: ['e', 'd', 'c', 'b', 'a']\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['e', 'd', 'c', 'b', 'a']"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "items = [\"a\", \"b\", \"c\", \"d\", \"e\"]\n",
    "\n",
    "\n",
    "items[::-1]\n",
    "\n",
    "# items[start end очередность]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t6-md",
   "metadata": {},
   "source": [
    "## Задание 6. Удалить дубликаты с сохранением порядка\n",
    "\n",
    "Дан список с повторами. Получите список уникальных значений в порядке первого появления.\n",
    "\n",
    "```python\n",
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n",
    "# Ожидаемо: [1, 3, 2, 4, 5]\n",
    "```m\n",
    "\n",
    "Подсказка: используйте цикл и вспомогательный `set`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0aded962",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "586b2ac7",
   "metadata": {},
   "outputs": [],
   "source": [
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dd163f23",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 3, 2, 4, 5]\n"
     ]
    }
   ],
   "source": [
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n",
    "\n",
    "unique = []\n",
    "seen = set() # {1,2,3,4,5}\n",
    "\n",
    "for i in items:\n",
    "    if i not in seen:   # 1 -> seen {1}\n",
    "        seen.add(i)\n",
    "        unique.append(i)\n",
    "\n",
    "print(unique)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "b74573e4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 2, 3, 4, 5]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(set(items))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df8ae04e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d0b8652",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "91aabccd",
   "metadata": {},
   "outputs": [],
   "source": [
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n",
    "\n",
    "unique = []\n",
    "seen = set() # {1,2,3,4,5}\n",
    "\n",
    "\n",
    "# 1 iteration\n",
    "for i in items:\n",
    "    if i not in seen:  # i=1 -> seen = {} -> seen={1} unique=[1]\n",
    "        seen.add(i)\n",
    "        unique.append(i)\n",
    "\n",
    "print(unique)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4e99b734",
   "metadata": {},
   "outputs": [],
   "source": [
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n",
    "\n",
    "\n",
    "senn = {1,3}\n",
    "# 3 iteration\n",
    "for i in items:\n",
    "    if i not in seen:  # i=1 -> seen = {1,3} ->  \n",
    "        seen.add(i) #break\n",
    "        unique.app # break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "17681ce8",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "723d8067",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e22e95a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "1c5a87df",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1, 2, 3, 4, 5}"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "unique"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t6",
   "metadata": {},
   "outputs": [],
   "source": [
    "items = [1, 3, 1, 2, 3, 4, 2, 5]\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sec-3",
   "metadata": {},
   "source": [
    "\n",
    "---m\n",
    "# Раздел 3. Урок 3: tuple, set, dict"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t7-md",
   "metadata": {},
   "source": [
    "## Задание 7. Уникальные слова\n",
    "\n",
    "Дана строка. Посчитайте количество уникальных слов (без учёта регистра).\n",
    "\n",
    "```python\n",
    "text = \"Python is great Python is fun and Python is fast\"\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "t7",
   "metadata": {},
   "outputs": [],
   "source": [
    "text = \"Python is great Python is fun and Python is fast\"\n",
    "\n",
    "words = text.lower().split()\n",
    "unique_words = set(words)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t8-md",
   "metadata": {},
   "source": [
    "## Задание 8. Частота букв\n",
    "\n",
    "Дано слово. Постройте словарь `{буква: количество}`. Регистр не учитывать.\n",
    "\n",
    "```python\n",
    "word = \"programming\"\n",
    "# Ожидаемо: {'p': 1, 'r': 2, 'o': 1, 'g': 2, 'a': 1, 'm': 2, 'i': 1, 'n': 1}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t8",
   "metadata": {},
   "outputs": [],
   "source": [
    "word = \"programming\"\n",
    "\n",
    "letterCounter = {}\n",
    "\n",
    "for c in word.lower():\n",
    "     letterCounter[c] = letterCounter.get(c, 0) + 1\n",
    "print(letterCounter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "6f43c0fc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'p': 1, 'r': 2, 'o': 1, 'g': 7, 'a': 1, 'm': 2, 'i': 1, 'n': 4}\n"
     ]
    }
   ],
   "source": [
    "word = \"programminnnngggggg\"\n",
    "\n",
    "letterCounter={}\n",
    "\n",
    "for c in word.lower():\n",
    "    letterCounter[c] = letterCounter.get(c, 0) + 1   # total = total + i \n",
    "print(letterCounter)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "eaddce6d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "p\n",
      "r\n",
      "o\n",
      "g\n",
      "r\n",
      "a\n",
      "m\n",
      "m\n",
      "i\n",
      "n\n",
      "g\n",
      "g\n"
     ]
    }
   ],
   "source": [
    "word = \"programmingg\"\n",
    "\n",
    "for i in word.lower():\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e82e4907",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5050\n"
     ]
    }
   ],
   "source": [
    "n=100\n",
    "\n",
    "total=0\n",
    "\n",
    "for i in range(1,n+1):\n",
    "    total = 1 + 2\n",
    "print(total)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d17ab3d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "n = 100\n",
    "\n",
    "total = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f6f2a6a6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "480bfb3b",
   "metadata": {},
   "outputs": [],
   "source": [
    "n=100\n",
    "\n",
    "total=0\n",
    "\n",
    "for i in range(1,n+1):\n",
    "    total += i   # total = total + i\n",
    "print(total)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t9-md",
   "metadata": {},
   "source": [
    "## Задание 9. Пересечение интересов\n",
    "\n",
    "Даны интересы двух пользователей. Найдите:\n",
    "- общие (`&`)\n",
    "- только у первого (`-`)\n",
    "- всё вместе (`|`)\n",
    "\n",
    "```python\n",
    "anya  = {\"python\", \"sql\", \"git\", \"docker\"}\n",
    "boris = {\"python\", \"java\", \"git\", \"linux\"}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t9",
   "metadata": {},
   "outputs": [],
   "source": [
    "anya  = {\"python\", \"sql\", \"git\", \"docker\"}\n",
    "boris = {\"python\", \"java\", \"git\", \"linux\"}\n",
    "\n",
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sec-4",
   "metadata": {},
   "source": [
    "---\n",
    "# Раздел 4. Урок 3: функции, *args, **kwargs, lambda"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t10-md",
   "metadata": {},
   "source": [
    "## Задание 10. Средний балл через *args\n",
    "\n",
    "Напишите функцию `avg(*scores)`, возвращающую среднее. Если аргументов нет - вернуть `0`.\n",
    "\n",
    "```python\n",
    "avg(85, 72, 91)   # 82.666...\n",
    "avg()             # 0\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t10",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t11-md",
   "metadata": {},
   "source": [
    "## Задание 11. CSV-строка через **kwargs\n",
    "\n",
    "Напишите функцию `to_csv_row(**fields)`, которая возвращает строку вида `key1=val1,key2=val2,...`.\n",
    "\n",
    "```python\n",
    "to_csv_row(name=\"Аня\", age=30, city=\"Ташкент\")\n",
    "# 'name=Аня,age=30,city=Ташкент'\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t11",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t12-md",
   "metadata": {},
   "source": [
    "## Задание 12. Группировка слов по длине\n",
    "\n",
    "Напишите функцию `group_by_len(words)`, возвращающую `{длина: [слова данной длины]}`.\n",
    "\n",
    "```python\n",
    "words = [\"sun\", \"moon\", \"sky\", \"star\", \"cloud\", \"rain\", \"snow\"]\n",
    "# {3: ['sun', 'sky'], 4: ['moon', 'star', 'rain', 'snow'], 5: ['cloud']}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t12",
   "metadata": {},
   "outputs": [],
   "source": [
    "words = [\"sun\", \"moon\", \"sky\", \"star\", \"cloud\", \"rain\", \"snow\"]\n",
    "\n",
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "sec-5",
   "metadata": {},
   "source": [
    "---\n",
    "# Раздел 5. Финальные задачи"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t13-md",
   "metadata": {},
   "source": [
    "## Задание 13. Топ-N студентов\n",
    "\n",
    "Дан словарь `{имя: балл}`. Напишите `top_n(scores, n=3)`, возвращающий список пар `(имя, балл)` по убыванию баллов.\n",
    "\n",
    "```python\n",
    "scores = {\"Аня\": 85, \"Боря\": 72, \"Вика\": 91, \"Глеб\": 68, \"Дима\": 88}\n",
    "top_n(scores, 3)\n",
    "# [('Вика', 91), ('Дима', 88), ('Аня', 85)]\n",
    "```\n",
    "\n",
    "Подсказка: `sorted(...)` + `lambda` + срез `[:n]`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t13",
   "metadata": {},
   "outputs": [],
   "source": [
    "scores = {\"Аня\": 85, \"Боря\": 72, \"Вика\": 91, \"Глеб\": 68, \"Дима\": 88}\n",
    "\n",
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t14-md",
   "metadata": {},
   "source": [
    "## Задание 14. Парсер CSV-строк\n",
    "\n",
    "Дан список строк формата `\"имя,возраст,город\"`. Постройте список словарей. Возраст - `int`, остальное - строки.\n",
    "\n",
    "```python\n",
    "rows = [\n",
    "    \"Аня,30,Ташкент\",\n",
    "    \"Боря,25,Самарканд\",\n",
    "]\n",
    "# [{'name': 'Аня', 'age': 30, 'city': 'Ташкент'}, ...]\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t14",
   "metadata": {},
   "outputs": [],
   "source": [
    "rows = [\n",
    "    \"Аня,30,Ташкент\",\n",
    "    \"Боря,25,Самарканд\",\n",
    "    \"Вика,28,Бухара\",\n",
    "]\n",
    "\n",
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "t15-md",
   "metadata": {},
   "source": [
    "## Задание 15. Анализатор оценок (финал)\n",
    "\n",
    "Напишите функцию `analyze(students, passing=60)`. Принимает список словарей `{\"name\": str, \"score\": int}`, возвращает статистику:\n",
    "\n",
    "- `total` - всего студентов\n",
    "- `passed` - сколько сдало (`score >= passing`)\n",
    "- `failed` - сколько не сдало\n",
    "- `avg_passed` - средний балл по сдавшим (или 0)\n",
    "- `top` - имя лучшего (или `None`, если список пуст)\n",
    "\n",
    "Здесь работают все темы: цикл, условие, dict, list, функция, default, lambda, max."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "t15",
   "metadata": {},
   "outputs": [],
   "source": [
    "students = [\n",
    "    {\"name\": \"Аня\",  \"score\": 85},\n",
    "    {\"name\": \"Боря\", \"score\": 42},\n",
    "    {\"name\": \"Вика\", \"score\": 91},\n",
    "    {\"name\": \"Глеб\", \"score\": 58},\n",
    "    {\"name\": \"Дима\", \"score\": 73},\n",
    "]\n",
    "\n",
    "# Ваш код здесь\n",
    "pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cell-final",
   "metadata": {},
   "source": [
    "---\n",
    "## Что дальше\n",
    "\n",
    "Если все 15 задач решены - готовы к **уроку 4** (ООП)."
   ]
  }
 ],
 "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.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
