однострочники пайтон. Однострочники Python лаконичный и содержательный код by Кристи. Однострочники
Скачать 4.44 Mb.
|
246 Глава 6. Алгоритмы True . Просматриваемый подсписок пуст — и мы не нашли значение x . Это граничный случай нашей рекурсии. Поскольку мы не нашли элемент x , то возвращаем –1 , указывая, что искомого элемента не существует. Для поиска срединного элемента подсписка мы прибегнем к формуле (lo+hi)//2 . Если он оказывается искомым, то возвращаем его индекс . Обратите внимание, что здесь используется целочисленное деление для округления вниз к ближайшему целочисленному значению, которое можно применять в качестве индекса списка. Если срединный элемент больше желаемого значения, значит, все элементы справа тоже больше него, поэтому можно произвести рекурсивный вызов функции, но изменить индекс hi так, чтобы далее анализировать только элементы списка слева от срединного элемента . Аналогично, если срединный элемент меньше желаемого значения, то можно не просматривать элементы слева от него, поэтому можно про- извести рекурсивный вызов функции, но изменить индекс lo так, чтобы далее анализировать только элементы списка справа от срединного эле- мента . Поиск значения 33 в списке [3, 6, 14, 16, 33, 55, 56, 89] возвращает ин- декс 4 Материал этого раздела должен укрепить ваше общее понимание кода в том, что касается условного выполнения, основных ключевых слов и арифме- тических операций, а также важного вопроса доступа по индексу к после- довательностям программным образом. Но что еще важнее, вы узнали, как упрощать решение сложных задач с помощью рекурсии. Рекурсивный алгоритм быстрой сортировки А сейчас мы создадим однострочник для популярного алгоритма быстрой сортировки (Quicksort) — алгоритма сортировки, который, как ясно из его названия, быстро сортирует данные. Общее описание Быстрая сортировка — частый вопрос на многих собеседованиях (его задают в Google, Facebook и Amazon), а также быстрый, лаконичный и удобочитаемый Рекурсивный алгоритм быстрой сортировки 247 алгоритм сортировки. Благодаря изяществу быстрой сортировки о ней рас- сказывается в большинстве курсов для начинающих. Быстрая сортировка сортирует список путем рекурсивного разбиения боль- шой задачи на меньшие и объединения решений этих меньших задач так, чтобы получить решение большей. Для решения каждой из меньших задач используется рекурсивно та же стратегия: меньшие задачи разбиваются на еще меньшие подзадачи, решае- мые по отдельности и объединяемые, так что быстрая сортировка относится к алгоритмам, работающим по принципу разделяй и властвуй. При быстрой сортировке выбирается опорный элемент (pivot element), а за- тем все элементы, которые больше него, помещаются справа от него, а все элементы, которые меньше или равны ему, — слева. Таким образом, большая задача сортировки списка разбивается на две меньшие подзадачи сортировки двух меньших списков. А затем эта процедура повторяется рекурсивно до тех пор, пока не получится список из нуля элементов, попытка сортировки которого приводит к завершению рекурсии. На рис. 6.13 показан алгоритм быстрой сортировки в действии. Рис. 6.13. Пример работы алгоритма быстрой сортировки На рис. 6.13 показано применение алгоритма быстрой сортировки к неотсор тированному списку целых чисел [4, 1, 8, 9, 3, 8, 1, 9, 4]. Сначала 248 Глава 6. Алгоритмы он выбирает 4 в качестве опорного элемента, разбивает список на неот- сортированный подсписок [1, 3, 1, 4], все элементы которого меньше или равны опорному, и неотсортированный подсписок [8, 9, 8, 9], все элементы которого больше опорного. Далее алгоритм быстрой сортировки вызывается рекурсивно для сортировки двух неотсортированных подсписков. Как только размер подсписков дохо- дит до не более чем одного элемента, считается, что они отсортированы по определению, и рекурсия завершается. На каждом шаге рекурсии производится конкатенация трех подсписков (левого, опорного и правого) перед передачей итогового списка на более высокий уровень рекурсии. Код Мы создадим функцию q , которая реализует алгоритм быстрой сортировки в одной строке кода Python и сортирует любой аргумент, переданный в нее в виде списка целых чисел (листинг 6.14). Листинг 6.14. Однострочная реализация алгоритма быстрой сортировки с помощью рекурсии ## Данные unsorted = [33, 2, 3, 45, 6, 54, 33] ## Однострочник q = lambda l: q([x for x in l[1:] if x <= l[0]]) + [l[0]] + q([x for x in l if x > l[0]]) if l else [] ## Результат print(q(unsorted)) Можете угадать — последний раз — результаты выполнения фрагмента кода? Принцип работы Этот однострочник полностью воспроизводит алгоритм, который мы только что обсуждали. Во-первых, мы создаем новую лямбда-функцию q , при- нимающую в качестве аргумента список l , который нужно отсортировать. В укрупненном виде структура этой лямбда-функции выглядит следующим образом: lambda l: q(левый) + опорный_элемент + q(правый) if l else [] Итоги главы 249 При граничном случае рекурсии — когда список пуст и, следовательно, сортируется тривиальным образом — лямбда-функция возвращает пустой список [] Во всех прочих случаях функция берет в качестве первого элемента спи- ска l опорный_элемент и делит все элементы на два подсписка ( левый и пра- вый ), в зависимости от того, меньше или больше они, чем опорный_элемент Для этого мы воспользуемся обычным списковым включением (см. главу 2). А поскольку эти два подсписка, вероятно, не отсортированы, мы рекурсивно вызываем алгоритм быстрой сортировки и для них. Наконец, мы объединяем все три списка и возвращаем итоговый отсортированный список. Результат выглядит следующим образом: ## Результат print(q(unsorted)) # [2, 3, 6, 33, 33, 45, 54] Итоги главы В этой главе вы изучили алгоритмы, имеющие большое значение в computer science. Они предназначены для решения широкого спектра задач, связан- ных с анаграммами, палиндромами, булеанами, перестановками, фактори- алами, простыми числами, числами Фибоначчи, шифрованием, поиском и сортировкой. Многие из них лежат в основе более сложных алгоритмов и входят во все полноценные курсы теории алгоритмов. Совершенствова- ние практических и теоретических знаний алгоритмов — один из самых эффективных способов стать профессиональным программистом. Я бы даже рискнул утверждать, что недостаточное понимание алгоритмов — основная причина того, что большинство посредственных программистов не могут продвинуться дальше в обучении. Чтобы помочь решить эту проблему, я регулярно рассказываю о различных алгоритмах в своей почтовой рассылке Coffee Break Python («Python за чашкой кофе») (подписаться можно по адресу https://blog.finxter.com/subscribe/ ). Я высоко ценю то время и усилия, которые вы потратили на изучение всех фрагментов кода однострочников и пояснений к ним, и надеюсь, что вы уже заметили значительный прогресс в своих навыках. По моему опыту обучения тысяч изучающих Python, более половины программистов среднего уровня с трудом понимают простейшие однострочники на языке Python. Немного прилежания и упорства — и вы обойдете их и станете настоящим знатоком Python (или, по крайней мере, войдете в 10 % лучших программистов). Послесловие Поздравляю! Вы одолели всю книгу и овладели однострочниками Python на уровне, доступном лишь немногим. Вы заложили прочный фундамент, который поможет вам выйти за рамки своих нынешних навыков программи- рования на Python. Благодаря внимательному изучению всех приведенных однострочников Python вы сможете справиться с любой строкой кода на Python, какую только встретите. Подобные знания, как и любые другие, следует использовать с умом. Зло- употребление однострочниками может только навредить вашим проектам. В этой книге все алгоритмы сжимались в одну строку кода для того, чтобы вы лучше стали понимать свой код. Но будьте осторожны и не злоупотребляйте обретенными навыками в своих реальных проектах. Не старайтесь впихнуть все в одну строку кода просто для того, чтобы похвастаться своими способ- ностями по написанию однострочников. Вместо этого воспользуйтесь ими, чтобы повысить удобочитаемость суще- ствующих баз кода путем распутывания самых сложных однострочников. Подобно тому как Супермен использует свои сверхспособности, чтобы по- мочь обычным людям жить нормальной жизнью, так и вы можете помочь программистам вести нормальную программистскую жизнь. Главная задача этой книги — помочь вам овладеть в совершенстве одно- строчниками Python. Если вы считаете, что она справилась с данной задачей, напишите отзыв о ней, чтобы и другие могли открыть ее для себя. Кроме того, я призываю вас сообщать мне по адресу chris@finxter.com обо всех найденных в этой книге ошибках, а также присылать любые позитивные или негатив- ные замечания и комментарии. Мы планируем непрерывно улучшать эту книгу и учитывать в будущих изданиях обратную связь читателей, так что я обещаю бесплатную копию моей электронной книги Coffee Break Python Slicing за любые конструктивные замечания. Послесловие 251 Наконец, если вы стремитесь постоянно развивать свои навыки Python, то подпишитесь на мою рассылку о Python по адресу https://blog.finxter.com/ subscribe/ , в которой я почти каждый день публикую свежие обучающие материалы по computer science наподобие шпаргалок по Python, открывая тем самым вам и тысячам других программистов путь к непрерывному со- вершенствованию и, в конечном итоге, овладению всеми секретами Python. Теперь, научившись разбираться в отдельных строках кода, вы можете пере- ключить внимание на более крупные проекты. Почитайте материалы об объектно-ориентированном программировании и управлении проектами, а главное, найдите для себя реальные проекты, над которыми могли бы не- прерывно работать. Это повысит ваши способности к обучению, мотивирует и вдохновит на новые достижения, повысит вашу стоимость на рынке труда, да и вообще это наиболее эффективная форма обучения. Ничто не сравнится с реальной работой в смысле эффективности обучения. Я рекомендую моим студентам тратить по крайней мере 70 % выделенного на учебу времени на практическую работу над проектами. Если у вас есть 100 минут в день на учебу, то тратьте 70 из них на практическую работу над кодом и лишь 30 — на чтение книг и изучение различных курсов и руко- водств. Как это ни очевидно, большинство людей делают наоборот и в итоге так никогда и не чувствуют готовности начать работать над реальными проектами. Мне было очень приятно провести с вами столько времени, и я высоко ценю усилия, приложенные вами к изучению этого руководства. Надеюсь, это окупится сторицей! Всего самого лучшего в вашей карьере программиста, и надеюсь, что мы еще встретимся! Удачного написания кода! Крис Кристиан Майер Однострочники Python: лаконичный и содержательный код Перевел с английского И. Пальти Руководитель дивизиона Ю. Сергиенко Руководитель проекта А. Питиримов Ведущий редактор Н. Гринчик Литературный редактор Н. Хлебина Художественный редактор В. Мостипан Корректоры О. Андриевич, Н. Викторова Верстка Л. Егорова Изготовлено в России. Изготовитель: ООО «Прогресс книга». Место нахождения и фактический адрес: 194044, Россия, г. Санкт-Петербург, Б. Сампсониевский пр., д. 29А, пом. 52. Тел.: +78127037373. Дата изготовления: 11.2021. Наименование: книжная продукция. Срок годности: не ограничен. Налоговая льгота — общероссийский классификатор продукции ОК 034-2014, 58.11.12 — Книги печатные профессиональные, технические и научные. Импортер в Беларусь: ООО «ПИТЕР М», 220020, РБ, г. Минск, ул. Тимирязева, д. 121/3, к. 214, тел./факс: 208 80 01. Подписано в печать 13.10.21. Формат 70×100/16. Бумага офсетная. Усл. п. л. 20,640. Тираж 1000. Заказ 0000. Михал Яворски, Тарек Зиаде PYTHON. ЛУЧШИЕ ПРАКТИКИ И ИНСТРУМЕНТЫ Python — это динамический язык программирования, используемый в самых разных предметных областях. Хотя писать код на Python просто, гораздо сложнее сделать этот код удобочитаемым, пригодным для многократного ис- пользования и легким в поддержке. Третье издание «Python. Лучшие практики и инструменты» даст вам инструменты для эффективного решения любой за- дачи разработки и сопровождения софта. Авторы начинают с рассказа о новых возможностях Python 3.7 и продвинутых аспектах синтаксиса Python. Продолжают советами по реализации популярных парадигм, в том числе объектно-ориентированного, функционального и со- бытийно-ориентированного программирования. Также авторы рассказывают о наилучших практиках именования, о том, какими способами можно автома- тизировать развертывание программ на удаленных серверах. Вы узнаете, как создавать полезные расширения для Python на C, C++, Cython и CFFI. КУПИТЬ___Дэн_Берг_Джонсон,_Дэниел_Деоган,_Дэниел_Савано_БЕЗОПАСНО_BY_DESIGN'>КУПИТЬ___Джастин_Зейтц,_Тим_Арнольд_BLACK_HAT_PYTHON:_ПРОГРАММИРОВАНИЕ_ДЛЯ_ХАКЕРОВ_И_ПЕНТЕСТЕРОВ,_2-е_изд.'>КУПИТЬ Джастин Зейтц, Тим Арнольд BLACK HAT PYTHON: ПРОГРАММИРОВАНИЕ ДЛЯ ХАКЕРОВ И ПЕНТЕСТЕРОВ, 2-е изд. Когда речь идет о создании мощных и эффективных хакерских инструментов, большинство аналитиков по безопасности выбирают Python. Во втором изда- нии бестселлера Black Hat Python вы исследуете темную сторону возможностей Python — все от написания сетевых снифферов, похищения учетных данных электронной почты и брутфорса каталогов до разработки мутационных фаз- зеров, анализа виртуальных машин и создания скрытых троянов. КУПИТЬ Дэн Берг Джонсон, Дэниел Деоган, Дэниел Савано БЕЗОПАСНО BY DESIGN «Безопасно by Design» не похожа на другие книги по безопасности. В ней нет дискуссий на такие классические темы, как переполнение буфера или слабые места в криптографических хэш-функциях. Вместо собственно безопасности авторы концентрируются на подходах к разработке ПО. Поначалу это может показаться немного странным, но вы поймете, что недостатки безопасности часто вызваны плохим дизайном. Значительного количества уязвимостей можно избежать, используя передовые методы проектирования. Изучение того, как дизайн программного обеспечения соотносится с безопасностью, является целью этой книги. Вы узнаете, почему дизайн важен для безопасности и как его использовать для создания безопасного программного обеспечения. КУПИТЬ Том Лащевски, Камаль Арора, Эрик Фарр, Пийум Зонуз ОБЛАЧНЫЕ АРХИТЕКТУРЫ: РАЗРАБОТКА УСТОЙЧИВЫХ И ЭКОНОМИЧНЫХ ОБЛАЧНЫХ ПРИЛОЖЕНИЙ Облачные вычисления — это, пожалуй, наиболее революционная разработка в IT со времен виртуализации. Облачно-ориентированные архитектуры обеспе- чивают большую гибкость по сравнению с системами предыдущего поколения. В этой книге продемонстрированы три важнейших аспекта развертывания современных cloud native архитектур: организационное преобразование, модернизация развертывания, паттерны облачного проектирования. Книга начинается с краткого знакомства с облачно-ориентированными архи- тектурами — на примерах объясняется, какие черты им присущи, а какие нет. Вы узнаете, как организуется внедрение и разработка облачных архитектур с применением микросервисов и бессерверных вычислений как основ про- ектирования. Далее вы изучите такие столпы облачно-ориентированного проектирования, как масштабируемость, оптимизация издержек, безопасность и способы достижения безупречной эксплуатационной надежности. В заклю- чительных главах будет рассказано о различных общедоступных архитектурах cloud native, — от AWS и Azure до Google Cloud Platform. КУПИТЬ |