[{"data":1,"prerenderedAt":785},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fpython\u002Fst10":386,"\u002Fblog\u002Fpython\u002Fst10-surround":780},[4],{"title":5,"path":6,"stem":7,"children":8,"page":114},"Blog","\u002Fblog","blog",[9,115,184,329],{"title":10,"path":11,"stem":12,"children":13,"page":114},"Ege","\u002Fblog\u002Fege","blog\u002Fege",[14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86,90,94,98,102,106,110],{"title":15,"path":16,"stem":17},"ЕГЭ Задание 1","\u002Fblog\u002Fege\u002Ftask1","blog\u002Fege\u002Ftask1",{"title":19,"path":20,"stem":21},"ЕГЭ Задание 10","\u002Fblog\u002Fege\u002Ftask10","blog\u002Fege\u002Ftask10",{"title":23,"path":24,"stem":25},"ЕГЭ Задание 11","\u002Fblog\u002Fege\u002Ftask11","blog\u002Fege\u002Ftask11",{"title":27,"path":28,"stem":29},"ЕГЭ Задание 12","\u002Fblog\u002Fege\u002Ftask12","blog\u002Fege\u002Ftask12",{"title":31,"path":32,"stem":33},"ЕГЭ Задание 13","\u002Fblog\u002Fege\u002Ftask13","blog\u002Fege\u002Ftask13",{"title":35,"path":36,"stem":37},"ЕГЭ Задание 14","\u002Fblog\u002Fege\u002Ftask14","blog\u002Fege\u002Ftask14",{"title":39,"path":40,"stem":41},"ЕГЭ Задание 15","\u002Fblog\u002Fege\u002Ftask15","blog\u002Fege\u002Ftask15",{"title":43,"path":44,"stem":45},"ЕГЭ Задание 16","\u002Fblog\u002Fege\u002Ftask16","blog\u002Fege\u002Ftask16",{"title":47,"path":48,"stem":49},"ЕГЭ Задание 17","\u002Fblog\u002Fege\u002Ftask17","blog\u002Fege\u002Ftask17",{"title":51,"path":52,"stem":53},"ЕГЭ Задание 18","\u002Fblog\u002Fege\u002Ftask18","blog\u002Fege\u002Ftask18",{"title":55,"path":56,"stem":57},"ЕГЭ Задание 19, 20, 21","\u002Fblog\u002Fege\u002Ftask19_20_21","blog\u002Fege\u002Ftask19_20_21",{"title":59,"path":60,"stem":61},"ЕГЭ Задание 2","\u002Fblog\u002Fege\u002Ftask2","blog\u002Fege\u002Ftask2",{"title":63,"path":64,"stem":65},"ЕГЭ Задание 22","\u002Fblog\u002Fege\u002Ftask22","blog\u002Fege\u002Ftask22",{"title":67,"path":68,"stem":69},"ЕГЭ Задание 23","\u002Fblog\u002Fege\u002Ftask23","blog\u002Fege\u002Ftask23",{"title":71,"path":72,"stem":73},"ЕГЭ Задание 24","\u002Fblog\u002Fege\u002Ftask24","blog\u002Fege\u002Ftask24",{"title":75,"path":76,"stem":77},"ЕГЭ Задание 25","\u002Fblog\u002Fege\u002Ftask25","blog\u002Fege\u002Ftask25",{"title":79,"path":80,"stem":81},"ЕГЭ Задание 26","\u002Fblog\u002Fege\u002Ftask26","blog\u002Fege\u002Ftask26",{"title":83,"path":84,"stem":85},"ЕГЭ Задание 27","\u002Fblog\u002Fege\u002Ftask27","blog\u002Fege\u002Ftask27",{"title":87,"path":88,"stem":89},"ЕГЭ Задание 3","\u002Fblog\u002Fege\u002Ftask3","blog\u002Fege\u002Ftask3",{"title":91,"path":92,"stem":93},"ЕГЭ Задание 4","\u002Fblog\u002Fege\u002Ftask4","blog\u002Fege\u002Ftask4",{"title":95,"path":96,"stem":97},"ЕГЭ Задание 5","\u002Fblog\u002Fege\u002Ftask5","blog\u002Fege\u002Ftask5",{"title":99,"path":100,"stem":101},"ЕГЭ Задание 6","\u002Fblog\u002Fege\u002Ftask6","blog\u002Fege\u002Ftask6",{"title":103,"path":104,"stem":105},"ЕГЭ Задание 7","\u002Fblog\u002Fege\u002Ftask7","blog\u002Fege\u002Ftask7",{"title":107,"path":108,"stem":109},"ЕГЭ Задание 8","\u002Fblog\u002Fege\u002Ftask8","blog\u002Fege\u002Ftask8",{"title":111,"path":112,"stem":113},"ЕГЭ Задание 9","\u002Fblog\u002Fege\u002Ftask9","blog\u002Fege\u002Ftask9",false,{"title":116,"path":117,"stem":118,"children":119,"page":114},"Oge","\u002Fblog\u002Foge","blog\u002Foge",[120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180],{"title":121,"path":122,"stem":123},"ОГЭ Задание 1","\u002Fblog\u002Foge\u002Ftask1","blog\u002Foge\u002Ftask1",{"title":125,"path":126,"stem":127},"ОГЭ Задание 10","\u002Fblog\u002Foge\u002Ftask10","blog\u002Foge\u002Ftask10",{"title":129,"path":130,"stem":131},"ОГЭ Задание 11","\u002Fblog\u002Foge\u002Ftask11","blog\u002Foge\u002Ftask11",{"title":133,"path":134,"stem":135},"ОГЭ Задание 12","\u002Fblog\u002Foge\u002Ftask12","blog\u002Foge\u002Ftask12",{"title":137,"path":138,"stem":139},"ОГЭ Задание 13","\u002Fblog\u002Foge\u002Ftask13","blog\u002Foge\u002Ftask13",{"title":141,"path":142,"stem":143},"ОГЭ Задание 14","\u002Fblog\u002Foge\u002Ftask14","blog\u002Foge\u002Ftask14",{"title":145,"path":146,"stem":147},"ОГЭ Задание 15","\u002Fblog\u002Foge\u002Ftask15","blog\u002Foge\u002Ftask15",{"title":149,"path":150,"stem":151},"ОГЭ Задание 16","\u002Fblog\u002Foge\u002Ftask16","blog\u002Foge\u002Ftask16",{"title":153,"path":154,"stem":155},"ОГЭ Задание 2","\u002Fblog\u002Foge\u002Ftask2","blog\u002Foge\u002Ftask2",{"title":157,"path":158,"stem":159},"ОГЭ Задание 3","\u002Fblog\u002Foge\u002Ftask3","blog\u002Foge\u002Ftask3",{"title":161,"path":162,"stem":163},"ОГЭ Задание 4","\u002Fblog\u002Foge\u002Ftask4","blog\u002Foge\u002Ftask4",{"title":165,"path":166,"stem":167},"ОГЭ Задание 5","\u002Fblog\u002Foge\u002Ftask5","blog\u002Foge\u002Ftask5",{"title":169,"path":170,"stem":171},"ОГЭ Задание 6","\u002Fblog\u002Foge\u002Ftask6","blog\u002Foge\u002Ftask6",{"title":173,"path":174,"stem":175},"ОГЭ Задание 7","\u002Fblog\u002Foge\u002Ftask7","blog\u002Foge\u002Ftask7",{"title":177,"path":178,"stem":179},"ОГЭ Задание 8","\u002Fblog\u002Foge\u002Ftask8","blog\u002Foge\u002Ftask8",{"title":181,"path":182,"stem":183},"ОГЭ Задание 9","\u002Fblog\u002Foge\u002Ftask9","blog\u002Foge\u002Ftask9",{"title":185,"path":186,"stem":187,"children":188,"page":114},"Python","\u002Fblog\u002Fpython","blog\u002Fpython",[189,193,197,201,205,209,213,217,221,225,229,233,237,241,245,249,253,257,261,265,269,273,277,281,285,289,293,297,301,305,309,313,317,321,325],{"title":190,"path":191,"stem":192},"Знакомство с синтаксисом","\u002Fblog\u002Fpython\u002Fst1","blog\u002Fpython\u002Fst1",{"title":194,"path":195,"stem":196},"Отладка","\u002Fblog\u002Fpython\u002Fst10","blog\u002Fpython\u002Fst10",{"title":198,"path":199,"stem":200},"Модули и пакеты","\u002Fblog\u002Fpython\u002Fst11","blog\u002Fpython\u002Fst11",{"title":202,"path":203,"stem":204},"Кортежи","\u002Fblog\u002Fpython\u002Fst12","blog\u002Fpython\u002Fst12",{"title":206,"path":207,"stem":208},"Знакомство со списками","\u002Fblog\u002Fpython\u002Fst13","blog\u002Fpython\u002Fst13",{"title":210,"path":211,"stem":212},"Списки и циклы","\u002Fblog\u002Fpython\u002Fst14","blog\u002Fpython\u002Fst14",{"title":214,"path":215,"stem":216},"Использование списков ч.1","\u002Fblog\u002Fpython\u002Fst15","blog\u002Fpython\u002Fst15",{"title":218,"path":219,"stem":220},"Использование списков ч.2","\u002Fblog\u002Fpython\u002Fst16","blog\u002Fpython\u002Fst16",{"title":222,"path":223,"stem":224},"Использование списков ч.3","\u002Fblog\u002Fpython\u002Fst17","blog\u002Fpython\u002Fst17",{"title":226,"path":227,"stem":228},"Словари","\u002Fblog\u002Fpython\u002Fst18","blog\u002Fpython\u002Fst18",{"title":230,"path":231,"stem":232},"Множества","\u002Fblog\u002Fpython\u002Fst19","blog\u002Fpython\u002Fst19",{"title":234,"path":235,"stem":236},"Переменные","\u002Fblog\u002Fpython\u002Fst2","blog\u002Fpython\u002Fst2",{"title":238,"path":239,"stem":240},"Хеш-таблицы","\u002Fblog\u002Fpython\u002Fst20","blog\u002Fpython\u002Fst20",{"title":242,"path":243,"stem":244},"Решето Эратосфена","\u002Fblog\u002Fpython\u002Fst21","blog\u002Fpython\u002Fst21",{"title":246,"path":247,"stem":248},"Длинная арифметика","\u002Fblog\u002Fpython\u002Fst22","blog\u002Fpython\u002Fst22",{"title":250,"path":251,"stem":252},"Декораторы функций","\u002Fblog\u002Fpython\u002Fst23","blog\u002Fpython\u002Fst23",{"title":254,"path":255,"stem":256},"Знакомство с алгоритмами","\u002Fblog\u002Fpython\u002Fst24","blog\u002Fpython\u002Fst24",{"title":258,"path":259,"stem":260},"Бинарный поиск – примеры задач","\u002Fblog\u002Fpython\u002Fst25","blog\u002Fpython\u002Fst25",{"title":262,"path":263,"stem":264},"Сортировка выбором","\u002Fblog\u002Fpython\u002Fst26","blog\u002Fpython\u002Fst26",{"title":266,"path":267,"stem":268},"Рекурсия и стек","\u002Fblog\u002Fpython\u002Fst27","blog\u002Fpython\u002Fst27",{"title":270,"path":271,"stem":272},"Быстрая сортировка","\u002Fblog\u002Fpython\u002Fst28","blog\u002Fpython\u002Fst28",{"title":274,"path":275,"stem":276},"Поиск в ширину","\u002Fblog\u002Fpython\u002Fst29","blog\u002Fpython\u002Fst29",{"title":278,"path":279,"stem":280},"Работа со строками","\u002Fblog\u002Fpython\u002Fst3","blog\u002Fpython\u002Fst3",{"title":282,"path":283,"stem":284},"Поиск в глубину","\u002Fblog\u002Fpython\u002Fst30","blog\u002Fpython\u002Fst30",{"title":286,"path":287,"stem":288},"Сбалансированные деревья","\u002Fblog\u002Fpython\u002Fst31","blog\u002Fpython\u002Fst31",{"title":290,"path":291,"stem":292},"Алгоритм Дейкстры","\u002Fblog\u002Fpython\u002Fst32","blog\u002Fpython\u002Fst32",{"title":294,"path":295,"stem":296},"Жадные алгоритмы","\u002Fblog\u002Fpython\u002Fst33","blog\u002Fpython\u002Fst33",{"title":298,"path":299,"stem":300},"Динамическое программирование","\u002Fblog\u002Fpython\u002Fst34","blog\u002Fpython\u002Fst34",{"title":302,"path":303,"stem":304},"Алгоритм k ближайших соседей","\u002Fblog\u002Fpython\u002Fst35","blog\u002Fpython\u002Fst35",{"title":306,"path":307,"stem":308},"Типы данных","\u002Fblog\u002Fpython\u002Fst4","blog\u002Fpython\u002Fst4",{"title":310,"path":311,"stem":312},"О функциях","\u002Fblog\u002Fpython\u002Fst5","blog\u002Fpython\u002Fst5",{"title":314,"path":315,"stem":316},"Свойства и методы","\u002Fblog\u002Fpython\u002Fst6","blog\u002Fpython\u002Fst6",{"title":318,"path":319,"stem":320},"Определение функций","\u002Fblog\u002Fpython\u002Fst7","blog\u002Fpython\u002Fst7",{"title":322,"path":323,"stem":324},"Логика","\u002Fblog\u002Fpython\u002Fst8","blog\u002Fpython\u002Fst8",{"title":326,"path":327,"stem":328},"Циклы","\u002Fblog\u002Fpython\u002Fst9","blog\u002Fpython\u002Fst9",{"title":330,"path":331,"stem":332,"children":333,"page":114},"Toi","\u002Fblog\u002Ftoi","blog\u002Ftoi",[334,338,342,346,350,354,358,362,366,370,374,378,382],{"title":335,"path":336,"stem":337},"Информация и информационные процессы","\u002Fblog\u002Ftoi\u002Fst1","blog\u002Ftoi\u002Fst1",{"title":339,"path":340,"stem":341},"Электронные таблицы","\u002Fblog\u002Ftoi\u002Fst10","blog\u002Ftoi\u002Fst10",{"title":343,"path":344,"stem":345},"Система, её свойства и компоненты. Моделирование","\u002Fblog\u002Ftoi\u002Fst11","blog\u002Ftoi\u002Fst11",{"title":347,"path":348,"stem":349},"Представление информации в компьютере","\u002Fblog\u002Ftoi\u002Fst12","blog\u002Ftoi\u002Fst12",{"title":351,"path":352,"stem":353},"Средства информационно-коммуникационных технологий. Файловая система","\u002Fblog\u002Ftoi\u002Fst13","blog\u002Ftoi\u002Fst13",{"title":355,"path":356,"stem":357},"Комбинаторика","\u002Fblog\u002Ftoi\u002Fst2","blog\u002Ftoi\u002Fst2",{"title":359,"path":360,"stem":361},"Адресация в интернете","\u002Fblog\u002Ftoi\u002Fst3","blog\u002Ftoi\u002Fst3",{"title":363,"path":364,"stem":365},"Измерение количества информации","\u002Fblog\u002Ftoi\u002Fst4","blog\u002Ftoi\u002Fst4",{"title":367,"path":368,"stem":369},"Системы счисления","\u002Fblog\u002Ftoi\u002Fst5","blog\u002Ftoi\u002Fst5",{"title":371,"path":372,"stem":373},"Диаграммы Эйлера — Венна","\u002Fblog\u002Ftoi\u002Fst6","blog\u002Ftoi\u002Fst6",{"title":375,"path":376,"stem":377},"Условие Фано","\u002Fblog\u002Ftoi\u002Fst7","blog\u002Ftoi\u002Fst7",{"title":379,"path":380,"stem":381},"Теория графов","\u002Fblog\u002Ftoi\u002Fst8","blog\u002Ftoi\u002Fst8",{"title":383,"path":384,"stem":385},"Алгебра логики","\u002Fblog\u002Ftoi\u002Fst9","blog\u002Ftoi\u002Fst9",{"id":387,"title":194,"author":388,"body":393,"date":770,"description":771,"extension":772,"image":773,"meta":774,"minRead":775,"navigation":776,"num":777,"path":195,"seo":778,"stem":196,"__hash__":779},"python\u002Fblog\u002Fpython\u002Fst10.md",{"name":389,"avatar":390},"Штана Альберт Игоревич",{"src":391,"alt":392},"me.jpg","@ashtana",{"type":394,"value":395,"toc":760},"minimark",[396,400,404,409,412,415,418,442,445,448,457,460,497,500,504,512,541,548,561,564,571,575,578,674,684,689,692,695,703,707,714,733,736,744,751,756],[397,398,194],"h2",{"id":399},"отладка",[401,402,403],"p",{},"Даже у самых опытных программистов код редко работает идеально с первого раза.\nНо чем опытнее программист, тем лучше он отлаживает код, то есть анализирует ошибки и устраняет их.\nНавык отладки сам по себе не появится: его необходимо развивать, причем начинать нужно как можно раньше.\nПо ходу обучения вы будете выполнять задания и практиковаться — все это поможет набраться опыта.\nСо временем анализ и устранение ошибок войдут в привычку, если уделять достаточно внимания практике.",[405,406,408],"h3",{"id":407},"поиск-ошибок-в-коде","Поиск ошибок в коде",[401,410,411],{},"Можно отлаживать некорректно работающий код \"методом тыка\", но это долго и непродуктивно.\nБудет намного проще, если вы сначала поймете проблему, а уже потом начнете устранять ее.\nПонимание — это ключевой этап, без которого дальнейшие шаги невозможны.\nПеред отладкой кода надо понять, что в нем не так. Это можно сделать за два шага.",[401,413,414],{},"Шаг 1. Изучить traceback(\"трейсбек\") — список всех вызовов функций от запуска программы до места с ошибкой.\nTraceback помогает отследить, как прошло выполнение программы: какие функции получилось вызвать успешно, а с какими — возникли сложности.\nКаждая запись в \"трейсбеке\" указывает на файл и строчку, а затем на выполняемую функцию.",[401,416,417],{},"Представим, что вы написали код в файле db.py и решили запустить функцию main() в четвертой строчке.\nЗапись в \"трейсбеке\" будет выглядеть так:",[419,420,425],"pre",{"className":421,"code":422,"language":423,"meta":424,"style":424},"language-shell shiki shiki-themes github-light","File \"db.py\", line 4, in \u003Cmodule>\n    main()\n","shell","",[426,427,428,436],"code",{"__ignoreMap":424},[429,430,433],"span",{"class":431,"line":432},"line",1,[429,434,435],{},"File \"db.py\", line 4, in \u003Cmodule>\n",[429,437,439],{"class":431,"line":438},2,[429,440,441],{},"    main()\n",[401,443,444],{},"Как видите, здесь указаны не только файл и строчка, но еще и название модуля.\nПо нему можно с легкостью определить, где возникла проблема: в вашем коде или в какой-то библиотеке, которую вы не писали, но используете.",[401,446,447],{},"Шаг 2. Когда \"трейсбек\" дойдет до проблемного места, он выдаст сообщение об ошибке. Например, такое:",[419,449,451],{"className":421,"code":450,"language":423,"meta":424,"style":424},"NameError: name 'create' is not defined\n",[426,452,453],{"__ignoreMap":424},[429,454,455],{"class":431,"line":432},[429,456,450],{},[401,458,459],{},"Если владеете английским, то быстрее поймете, о чем идет речь в сообщении: «Название create не определено».\nЭта ошибка чаще всего происходит из-за опечатки в названии — нужно проверить этот момент.\nБез знания английского тоже можно разобраться, если обратиться к словарю или онлайн-переводчику.\nТеперь посмотрим, как traceback и сообщение об ошибке выглядят вместе:",[419,461,463],{"className":421,"code":462,"language":423,"meta":424,"style":424},"Traceback (most recent call last):\n  File \"db.py\", line 4, in \u003Cmodule>\n    main()\n  File \"db.py\", line 2, in main\n    create()\nNameError: name 'create' is not defined\n",[426,464,465,470,475,480,486,492],{"__ignoreMap":424},[429,466,467],{"class":431,"line":432},[429,468,469],{},"Traceback (most recent call last):\n",[429,471,472],{"class":431,"line":438},[429,473,474],{},"  File \"db.py\", line 4, in \u003Cmodule>\n",[429,476,478],{"class":431,"line":477},3,[429,479,441],{},[429,481,483],{"class":431,"line":482},4,[429,484,485],{},"  File \"db.py\", line 2, in main\n",[429,487,489],{"class":431,"line":488},5,[429,490,491],{},"    create()\n",[429,493,495],{"class":431,"line":494},6,[429,496,450],{},[401,498,499],{},"В примере выше видно всю цепочку событий: программа успешно справилась с функцией main(), а потом перешла к функции create() и столкнулась с ошибкой в названии.\nКроме NameError, в Python есть еще множество разных ошибок, которые можно разделить на три группы.",[405,501,503],{"id":502},"типы-ошибок","Типы ошибок",[401,505,506,507,511],{},"Самые простые и понятные ошибки — ",[508,509,510],"em",{},"синтаксические",".\nОни связаны исключительно с тем, что код неверно оформлен: например, использованы неправильные кавычки.\nВ выводе таких ошибок всегда присутствует фраза SyntaxError:. Чтобы отладить код в этом случае, нужно внимательно взглянуть на место с ошибкой.\nПосмотрим на примере. Здесь синтаксическая ошибка произошла потому, что использована кавычка ' вместо \":",[419,513,515],{"className":421,"code":514,"language":423,"meta":424,"style":424},"Traceback (most recent call last):\n  File \"users.py\", line 2\n    print(\"Hello\" + \"world')\n                           ^\nSyntaxError: EOL while scanning string literal\n",[426,516,517,521,526,531,536],{"__ignoreMap":424},[429,518,519],{"class":431,"line":432},[429,520,469],{},[429,522,523],{"class":431,"line":438},[429,524,525],{},"  File \"users.py\", line 2\n",[429,527,528],{"class":431,"line":477},[429,529,530],{},"    print(\"Hello\" + \"world')\n",[429,532,533],{"class":431,"line":482},[429,534,535],{},"                           ^\n",[429,537,538],{"class":431,"line":488},[429,539,540],{},"SyntaxError: EOL while scanning string literal\n",[401,542,543,544,547],{},"Вторая большая группа ошибок — это ",[508,545,546],{},"ошибки программирования",". Например, к ним относятся:",[549,550,551,555,558],"ul",{},[552,553,554],"li",{},"Вызов несуществующей функции;",[552,556,557],{},"Использование необъявленной переменной;",[552,559,560],{},"Передача неверных аргументов (например, аргументов неверного типа);",[401,562,563],{},"Эти ошибки исправить труднее, чем синтаксические. Обычно они возникают, если в другом более раннем вызове была неправильная логика.",[401,565,566,567,570],{},"Последний тип ошибок — ",[508,568,569],{},"логические ошибки",".\nИсправить ситуацию бывает очень сложно, потому что программа в целом работает, но при некоторых значениях выдает неверный результат.\nВ большинстве случаев проблема кроется в неверной логике. Например, вместо сложения в программе выполняется вычитание.",[405,572,574],{"id":573},"способы-отладки","Способы отладки",[401,576,577],{},"Есть множество способов отладки программ, но у всех одна общая идея — нужно проанализировать, как меняются значения переменных в процессе работы кода.\nРассмотрим на конкретном примере.\nНиже описана функция, которая считает сумму чисел от числа start до числа finish.\nЕсли start равно трём, а finish — пяти, то программа должна вычислить: 3 + 4 + 5.",[419,579,583],{"className":580,"code":581,"language":582,"meta":424,"style":424},"language-python shiki shiki-themes github-light","def sum_of_series(start, finish):\n    result = 0\n    n = start\n    while n \u003C finish:\n        result = result + n\n        n = n + 1\n    return result\n","python",[426,584,585,599,611,621,635,651,665],{"__ignoreMap":424},[429,586,587,591,595],{"class":431,"line":432},[429,588,590],{"class":589},"sD7c4","def",[429,592,594],{"class":593},"s7eDp"," sum_of_series",[429,596,598],{"class":597},"sgsFI","(start, finish):\n",[429,600,601,604,607],{"class":431,"line":438},[429,602,603],{"class":597},"    result ",[429,605,606],{"class":589},"=",[429,608,610],{"class":609},"sYu0t"," 0\n",[429,612,613,616,618],{"class":431,"line":477},[429,614,615],{"class":597},"    n ",[429,617,606],{"class":589},[429,619,620],{"class":597}," start\n",[429,622,623,626,629,632],{"class":431,"line":482},[429,624,625],{"class":589},"    while",[429,627,628],{"class":597}," n ",[429,630,631],{"class":589},"\u003C",[429,633,634],{"class":597}," finish:\n",[429,636,637,640,642,645,648],{"class":431,"line":488},[429,638,639],{"class":597},"        result ",[429,641,606],{"class":589},[429,643,644],{"class":597}," result ",[429,646,647],{"class":589},"+",[429,649,650],{"class":597}," n\n",[429,652,653,656,658,660,662],{"class":431,"line":494},[429,654,655],{"class":597},"        n ",[429,657,606],{"class":589},[429,659,628],{"class":597},[429,661,647],{"class":589},[429,663,664],{"class":609}," 1\n",[429,666,668,671],{"class":431,"line":667},7,[429,669,670],{"class":589},"    return",[429,672,673],{"class":597}," result\n",[401,675,676,677],{},"В этом коде допущена ошибка.\nГлядя на код функции sum_of_series(), замечаем, что основных переменных там две: n и result.\nИз этого можно сделать такой вывод — нужно посмотреть, какие значения даются переменным на каждой итерации.\nПосле этого найти ошибку не составит труда.\nЕсть удобный инструмент для отслеживания значений переменных во время выполнения кода — это визуальные отладчики.\nОни встраиваются в популярные редакторы кода и позволяют выполнить программу по шагам и увидеть все изменения.\nЕсли интересно узнать больше об отладчиках: ",[678,679,683],"a",{"href":680,"rel":681},"https:\u002F\u002Fdocs.python.org\u002F3\u002Flibrary\u002Fpdb.html",[682],"nofollow","Python debugger.",[685,686,688],"h4",{"id":687},"тесты","Тесты",[401,690,691],{},"Код должен и часто проверяется с помощью автоматических тестов.\nОбычно они написаны на том же языке, на котором написан сам код.\nОбщий принцип работы такого вида тестирования довольно прост.\nТестируемая программа загружается в память и вызывается с разными параметрами, а тесты следят за тем, чтобы ее поведение соответствовало ожидаемому.\nКогда код не проходит тесты, то обычно говорят что \"тесты упали\". В этот момент начинается самое интересное.\nНеобходимо понять, где и почему возникла ошибка.\nИ вывод тестов в этом процессе играет ключевую роль, это главный помощник и проводник.\nНо необходим опыт, чтобы начать делать правильные выводы из того, что пишут тесты.\nВ первую очередь нужно классифицировать проблему.",[401,693,694],{},"Ошибки в тестах можно грубо разделить на две категории:",[549,696,697,700],{},[552,698,699],{},"ошибки, которые выдает компилятор или интерпретатор: синтаксическая ошибка, ошибка типизации;",[552,701,702],{},"ошибочные утверждения.",[685,704,706],{"id":705},"утверждения","Утверждения",[401,708,709,713],{},[710,711,712],"strong",{},"Утверждение"," — это специальная функция, которая вызывает ваш код с определенными параметрами и проверяет, что он возвращает ожидаемый результат.\nНапример:",[419,715,717],{"className":580,"code":716,"language":582,"meta":424,"style":424},"assert(isDigit(3))\n",[426,718,719],{"__ignoreMap":424},[429,720,721,724,727,730],{"class":431,"line":432},[429,722,723],{"class":589},"assert",[429,725,726],{"class":597},"(isDigit(",[429,728,729],{"class":609},"3",[429,731,732],{"class":597},"))\n",[401,734,735],{},"Самое важное: если \"тесты упали на утверждении\", это означает, что ваш код как минимум отработал, но его результат не соответствует ожидаемому.\nПричем часто бывает так, что часть утверждений проходит проверку, то есть код возвращает правильный результат, а часть — нет, обычно в пограничных случаях.\nВ конечном итоге падение теста на утверждении говорит о том, что в коде логическая ошибка.",[401,737,738,739],{},"Ниже — пример вывода упавшего теста. То, насколько вывод подробный, зависит от вида утверждения и возможностей тестовой среды.\n",[740,741],"img",{"alt":742,"src":743},"Упавший тест","\u002Fimages\u002Fblog\u002Fpython\u002Fst10\u002Fimg1.png",[401,745,746,747],{},"Вывод можно разделить на две части:\nПервая — описание того, что ожидалось от функции и что было получено.\nВ нашем примере это строка AssertionError: 3 == 1.\nЧитается она следующим образом: «ожидалось, что функция вернет 3, но она вернула 1».\nЭто уже хорошо, но еще хотелось бы увидеть, с какими параметрами была вызвана функция.\nИ в этом нам поможет вторая часть вывода.\nВторая часть называется backtrace, она содержит список функций, которые последовательно вызывались в коде.\nПорядок вывода, чаще всего, обратный: в начале то, что вызывалось последним.\nВ первую очередь нужно, начиная с конца, найти первое упоминание функции из файла, который похож на тестовый.\nОбычно его называние содержит слово test.\nВ примере выше это at Object.",[748,749,750],"anonymous",{}," (test.js:4:8).\nВ скобках указана строчка, на которой находится вызов этого утверждения. В данном случае — строчка 4.\nВсё, что теперь остается, это зайти в соответствующий файл и посмотреть то, как вызывалась ваша функция.",[401,752,753],{},[508,754,755],{},"Новички часто расстраиваются из-за ошибок, начинают считать себя невнимательными.\nНа самом деле, в ошибках нет ничего страшного: опытные разработчики допускают их не реже новичков.\nСложно научиться писать идеальный код, но можно развивать навыки отладки и \"насмотренность\" на ошибки.\nЕще новички думают, что опытный разработчик может взглянуть на код и сразу же понять, в чем ошибка.\nДа, с опытом это приходит, но все не так просто. По фрагменту кода сложно понять, что пошло не так.\nЕсли хотите спросить совет у опытного разработчика, лучше покажите не сам некорректно работающий код, а сообщение об ошибке.",[757,758,759],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":424,"searchDepth":438,"depth":488,"links":761},[762],{"id":399,"depth":438,"text":194,"children":763},[764,765,766],{"id":407,"depth":477,"text":408},{"id":502,"depth":477,"text":503},{"id":573,"depth":477,"text":574,"children":767},[768,769],{"id":687,"depth":482,"text":688},{"id":705,"depth":482,"text":706},"2025-02-18","Поиск ошибок в коде. Типы ошибок. Способы отладки","md","images\u002Fblog\u002Fpython\u002Fst10\u002Fimg.png",{},13,true,10,{"title":194,"description":771},"mxydsrJ83M_q18XS0SMO0XfGmLPbXc-zhZlPmOgcQHQ",[781,783],{"title":326,"path":327,"stem":328,"description":782,"children":-1},"Создание циклов. Условия внутри тела цикла. Обход строк",{"title":198,"path":199,"stem":200,"description":784,"children":-1},"Работа с модулями. Объединение отдельных модулей в пакет. Пример использования модуля random",1780737508669]