/
disciplina
/
stepik-python-debugging
Обзор
Документация
Войти
/
disciplina
/
stepik-python-debugging
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
lessons/module2/2.1/lesson2.step
18 строк
11 KB
Sergey
Вторая версия курса
27 янв 2026, 21:14
27 янв 2026, 21:14
79b9655
Код
Авторство
О чём код?
{ "block": { "name": "text", "text": "<h2>Практика: Отладка программы сортировки данных</h2>\n\n<p>В этом уроке мы будем отлаживать программу, которая сортирует входные данные (строки и числа), но работает некорректно.</p>\n\n<h3>Исходный код программы</h3>\n\n<pre><code>import sys\n\ndef parse_input(data):\n \"\"\"Парсит входные данные и преобразует числа в int\"\"\"\n result = []\n for item in data:\n item = item.strip()\n if item.isdigit():\n result.append(item) # ОШИБКА: не преобразуем в int!\n else:\n result.append(item)\n return result\n\ndef sort_data(items):\n \"\"\"Сортирует элементы: сначала числа, потом строки\"\"\"\n numbers = []\n strings = []\n \n for item in items:\n if isinstance(item, int):\n numbers.append(item)\n else:\n strings.append(item)\n \n # Сортируем числа и строки отдельно\n numbers.sort()\n strings.sort()\n \n return numbers + strings\n\ndef main():\n print(\"Введите данные для сортировки (числа и строки, по одному на строку)\")\n print(\"Для завершения ввода введите пустую строку\")\n print()\n \n data = []\n while True:\n line = input(\"> \")\n if line == \"\":\n break\n data.append(line)\n \n if not data:\n print(\"Нет данных для сортировки\")\n return\n \n # Парсим и сортируем\n parsed = parse_input(data)\n sorted_data = sort_data(parsed)\n \n print(\"\\nОтсортированные данные:\")\n for item in sorted_data:\n print(f\" {item} (тип: {type(item).__name__})\")\n\nif __name__ == \"__main__\":\n main()\n</code></pre>\n\n<h3>Описание проблемы</h3>\n\n<p>Программа должна:</p>\n<ol>\n<li>Принимать входные данные (числа и строки)</li>\n<li>Преобразовывать числовые строки в числа</li>\n<li>Сортировать: сначала числа по возрастанию, затем строки в алфавитном порядке</li>\n</ol>\n\n<p><strong>Ожидаемое поведение:</strong></p>\n<pre><code>Введите данные для сортировки (числа и строки, по одному на строку)\nДля завершения ввода введите пустую строку\n\n> 100\n> apple\n> 5\n> banana\n> 42\n> zebra\n> \n\nОтсортированные данные:\n 5 (тип: int)\n 42 (тип: int)\n 100 (тип: int)\n apple (тип: str)\n banana (тип: str)\n zebra (тип: str)\n</code></pre>\n\n<p><strong>Фактическое поведение:</strong></p>\n<pre><code>Введите данные для сортировки (числа и строки, по одному на строку)\nДля завершения ввода введите пустую строку\n\n> 100\n> apple\n> 5\n> banana\n> 42\n> zebra\n> \n\nОтсортированные данные:\n 100 (тип: str) ← Должно быть int!\n 42 (тип: str)\n 5 (тип: str)\n apple (тип: str)\n banana (тип: str)\n zebra (тип: str)\n</code></pre>\n\n<p>Числа остаются строками и сортируются лексикографически (как строки), а не численно!</p>\n\n<h3>Задание для отладки</h3>\n\n<h4>Шаг 1: Добавьте точки останова</h4>\n<p>Добавьте <code>breakpoint()</code> в двух местах:</p>\n\n<pre><code>def parse_input(data):\n result = []\n for item in data:\n item = item.strip()\n breakpoint() # Точка 1: проверим, что происходит с данными\n if item.isdigit():\n result.append(item)\n else:\n result.append(item)\n return result\n\ndef sort_data(items):\n numbers = []\n strings = []\n \n breakpoint() # Точка 2: проверим, что мы получили на вход\n \n for item in items:\n # ...\n</code></pre>\n\n<h4>Шаг 2: Запустите программу и введите тестовые данные</h4>\n<pre><code>python sort_data.py\n</code></pre>\n\n<p>Введите данные:</p>\n<pre><code>> 100\n> apple\n> 5\n> \n</code></pre>\n\n<h4>Шаг 3: Отладка в первой точке останова</h4>\n<p>Программа остановится в <code>parse_input</code>:</p>\n<pre><code>(Pdb) p item # Проверяем текущий элемент\n'100'\n(Pdb) p item.isdigit() # Проверяем, распознаётся ли как число\nTrue\n(Pdb) n # Переходим в блок if\n(Pdb) n # Выполняем append\n(Pdb) p result # Смотрим, что добавилось\n['100'] # Это строка, а не число!\n(Pdb) whatis result[-1] # Проверяем тип\n<class 'str'> # ПРОБЛЕМА: должен быть int!\n</code></pre>\n\n<h4>Шаг 4: Найдите ошибку в parse_input</h4>\n<p>В функции <code>parse_input</code> мы проверяем <code>item.isdigit()</code>, но добавляем <code>item</code> как есть (строку), вместо того чтобы преобразовать в <code>int</code>!</p>\n\n<pre><code>if item.isdigit():\n result.append(item) # ОШИБКА: должно быть int(item)\n</code></pre>\n\n<h3>Исправление</h3>\n\n<p>Преобразуйте строку в число:</p>\n<pre><code>def parse_input(data):\n result = []\n for item in data:\n item = item.strip()\n if item.isdigit():\n result.append(int(item)) # ИСПРАВЛЕНО: преобразуем в int\n else:\n result.append(item)\n return result\n</code></pre>\n\n<h3>Дополнительная проблема: что, если число отрицательное?</h3>\n\n<p>Метод <code>isdigit()</code> вернёт <code>False</code> для отрицательных чисел:</p>\n<pre><code>>>> \"-5\".isdigit()\nFalse\n</code></pre>\n\n<p><strong>Улучшенное решение:</strong></p>\n<pre><code>def parse_input(data):\n result = []\n for item in data:\n item = item.strip()\n try:\n # Пытаемся преобразовать в число\n result.append(int(item))\n except ValueError:\n # Если не получилось — это строка\n result.append(item)\n return result\n</code></pre>\n\n<h3>Полный исправленный код</h3>\n\n<pre><code>import sys\n\ndef parse_input(data):\n \"\"\"Парсит входные данные и преобразует числа в int\"\"\"\n result = []\n for item in data:\n item = item.strip()\n try:\n result.append(int(item)) # ИСПРАВЛЕНО\n except ValueError:\n result.append(item)\n return result\n\ndef sort_data(items):\n \"\"\"Сортирует элементы: сначала числа, потом строки\"\"\"\n numbers = []\n strings = []\n \n for item in items:\n if isinstance(item, int):\n numbers.append(item)\n else:\n strings.append(item)\n \n numbers.sort()\n strings.sort()\n \n return numbers + strings\n\ndef main():\n print(\"Введите данные для сортировки (числа и строки, по одному на строку)\")\n print(\"Для завершения ввода введите пустую строку\")\n print()\n \n data = []\n while True:\n line = input(\"> \")\n if line == \"\":\n break\n data.append(line)\n \n if not data:\n print(\"Нет данных для сортировки\")\n return\n \n parsed = parse_input(data)\n sorted_data = sort_data(parsed)\n \n print(\"\\nОтсортированные данные:\")\n for item in sorted_data:\n print(f\" {item} (тип: {type(item).__name__})\")\n\nif __name__ == \"__main__\":\n main()\n</code></pre>\n\n<h3>Что мы узнали</h3>\n\n<ul>\n<li>✅ Как использовать множественные точки останова для отслеживания потока данных</li>\n<li>✅ Как проверять типы переменных с помощью <code>whatis</code></li>\n<li>✅ Важность явного преобразования типов данных</li>\n<li>✅ Как улучшить обработку ошибок с помощью <code>try-except</code></li>\n<li>✅ Разница между <code>isdigit()</code> и полноценным парсингом чисел</li>\n</ul>\n\n<h3>Типы ошибок, найденных в этом уроке</h3>\n\n<ol>\n<li><strong>Ошибка преобразования типов</strong> — забыли преобразовать строку в число</li>\n<li><strong>Неполная валидация</strong> — <code>isdigit()</code> не обрабатывает отрицательные числа</li>\n<li><strong>Отсутствие обработки исключений</strong> — использование <code>try-except</code> делает код надёжнее</li>\n</ol>\n\n<h3>Практические советы</h3>\n\n<ul>\n<li>🔍 При работе с типами данных всегда проверяйте фактический тип с помощью <code>type()</code> или <code>whatis</code></li>\n<li>🔍 Используйте точки останова для отслеживания преобразования данных</li>\n<li>🔍 Тестируйте граничные случаи (отрицательные числа, пустые строки, специальные символы)</li>\n</ul>\n\n<p>Поздравляем! Вы завершили модуль по отладке консольных приложений. Теперь вы знаете, как эффективно использовать pdb для поиска и исправления ошибок в Python-программах.</p>", "video": null, "options": {}, "subtitle_files": [], "is_deprecated": false, "source": {}, "subtitles": {}, "tests_archive": null, "feedback_correct": "", "feedback_wrong": "" }, "id": null, "has_review": false, "time": "2026-01-27T00:00:00.000Z" }