[{"data":1,"prerenderedAt":1689},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002Fpython\u002Fst11":386,"\u002Fblog\u002Fpython\u002Fst11-surround":1684},[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":198,"author":388,"body":393,"date":1675,"description":1676,"extension":1677,"image":1678,"meta":1679,"minRead":1680,"navigation":495,"num":1681,"path":199,"seo":1682,"stem":200,"__hash__":1683},"python\u002Fblog\u002Fpython\u002Fst11.md",{"name":389,"avatar":390},"Штана Альберт Игоревич",{"src":391,"alt":392},"me.jpg","@ashtana",{"type":394,"value":395,"toc":1654},"minimark",[396,400,404,407,412,437,512,521,534,537,541,556,573,576,614,617,621,634,680,683,730,742,746,749,777,780,784,791,856,864,954,957,968,973,976,980,991,1008,1014,1034,1037,1064,1073,1077,1080,1103,1109,1129,1135,1178,1184,1188,1191,1199,1206,1242,1245,1289,1292,1300,1303,1308,1311,1315,1318,1359,1366,1389,1392,1396,1399,1402,1416,1420,1429,1446,1449,1475,1481,1534,1537,1548,1555,1559,1568,1605,1615,1629,1636,1647,1650],[397,398,198],"h2",{"id":399},"модули-и-пакеты",[401,402,403],"p",{},"Для реальных приложений на рынке разработчики пишут сотни и тысячи строчек кода.\nЕсть даже проекты, в которых несколько миллионов строчек.\nПодобный масштабный проект невозможно сохранить в одном файле, команда запутается в своем же коде, не сможет поддерживать и обновлять его.\nПоэтому файл с кодом нужно разбивать на части.\nЭтот принцип применяется во многих языках программирования. В Python с этой целью используются модули.",[401,405,406],{},"В Python любой файл с кодом называется модулем — между этими терминами нет разницы.\nЧтобы всем Python-разработчикам было удобно читать готовый код, принято называть файлы в стиле snake_case: то есть с маленькой буквы и с разделением слов символом подчеркивания.\nЭто легко запомнить: snake_case переводится как «змеиный регистр» и поэтому идеально сочетается с языком Python.",[408,409,411],"h4",{"id":410},"как-использовать-модули","Как использовать модули",[401,413,414,415,419,420,424,425,428,429,432,433,436],{},"Работать с кодом в тысячи строчек намного проще, если он разбит на несколько модулей.\nВ таком случае обычно работают с главным файлом, а отдельные функции помещают в разные модули.\nЗатем модули импортируют в ",[416,417,418],"strong",{},"main.py"," с помощью ключевого слова ",[421,422,423],"code",{},"import",".\nВ итоге команда разработчиков получает код, который легко читать и обслуживать.\nЧтобы попрактиковаться, попробуем создать свой модуль.\nДля этого мы создадим файл с названием ",[416,426,427],{},"greeting.py",".\nЗатем внутри этого файла определим функцию ",[421,430,431],{},"say_hi()"," и переменную ",[421,434,435],{},"name",":",[438,439,444],"pre",{"className":440,"code":441,"language":442,"meta":443,"style":443},"language-python shiki shiki-themes github-light","# file: greeting.py\ndef say_hi(): # определяем функцию\n    print('Hi!')\n\nname = 'Alexander' # определяем переменную\n","python","",[421,445,446,455,473,490,497],{"__ignoreMap":443},[447,448,451],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"sAwPA","# file: greeting.py\n",[447,456,458,462,466,470],{"class":449,"line":457},2,[447,459,461],{"class":460},"sD7c4","def",[447,463,465],{"class":464},"s7eDp"," say_hi",[447,467,469],{"class":468},"sgsFI","(): ",[447,471,472],{"class":453},"# определяем функцию\n",[447,474,476,480,483,487],{"class":449,"line":475},3,[447,477,479],{"class":478},"sYu0t","    print",[447,481,482],{"class":468},"(",[447,484,486],{"class":485},"sYBdl","'Hi!'",[447,488,489],{"class":468},")\n",[447,491,493],{"class":449,"line":492},4,[447,494,496],{"emptyLinePlaceholder":495},true,"\n",[447,498,500,503,506,509],{"class":449,"line":499},5,[447,501,502],{"class":468},"name ",[447,504,505],{"class":460},"=",[447,507,508],{"class":485}," 'Alexander'",[447,510,511],{"class":453}," # определяем переменную\n",[401,513,514,515,517,518,520],{},"Модуль-приветствие готов: он умеет печатать строку Hi! и обрабатывать переменную ",[421,516,435],{},".\nНо от него нет никакой пользы, пока он не встроен в работу всей остальной программы.\nЧтобы воспользоваться нашим модулем, нужно импортировать его в главный модуль ",[416,519,418],{},".\nДля этого в Python есть три способа:",[522,523,524,528,531],"ul",{},[525,526,527],"li",{},"Импорт модуля целиком;",[525,529,530],{},"Импорт отдельных определений из модуля;",[525,532,533],{},"Импорт всего содержимого модуля сразу;",[401,535,536],{},"Сначала рассмотрим только первый и второй способы.",[408,538,540],{"id":539},"импорт-модуля-целиком","Импорт модуля целиком",[401,542,543,544,546,547,550,551,553,554,436],{},"Это самый простой способ: используем ключевое слово ",[421,545,423],{}," вместе с названием файла без расширения ",[416,548,549],{},".py",".\nПерейдем в главный файл ",[416,552,418],{}," и импортируем туда наш модуль ",[416,555,427],{},[438,557,559],{"className":440,"code":558,"language":442,"meta":443,"style":443},"# file: main.py\nimport greeting\n",[421,560,561,566],{"__ignoreMap":443},[447,562,563],{"class":449,"line":450},[447,564,565],{"class":453},"# file: main.py\n",[447,567,568,570],{"class":449,"line":457},[447,569,423],{"class":460},[447,571,572],{"class":468}," greeting\n",[401,574,575],{},"Импорт прошел успешно — у нас появился доступ к модулю-приветствию прямо из главного файла.\nТеперь к содержимому модуля можно обращаться «через точку».\nТак можно вызвать функцию модуля или отдельную переменную:",[438,577,579],{"className":440,"code":578,"language":442,"meta":443,"style":443},"# вызываем функцию модуля\ngreeting.say_hi()  # => Hi!\n\n# выводим на экран отдельную переменную\nprint(greeting.name)  # => Alexander\n",[421,580,581,586,594,598,603],{"__ignoreMap":443},[447,582,583],{"class":449,"line":450},[447,584,585],{"class":453},"# вызываем функцию модуля\n",[447,587,588,591],{"class":449,"line":457},[447,589,590],{"class":468},"greeting.say_hi()  ",[447,592,593],{"class":453},"# => Hi!\n",[447,595,596],{"class":449,"line":475},[447,597,496],{"emptyLinePlaceholder":495},[447,599,600],{"class":449,"line":492},[447,601,602],{"class":453},"# выводим на экран отдельную переменную\n",[447,604,605,608,611],{"class":449,"line":499},[447,606,607],{"class":478},"print",[447,609,610],{"class":468},"(greeting.name)  ",[447,612,613],{"class":453},"# => Alexander\n",[401,615,616],{},"Это самый распространенный способ, потому что такой код легко читать.\nЛюбой разработчик с первого взгляда может определить, что используемая переменная или вызываемая функция — это часть какого-то конкретного модуля.",[408,618,620],{"id":619},"импорт-отдельных-определений","Импорт отдельных определений",[401,622,623,624,627,628,630,631,633],{},"Иногда первый способ не подходит — например, из длинного и сложного модуля вам нужна всего пара функций или переменных.\nТогда поможет второй способ импорта: нужно написать ключевое слово ",[421,625,626],{},"from"," с названием модуля без расширения ",[416,629,549],{},".\nЗатем в той же строчке указываем ключевое слово ",[421,632,423],{}," с названиями определений, которые хотим использовать.\nТак это выглядит в коде:",[438,635,637],{"className":440,"code":636,"language":442,"meta":443,"style":443},"# file: main.py\nfrom greeting import say_hi, name # импортируем отдельные компоненты модуля\n\nprint(name)  # используем импортированную переменную\nsay_hi()     # вызываем импортированную функцию\n",[421,638,639,643,658,662,672],{"__ignoreMap":443},[447,640,641],{"class":449,"line":450},[447,642,565],{"class":453},[447,644,645,647,650,652,655],{"class":449,"line":457},[447,646,626],{"class":460},[447,648,649],{"class":468}," greeting ",[447,651,423],{"class":460},[447,653,654],{"class":468}," say_hi, name ",[447,656,657],{"class":453},"# импортируем отдельные компоненты модуля\n",[447,659,660],{"class":449,"line":475},[447,661,496],{"emptyLinePlaceholder":495},[447,663,664,666,669],{"class":449,"line":492},[447,665,607],{"class":478},[447,667,668],{"class":468},"(name)  ",[447,670,671],{"class":453},"# используем импортированную переменную\n",[447,673,674,677],{"class":449,"line":499},[447,675,676],{"class":468},"say_hi()     ",[447,678,679],{"class":453},"# вызываем импортированную функцию\n",[401,681,682],{},"Также при импорте можно указать новое имя для импортируемого компонента с помощью ключевого слова as:",[438,684,686],{"className":440,"code":685,"language":442,"meta":443,"style":443},"# file: main.py\nfrom greeting import say_hi as hello, name as first_name\n\nprint(first_name)\nhello()\n",[421,687,688,692,714,718,725],{"__ignoreMap":443},[447,689,690],{"class":449,"line":450},[447,691,565],{"class":453},[447,693,694,696,698,700,703,706,709,711],{"class":449,"line":457},[447,695,626],{"class":460},[447,697,649],{"class":468},[447,699,423],{"class":460},[447,701,702],{"class":468}," say_hi ",[447,704,705],{"class":460},"as",[447,707,708],{"class":468}," hello, name ",[447,710,705],{"class":460},[447,712,713],{"class":468}," first_name\n",[447,715,716],{"class":449,"line":475},[447,717,496],{"emptyLinePlaceholder":495},[447,719,720,722],{"class":449,"line":492},[447,721,607],{"class":478},[447,723,724],{"class":468},"(first_name)\n",[447,726,727],{"class":449,"line":499},[447,728,729],{"class":468},"hello()\n",[401,731,732,733,737,738,741],{},"Во время импорта всего модуля можно обращаться к нему «через точку». Вот как выглядит такая запись: module.name.\nДля такой формы записи существует и более официальный термин — ",[734,735,736],"em",{},"квалифицированное имя",".\nСоответственно, импорт модуля целиком официально называется ",[734,739,740],{},"квалифицированным импортом",".\nСтоит отметить, что в Python все строчки с import принято располагать в самом начале кода модуля.\nТакой набор строчек часто называют блоком импортов, хотя синтаксически этот блок никак не выделен — это обычные строчки одна за другой.\nЭта группировка повышает читаемость кода: так разработчикам проще искать ошибки в коде и исправлять их.",[408,743,745],{"id":744},"импорт-всего-содержимого-модуля","Импорт всего содержимого модуля",[401,747,748],{},"Рассмотрим третий вариант — импорт всего содержимого модуля. Так он выглядит в коде:",[438,750,752],{"className":440,"code":751,"language":442,"meta":443,"style":443},"from some_module import *\nfrom another_module import *\n",[421,753,754,766],{"__ignoreMap":443},[447,755,756,758,761,763],{"class":449,"line":450},[447,757,626],{"class":460},[447,759,760],{"class":468}," some_module ",[447,762,423],{"class":460},[447,764,765],{"class":460}," *\n",[447,767,768,770,773,775],{"class":449,"line":457},[447,769,626],{"class":460},[447,771,772],{"class":468}," another_module ",[447,774,423],{"class":460},[447,776,765],{"class":460},[401,778,779],{},"Здесь из модулей some_module и another_module неявно импортируются все определения.\nТакой способ импорта дает доступ к десяткам переменных, констант и функций, причем можно не указывать названия содержимого из всего модуля.\nЭта особенность отличает импорт содержимого от импорта модуля целиком — и она же может усложнять чтение кода.\nПосмотрим на примере. Представим программиста, который читает чужой код с импортом содержимого.\nВ какой-то момент он встречает название незнакомой переменной и хочет узнать, откуда она взялась.\nНедостаточно просто внимательно посмотреть на блок импортов или сделать поиск по коду — названия всех импортированных определений скрываются за *.\nИменно поэтому в большинстве руководств по написанию кода на Python повторяется один и тот же совет: «Как можно реже пользуйтесь импортом всего содержимого».\nТем не менее в реальном коде такие импорты встречаются, поэтому было важно упомянуть этот вариант.",[408,781,783],{"id":782},"сочетание-способов-импорта","Сочетание способов импорта",[401,785,786,787,790],{},"Чтобы углубить знания, рассмотрим еще один способ — сочетание импорта целиком и отдельными определениями в рамках одного и того же модуля.\nРассмотрим пример. В модуле ",[421,788,789],{},"computation.py"," определим функцию и переменные:",[438,792,794],{"className":440,"code":793,"language":442,"meta":443,"style":443},"# file: computation.py\nPI = 3.1415926\nE = 2.7182818\n\n\ndef pi_times(x):\n    return x * PI\n",[421,795,796,801,812,822,826,830,841],{"__ignoreMap":443},[447,797,798],{"class":449,"line":450},[447,799,800],{"class":453},"# file: computation.py\n",[447,802,803,806,809],{"class":449,"line":457},[447,804,805],{"class":478},"PI",[447,807,808],{"class":460}," =",[447,810,811],{"class":478}," 3.1415926\n",[447,813,814,817,819],{"class":449,"line":475},[447,815,816],{"class":468},"E ",[447,818,505],{"class":460},[447,820,821],{"class":478}," 2.7182818\n",[447,823,824],{"class":449,"line":492},[447,825,496],{"emptyLinePlaceholder":495},[447,827,828],{"class":449,"line":499},[447,829,496],{"emptyLinePlaceholder":495},[447,831,833,835,838],{"class":449,"line":832},6,[447,834,461],{"class":460},[447,836,837],{"class":464}," pi_times",[447,839,840],{"class":468},"(x):\n",[447,842,844,847,850,853],{"class":449,"line":843},7,[447,845,846],{"class":460},"    return",[447,848,849],{"class":468}," x ",[447,851,852],{"class":460},"*",[447,854,855],{"class":478}," PI\n",[401,857,858,859,861,862,436],{},"А в модуле ",[421,860,418],{}," воспользуемся двумя способами импорта из модуля ",[421,863,789],{},[438,865,867],{"className":440,"code":866,"language":442,"meta":443,"style":443},"# file: main.py\nimport computation\nfrom computation import PI, E\nfrom computation import pi_times\n\n\nprint(PI)\nprint(computation.E)\nprint(pi_times(2))\nprint(computation.pi_times(E))\n",[421,868,869,873,880,895,906,910,914,924,932,946],{"__ignoreMap":443},[447,870,871],{"class":449,"line":450},[447,872,565],{"class":453},[447,874,875,877],{"class":449,"line":457},[447,876,423],{"class":460},[447,878,879],{"class":468}," computation\n",[447,881,882,884,887,889,892],{"class":449,"line":475},[447,883,626],{"class":460},[447,885,886],{"class":468}," computation ",[447,888,423],{"class":460},[447,890,891],{"class":478}," PI",[447,893,894],{"class":468},", E\n",[447,896,897,899,901,903],{"class":449,"line":492},[447,898,626],{"class":460},[447,900,886],{"class":468},[447,902,423],{"class":460},[447,904,905],{"class":468}," pi_times\n",[447,907,908],{"class":449,"line":499},[447,909,496],{"emptyLinePlaceholder":495},[447,911,912],{"class":449,"line":832},[447,913,496],{"emptyLinePlaceholder":495},[447,915,916,918,920,922],{"class":449,"line":843},[447,917,607],{"class":478},[447,919,482],{"class":468},[447,921,805],{"class":478},[447,923,489],{"class":468},[447,925,927,929],{"class":449,"line":926},8,[447,928,607],{"class":478},[447,930,931],{"class":468},"(computation.E)\n",[447,933,935,937,940,943],{"class":449,"line":934},9,[447,936,607],{"class":478},[447,938,939],{"class":468},"(pi_times(",[447,941,942],{"class":478},"2",[447,944,945],{"class":468},"))\n",[447,947,949,951],{"class":449,"line":948},10,[447,950,607],{"class":478},[447,952,953],{"class":468},"(computation.pi_times(E))\n",[401,955,956],{},"Из примеров выше видно, что можно:",[522,958,959,962,965],{},[525,960,961],{},"Использовать оба способа импорта одновременно;",[525,963,964],{},"Импортировать отдельные определения в несколько заходов;",[525,966,967],{},"Получать доступ «через точку» к определениям, которые уже импортированы по имени;",[969,970,972],"h3",{"id":971},"пакеты","Пакеты",[401,974,975],{},"Обычно код в больших проектах делят на модули — отдельные файлы, в которых хранится код на Python.\nНо иногда и этого разделения недостаточно.\nЧасто модули хочется сгруппировать «по смыслу» или сформировать отдельную группу модулей, чтобы использовать их в других проектах.\nВ таких случаях помогают пакеты — группы модулей.\nВ особенно больших проектах используются еще и подпакеты внутри пакетов, но на этой теме мы пока не будем останавливаться.\nНиже разберемся, как создавать пакеты и добавлять в них модули.\nТакже посмотрим, какими способами можно импортировать пакеты в проект.",[408,977,979],{"id":978},"создание-пакета","Создание пакета",[401,981,982,983,986,987,990],{},"С точки зрения структуры ",[416,984,985],{},"пакет"," — это каталог (директория) с файлами модулей, имеющий имя в формате snake_case и содержащий специальный модуль с именем «",[416,988,989],{},"__init__.py","».\nИменно наличие этого специального файла подсказывает интерпретатору Python, что каталог следует воспринимать как пакет.\nРассмотрим пример самого простого пакета. Создадим пакет из каталога package и модуля __init__.py внутри этого каталога:",[438,992,996],{"className":993,"code":994,"language":995,"meta":443,"style":443},"language-markdown shiki shiki-themes github-light","package\u002F\n└── __init__.py\n","markdown",[421,997,998,1003],{"__ignoreMap":443},[447,999,1000],{"class":449,"line":450},[447,1001,1002],{},"package\u002F\n",[447,1004,1005],{"class":449,"line":457},[447,1006,1007],{},"└── __init__.py\n",[401,1009,1010,1011,1013],{},"В файл ",[421,1012,989],{}," добавим следующий код:",[438,1015,1017],{"className":440,"code":1016,"language":442,"meta":443,"style":443},"# file __init__.py\nNAME = 'super_package'\n",[421,1018,1019,1024],{"__ignoreMap":443},[447,1020,1021],{"class":449,"line":450},[447,1022,1023],{"class":453},"# file __init__.py\n",[447,1025,1026,1029,1031],{"class":449,"line":457},[447,1027,1028],{"class":478},"NAME",[447,1030,808],{"class":460},[447,1032,1033],{"class":485}," 'super_package'\n",[401,1035,1036],{},"Теперь у нас есть небольшой, но уже полноценный пакет. Его можно импортировать так же, как модуль:",[438,1038,1040],{"className":440,"code":1039,"language":442,"meta":443,"style":443},"import package\n\nprint(package.NAME)\n",[421,1041,1042,1049,1053],{"__ignoreMap":443},[447,1043,1044,1046],{"class":449,"line":450},[447,1045,423],{"class":460},[447,1047,1048],{"class":468}," package\n",[447,1050,1051],{"class":449,"line":457},[447,1052,496],{"emptyLinePlaceholder":495},[447,1054,1055,1057,1060,1062],{"class":449,"line":475},[447,1056,607],{"class":478},[447,1058,1059],{"class":468},"(package.",[447,1061,1028],{"class":478},[447,1063,489],{"class":468},[401,1065,1066,1067,1069,1070,1072],{},"Обратите внимание, что отдельно импортировать файл ",[421,1068,989],{}," не нужно.\nПри первом обращении к пакету Python самостоятельно импортирует модуль ",[421,1071,989],{},".\nЭто происходит автоматически, потому что каталог без init-файла не будет считаться пакетом.",[408,1074,1076],{"id":1075},"добавление-модуля-в-пакет","Добавление модуля в пакет",[401,1078,1079],{},"С простым пакетом все ясно — его можно использовать как модуль. Теперь перейдем к группировке.\nДобавим в пакет еще два модуля:",[438,1081,1083],{"className":993,"code":1082,"language":995,"meta":443,"style":443},"package\u002F\n├── constants.py\n├── functions.py\n└── __init__.py\n",[421,1084,1085,1089,1094,1099],{"__ignoreMap":443},[447,1086,1087],{"class":449,"line":450},[447,1088,1002],{},[447,1090,1091],{"class":449,"line":457},[447,1092,1093],{},"├── constants.py\n",[447,1095,1096],{"class":449,"line":475},[447,1097,1098],{},"├── functions.py\n",[447,1100,1101],{"class":449,"line":492},[447,1102,1007],{},[401,1104,1105,1106,436],{},"Чтобы было понятнее, рассмотрим содержимое модуля ",[421,1107,1108],{},"constants.py",[438,1110,1112],{"className":440,"code":1111,"language":442,"meta":443,"style":443},"# file constants.py\nPERSON = 'Alex'\n",[421,1113,1114,1119],{"__ignoreMap":443},[447,1115,1116],{"class":449,"line":450},[447,1117,1118],{"class":453},"# file constants.py\n",[447,1120,1121,1124,1126],{"class":449,"line":457},[447,1122,1123],{"class":478},"PERSON",[447,1125,808],{"class":460},[447,1127,1128],{"class":485}," 'Alex'\n",[401,1130,1131,1132,436],{},"И содержимое модуля ",[421,1133,1134],{},"functions.py",[438,1136,1138],{"className":440,"code":1137,"language":442,"meta":443,"style":443},"# file functions.py\ndef greet(who):\n    print('Hello, ' + who + '!')\n",[421,1139,1140,1145,1155],{"__ignoreMap":443},[447,1141,1142],{"class":449,"line":450},[447,1143,1144],{"class":453},"# file functions.py\n",[447,1146,1147,1149,1152],{"class":449,"line":457},[447,1148,461],{"class":460},[447,1150,1151],{"class":464}," greet",[447,1153,1154],{"class":468},"(who):\n",[447,1156,1157,1159,1161,1164,1167,1170,1173,1176],{"class":449,"line":475},[447,1158,479],{"class":478},[447,1160,482],{"class":468},[447,1162,1163],{"class":485},"'Hello, '",[447,1165,1166],{"class":460}," +",[447,1168,1169],{"class":468}," who ",[447,1171,1172],{"class":460},"+",[447,1174,1175],{"class":485}," '!'",[447,1177,489],{"class":468},[401,1179,1180,1181,1183],{},"Теперь в пакете есть не только ",[421,1182,989],{},", но и еще два модуля — теперь их можно импортировать.",[408,1185,1187],{"id":1186},"как-импортировать-пакеты","Как импортировать пакеты",[401,1189,1190],{},"Про модули упоминались два распространенных варианта импорта:",[522,1192,1193,1196],{},[525,1194,1195],{},"Квалифицированный импорт (также его называют «импорт модуля целиком»);",[525,1197,1198],{},"Импорт отдельных определений.",[401,1200,1201,1202,1205],{},"Применим оба способа импорта — но теперь уже не к модулям, а к пакетам.\n",[734,1203,1204],{},"Квалифицированный импорт"," помогает писать понятный код.\nПрочитав строчку вызова функции, другой разработчик сразу поймет, откуда пришли сама функция и ее аргумент.\nВ этом примере квалифицированный импорт выглядит так:",[438,1207,1209],{"className":440,"code":1208,"language":442,"meta":443,"style":443},"import package.functions\nimport package.constants\n\npackage.functions.greet(package.constants.PERSON)  # => Hello, Alex!\n",[421,1210,1211,1218,1225,1229],{"__ignoreMap":443},[447,1212,1213,1215],{"class":449,"line":450},[447,1214,423],{"class":460},[447,1216,1217],{"class":468}," package.functions\n",[447,1219,1220,1222],{"class":449,"line":457},[447,1221,423],{"class":460},[447,1223,1224],{"class":468}," package.constants\n",[447,1226,1227],{"class":449,"line":475},[447,1228,496],{"emptyLinePlaceholder":495},[447,1230,1231,1234,1236,1239],{"class":449,"line":492},[447,1232,1233],{"class":468},"package.functions.greet(package.constants.",[447,1235,1123],{"class":478},[447,1237,1238],{"class":468},")  ",[447,1240,1241],{"class":453},"# => Hello, Alex!\n",[401,1243,1244],{},"Импорт отдельных определений удобнее в работе, потому что вам не придется каждый раз прописывать имя пакета и модуля.\nС другой стороны, другим разработчикам будет сложнее читать код.\nЧтобы узнать, откуда пришли функция и константа, им придется смотреть в блок импортов.\nПопробуем импортировать отдельные определения, то есть саму функцию и аргумент:",[438,1246,1248],{"className":440,"code":1247,"language":442,"meta":443,"style":443},"from package.functions import greet\nfrom package.constants import PERSON\n\ngreet(PERSON)  # => Hello, Alex!\n",[421,1249,1250,1262,1274,1278],{"__ignoreMap":443},[447,1251,1252,1254,1257,1259],{"class":449,"line":450},[447,1253,626],{"class":460},[447,1255,1256],{"class":468}," package.functions ",[447,1258,423],{"class":460},[447,1260,1261],{"class":468}," greet\n",[447,1263,1264,1266,1269,1271],{"class":449,"line":457},[447,1265,626],{"class":460},[447,1267,1268],{"class":468}," package.constants ",[447,1270,423],{"class":460},[447,1272,1273],{"class":478}," PERSON\n",[447,1275,1276],{"class":449,"line":475},[447,1277,496],{"emptyLinePlaceholder":495},[447,1279,1280,1283,1285,1287],{"class":449,"line":492},[447,1281,1282],{"class":468},"greet(",[447,1284,1123],{"class":478},[447,1286,1238],{"class":468},[447,1288,1241],{"class":453},[401,1290,1291],{},"Кроме того, импорты в Python бывают двух видов:",[522,1293,1294,1297],{},[525,1295,1296],{},"Абсолютные;",[525,1298,1299],{},"Относительные.",[401,1301,1302],{},"Для понимания пакетов критически важно обсудить подробности этих двух видов импортов.",[1304,1305,1307],"h5",{"id":1306},"абсолютный-импорт","Абсолютный импорт",[401,1309,1310],{},"В абсолютном импорте нужно прописывать полный путь до модуля, включающий все пакеты и подпакеты.\nПолные пути гарантируют простоту чтения и однозначность — так всем будет понятно, что и откуда импортируется.\nЧтобы вам было удобнее читать код, во всех примерах выше использовался абсолютный импорт.",[1304,1312,1314],{"id":1313},"относительный-импорт","Относительный импорт",[401,1316,1317],{},"Относительные импорты выглядят так:",[438,1319,1321],{"className":440,"code":1320,"language":442,"meta":443,"style":443},"from . import module\nfrom .module import function\nfrom .subpackage.module import CONSTANT\n",[421,1322,1323,1335,1347],{"__ignoreMap":443},[447,1324,1325,1327,1330,1332],{"class":449,"line":450},[447,1326,626],{"class":460},[447,1328,1329],{"class":468}," . ",[447,1331,423],{"class":460},[447,1333,1334],{"class":468}," module\n",[447,1336,1337,1339,1342,1344],{"class":449,"line":457},[447,1338,626],{"class":460},[447,1340,1341],{"class":468}," .module ",[447,1343,423],{"class":460},[447,1345,1346],{"class":468}," function\n",[447,1348,1349,1351,1354,1356],{"class":449,"line":475},[447,1350,626],{"class":460},[447,1352,1353],{"class":468}," .subpackage.module ",[447,1355,423],{"class":460},[447,1357,1358],{"class":478}," CONSTANT\n",[401,1360,1361],{},[734,1362,1363],{},[416,1364,1365],{},"В относительном импорте используется точка, которая означает импорт модуля из текущей директории.",[401,1367,1368,1369,1371,1372,1375,1376,1378,1379,1381,1382,1384,1385,1388],{},"Например, мы работаем с файлом ",[421,1370,418],{}," и хотим импортировать ",[421,1373,1374],{},".module",".\nПри этом мы знаем, что ",[421,1377,418],{}," и ",[421,1380,1374],{}," хранятся в одной и той же директории.\nТогда можно не прописывать абсолютный путь к ",[421,1383,1374],{},", а воспользоваться ",[421,1386,1387],{},". import",".\nПо этой точке Python автоматически определит, что и откуда мы хотим импортировать.",[401,1390,1391],{},"Относительный импорт помогает писать быстрее, но слишком сильно запутывает код, что негативно сказывается на читаемости.\nИменно поэтому в сообществе Python-разработчиков есть распространенный совет для новичков: старайтесь пользоваться абсолютным импортом, даже в самых простых и очевидных случаях.",[969,1393,1395],{"id":1394},"модуль-random","Модуль random",[401,1397,1398],{},"Python знаменит тем, что в нем доступно большое количество стандартных библиотек — так называют модули и пакеты, в которых уже реализованы тысячи разных функций.\nРазработчику полезно разбираться в этих стандартных библиотеках, ведь это знание позволяет экономить время и силы.\nПредлагаю для начала познакомимся с одной из стандартных библиотек — модулем random.",[401,1400,1401],{},"При разработке программ иногда возникает потребность сгенерировать случайное число.\nДля этого в Python можно использовать модуль random. Он предоставляет множество функций, но пока остановимся на двух:",[522,1403,1404,1410],{},[525,1405,1406,1409],{},[421,1407,1408],{},"randint"," — сгенерировать целое число в заданном диапазоне;",[525,1411,1412,1415],{},[421,1413,1414],{},"choice"," — выбрать случайный элемент из заданного набора.",[408,1417,1419],{"id":1418},"генерация-случайных-чисел","Генерация случайных чисел",[401,1421,1422,1423,1425,1426,436],{},"Чтобы сгенерировать случайное число, нужно импортировать функцию ",[421,1424,1408],{}," из модуля ",[421,1427,1428],{},"random",[438,1430,1432],{"className":440,"code":1431,"language":442,"meta":443,"style":443},"from random import randint\n",[421,1433,1434],{"__ignoreMap":443},[447,1435,1436,1438,1441,1443],{"class":449,"line":450},[447,1437,626],{"class":460},[447,1439,1440],{"class":468}," random ",[447,1442,423],{"class":460},[447,1444,1445],{"class":468}," randint\n",[401,1447,1448],{},"Для примера попробуем сгенерировать число от 1 до 100:",[438,1450,1452],{"className":440,"code":1451,"language":442,"meta":443,"style":443},"random_number = randint(1, 100)\n",[421,1453,1454],{"__ignoreMap":443},[447,1455,1456,1459,1461,1464,1467,1470,1473],{"class":449,"line":450},[447,1457,1458],{"class":468},"random_number ",[447,1460,505],{"class":460},[447,1462,1463],{"class":468}," randint(",[447,1465,1466],{"class":478},"1",[447,1468,1469],{"class":468},", ",[447,1471,1472],{"class":478},"100",[447,1474,489],{"class":468},[401,1476,1477,1478,1480],{},"Обратите внимание, что обе границы диапазона включены — значит, ",[421,1479,1408],{}," может выдать любое значение в диапазоне, в том числе 1 и 100.\nПерейдем к более сложному примеру:",[438,1482,1484],{"className":440,"code":1483,"language":442,"meta":443,"style":443},"string = 'abcde'\nrandom_index = randint(0, len(string) - 1)\nchar = string[random_index]\n",[421,1485,1486,1496,1524],{"__ignoreMap":443},[447,1487,1488,1491,1493],{"class":449,"line":450},[447,1489,1490],{"class":468},"string ",[447,1492,505],{"class":460},[447,1494,1495],{"class":485}," 'abcde'\n",[447,1497,1498,1501,1503,1505,1508,1510,1513,1516,1519,1522],{"class":449,"line":457},[447,1499,1500],{"class":468},"random_index ",[447,1502,505],{"class":460},[447,1504,1463],{"class":468},[447,1506,1507],{"class":478},"0",[447,1509,1469],{"class":468},[447,1511,1512],{"class":478},"len",[447,1514,1515],{"class":468},"(string) ",[447,1517,1518],{"class":460},"-",[447,1520,1521],{"class":478}," 1",[447,1523,489],{"class":468},[447,1525,1526,1529,1531],{"class":449,"line":475},[447,1527,1528],{"class":468},"char ",[447,1530,505],{"class":460},[447,1532,1533],{"class":468}," string[random_index]\n",[401,1535,1536],{},"Здесь программа должна выбрать случайный символ из строки string. При этом:",[522,1538,1539,1542,1545],{},[525,1540,1541],{},"Строка в переменной string имеет длину 5;",[525,1543,1544],{},"Индекс последнего элемента в строке равен 4;",[525,1546,1547],{},"Символы строки индексируются с нуля.",[401,1549,1550,1551,1554],{},"Если мы попробуем сгенерировать число через ",[421,1552,1553],{},"randint(0, 5)",", то в какой-то момент получим значение 5.\nТогда программа выдаст ошибку IndexError: она не сможет выдать пятый символ из четырех.\nКак это предотвратить? Нужно не просто задать верхнюю границу диапазона, а вычислить ее — то есть вычесть единицу из длины строки.\nИменно так и сделано в примере кода выше.",[408,1556,1558],{"id":1557},"выбор-случайного-элемента","Выбор случайного элемента",[401,1560,1561,1562,1564,1565,1567],{},"Выше мы рассмотрели пример, в котором выбирается случайный символ строки.\nЭта задача возникает достаточно часто, поэтому в модуле ",[421,1563,1428],{}," существует функция ",[421,1566,1414],{},".\nЕсли использовать эту функцию, выбор случайного символа из строки будет выглядеть так:",[438,1569,1571],{"className":440,"code":1570,"language":442,"meta":443,"style":443},"from random import choice\n\nstring = 'abcde'\nchar = choice(string)\n",[421,1572,1573,1584,1588,1596],{"__ignoreMap":443},[447,1574,1575,1577,1579,1581],{"class":449,"line":450},[447,1576,626],{"class":460},[447,1578,1440],{"class":468},[447,1580,423],{"class":460},[447,1582,1583],{"class":468}," choice\n",[447,1585,1586],{"class":449,"line":457},[447,1587,496],{"emptyLinePlaceholder":495},[447,1589,1590,1592,1594],{"class":449,"line":475},[447,1591,1490],{"class":468},[447,1593,505],{"class":460},[447,1595,1495],{"class":485},[447,1597,1598,1600,1602],{"class":449,"line":492},[447,1599,1528],{"class":468},[447,1601,505],{"class":460},[447,1603,1604],{"class":468}," choice(string)\n",[401,1606,1607,1608,1610,1611,1614],{},"Используя ",[421,1609,1414],{},", не нужно думать о границах диапазона — функция сама определяет, как правильно выбирать элементы.\nПри этом важно, чтобы строка для выбора не была пустой.\nИначе мы получим ошибку ",[421,1612,1613],{},"IndexError: Cannot choose from an empty sequence"," т.е. «Нельзя выбрать из пустой строки».",[401,1616,1617,1618,1621,1622],{},"В основе модуля random лежит генератор псевдослучайных чисел — на самом деле, число выбирается не случайно, а на основе сложных математических вычислений.\nИз-за этого random не принято использовать в сферах, где нужна повышенная безопасность.\nВ криптографии, шифровании и других подобных сферах используют модуль ",[421,1619,1620],{},"secrets",", в основе которого менее предсказуемый механизм случайной генерации.\nПодробнее о модуле random почитайте по ссылке: ",[1623,1624,1628],"a",{"href":1625,"rel":1626},"https:\u002F\u002Fdocs.python.org\u002F3.11\u002Flibrary\u002Frandom.html",[1627],"nofollow","Документация по модулю random.",[401,1630,1631],{},[1623,1632,1635],{"href":1633,"rel":1634},"https:\u002F\u002Fru.wikipedia.org\u002Fwiki\u002F%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_%D0%BF%D1%81%D0%B5%D0%B2%D0%B4%D0%BE%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B9%D0%BD%D1%8B%D1%85_%D1%87%D0%B8%D1%81%D0%B5%D0%BB",[1627],"Статья про генерацию случайных чисел.",[401,1637,1638,1639,1642,1643,1646],{},"Попробуйте сами запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает.\nДля этого в ячейке с кодом нажмите клавиши на клавиатуре ",[416,1640,1641],{},"Shift+Enter"," или запустите код через ",[416,1644,1645],{},"кнопку Run"," по значку ▶.",[1648,1649],"jypiter",{},[1651,1652,1653],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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);}",{"title":443,"searchDepth":457,"depth":499,"links":1655},[1656],{"id":399,"depth":457,"text":198,"children":1657},[1658,1659,1660,1661,1662,1663,1671],{"id":410,"depth":492,"text":411},{"id":539,"depth":492,"text":540},{"id":619,"depth":492,"text":620},{"id":744,"depth":492,"text":745},{"id":782,"depth":492,"text":783},{"id":971,"depth":475,"text":972,"children":1664},[1665,1666,1667],{"id":978,"depth":492,"text":979},{"id":1075,"depth":492,"text":1076},{"id":1186,"depth":492,"text":1187,"children":1668},[1669,1670],{"id":1306,"depth":499,"text":1307},{"id":1313,"depth":499,"text":1314},{"id":1394,"depth":475,"text":1395,"children":1672},[1673,1674],{"id":1418,"depth":492,"text":1419},{"id":1557,"depth":492,"text":1558},"2025-02-22","Работа с модулями. Объединение отдельных модулей в пакет. Пример использования модуля random","md","images\u002Fblog\u002Fpython\u002Fst11\u002Fimg.png",{},20,11,{"title":198,"description":1676},"Yl9TNx-37HKu8864AdZDscbnE_EmuYyMgrXPExJm-Is",[1685,1687],{"title":194,"path":195,"stem":196,"description":1686,"children":-1},"Поиск ошибок в коде. Типы ошибок. Способы отладки",{"title":202,"path":203,"stem":204,"description":1688,"children":-1},"Работа с кортежами. Извлечение значений и разделения кортежей",1780737508768]