однострочники пайтон. Однострочники Python лаконичный и содержательный код by Кристи. Однострочники
Скачать 4.44 Mb.
|
Пример однострочника Python Главный посыл этой книги состоит в том, что изучение однострочников Python не только необходимо для понимания более сложных баз кода, но и позволит усовершенствовать навыки программирования. Прежде чем разбираться, что происходит в базе кода на многие тысячи строк, следует понять смысл отдельных строк кода. Рассмотрим один однострочник Python. Не волнуйтесь, если не совсем по- нимаете, что в нем происходит. Мы расскажем о нем подробнее в главе 6. 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 [] Этот однострочник — изящный лаконичный пример выражения известного алгоритма быстрой сортировки (Quicksort) 1 , хотя начинающим и не слиш- ком опытным программистам на Python будет непросто уловить его смысл. В основе однострочников Python часто лежат другие однострочники, так что сложность рассматриваемых однострочников будет расти от главы к главе. Мы начнем с простых однострочников, которые далее станут основой для других, более сложных. Например, предыдущий однострочник для быстрой сортировки — сложный и длинный, но в его основе лежит более простая идея спискового включения . Вот более простое списковое включение, предназначенное для создания списка квадратов чисел: lst = [x**2 for x in range(10)] 1 Она же сортировка Хоара. — Здесь и далее примечания переводчика. 16 Введение Можно разбить этот однострочник на еще более простые, чтобы познакомиться с важнейшими базовыми понятиями Python, например присваиванием пере- менных, математическими операторами, структурами данных, циклами for , операторами принадлежности и функцией range , — и все это в одной строке! Учтите, что базовые не значит тривиальные. Все однострочники, о которых мы будем говорить, полезны, и каждая глава посвящена какой-либо отдель- ной сфере или дисциплине компьютерных наук, что позволяет продемон- стрировать в книге весь спектр возможностей Python. Примечание относительно удобочитаемости «Дзен языка Python» состоит из 19 руководящих принципов программиро- вания на языке Python. Можете прочитать их в командной оболочке Python с помощью команды import this : >>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. Flat is better than nested. Sparse is better than dense. Readability counts. --обрезано-- Согласно «Дзену языка Python», «удобочитаемость важна». Одностроч- ники — минималистичные программы для решения различных задач. Во многих случаях переписывание фрагмента кода Python в виде одностроч- ника повышает его удобочитаемость и делает стиль кода ближе к стан- дартам Python. Один из примеров — использование спискового включения для свертки процедуры создания списка в одну строку кода. Взгляните на следующий пример: # До squares = [] for i in range(10): squares.append(i**2) print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] Для кого эта книга 17 Здесь для создания списка из десяти квадратов первых чисел и вывода их в командную оболочку требуется пять строк кода. Однако однострочное решение намного проще, та же самая задача решается намного лаконичнее и удобнее для чтения: # После print([i**2 for i in range(10)]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] Выводимые результаты — такие же, но этот однострочник использует более свойственную Python идею спискового включения. Подобный код легче читать, и места он занимает меньше. Однако понять, что делают некоторые однострочники Python, бывает непро- сто. В ряде случаев при написании решения в виде однострочника Python страдает удобочитаемость. Но подобно тому, как гроссмейстер должен знать все возможные ходы, прежде чем выбрать лучший, программисту необхо- димо знать все способы выражения в коде своих мыслей, чтобы выбрать лучший. Поиск самого красивого решения — не вопрос второстепенной важ- ности, а сама суть экосистемы Python. Как учит нас «Дзен языка Python», «красивый код лучше, чем уродливый». Для кого эта книга Вы — начинающий программист на Python или уже достигли среднего уровня? Как и многие, вы наверняка чувствовали, что как программист за- стряли в своем развитии. Книга поможет вам выбраться из этой ситуации. Вы прочитали множество руководств по программированию в интернете. Вы уже писали собственный код и запускали в промышленную эксплуатацию небольшие проекты. Вы изучили курс основ программирования и прочитали один-два учебника по нему. Возможно, вы даже изучали основы компьютер- ных наук и программирования в университете. Возможно, вас сдерживают определенные убеждения, например, что боль- шинство программистов разбирается в исходном коде намного быстрее вас или что вам очень далеко до 10 % лучших программистов. Чтобы достичь продвинутого уровня написания кода и присоединиться к сообществу луч- ших экспертов, вам необходимо получить еще некоторые навыки. Мне легко поставить себя на ваше место, поскольку когда я только начинал изучать computer science десять лет назад, я мучительно боролся с чувством, 18 Введение что ничего не знаю о написании кода. А мои сверстники казались уже очень опытными и компетентными в этой сфере. Цель книги — помочь вам преодолеть помеху в виде подобных субъектив- ных убеждений и продвинуться на шаг дальше в овладении возможностями Python. Чему книга вас научит Ниже представлен общий перечень того, что вы узнаете из книги. Глава 1 «Краткая памятка по Python» описывает основы Python в целях освежения ваших знаний. Глава 2 «Трюки Python» содержит десять однострочных приемов, с по- мощью которых вы освоите основы языка: списковые включения, ввод данных из файлов, использование функций lambda , map() и zip() , кван- тификатора all() , срезов, а также простейшую арифметику списков. Вы также узнаете, как полноценно использовать различные структуры данных и выполнять операции над ними для решения разнообразных повседневных задач. Глава 3 «Наука о данных» содержит десять однострочников для data science, основанных на библиотеке NumPy. Эта библиотека — централь- ный элемент обширной функциональности Python для машинного об- учения и науки о данных. Вы изучите такие основные понятия NumPy, как массив, форма, оси координат, тип, транслирование, расширенная индексация, срезы, сортировка, поиск, агрегирование и сводные по- казатели. Глава 4 «Машинное обучение» охватывает десять однострочников, предназначенных для машинного обучения с помощью библиотеки scikit-learn языка Python. Вы узнаете о регрессионных алгоритмах, предназначенных для предсказания значений. В их числе — линейная регрессия, метод k-ближайших соседей и нейронные сети. Кроме того, рассказывается об алгоритмах классификации, таких как логисти- ческая регрессия, обучение с помощью деревьев принятия решений, метод опорных векторов и случайные леса. Более того, вы научитесь вычислять простейшие сводные показатели многомерных массивов данных и использовать алгоритм k-средних для обучения без учителя. Источники дополнительной информации в интернете 19 Эти алгоритмы и методы входят в число важнейших алгоритмов в сфе- ре машинного обучения. Глава 5 «Регулярные выражения» содержит десять однострочников, которые позволят вам еще профессиональнее использовать регулярные выражения. Вы узнаете о множестве различных простых регулярных выражений, которые можно сочетать для создания более сложных с по- мощью группировки и поименованных групп, негативного опережающе- го просмотра, экранированных символов, пробелов, наборов символов (в том числе негативных) и «жадных»/«нежадных» операторов. Глава 6 «Алгоритмы» содержит десять однострочных алгоритмов, пред- назначенных для решения широкого спектра задач computer science, включающих анаграммы, палиндромы, надмножества, перестановки, факториалы, простые числа, числа Фибоначчи, обфускацию, поиск и сортировку. Многие из них составляют основу более продвинутых алгоритмов и включают элементы формального алгоритмического образования. Послесловие завершает данную книгу, подытоживая ваш солидный багаж как совершенно новых, так и улучшенных старых навыков написания кода на языке Python. Источники дополнительной информации в интернете В дополнение к изложенному в данной книге материалу вы можете най- ти онлайн, на сайтах https://pythononeliners.com/ и http://www.nostarch.com/ pythononeliners , и другие материалы. В числе этих интерактивных источников: шпаргалки по Python — можете скачать их в виде подходящих для рас- печатки PDF-файлов и повесить себе на стену. Они содержат описание основных возможностей языка Python; внимательно их изучив, можно освежить свои навыки Python и закрыть все пробелы в знаниях; видеоуроки по однострочникам — в качестве части моего курса Python, проводившегося по электронной почте, я записал немало уроков по однострочникам Python из данной книги, они находятся в свободном доступе для просмотра. Эти уроки помогут вам изучать одностроч- ники, выступая в качестве мультимедийных обучающих материалов; 20 Введение задачки по Python — в этих онлайн-материалах можно найти немало интересных задач по Python, а с помощью бесплатного приложения Finxter.com можно экспериментировать и оттачивать навыки Python, оценивая прогресс обучения по мере чтения книги; файлы кода и блокноты Jupyter — закатайте рукава и начните работать с кодом, чтобы на высоком уровне овладеть Python. Не жалейте време- ни на эксперименты с различными значениями параметров и входных данных. Для вашего удобства я включил все однострочники Python в виде исполняемых файлов кода. От издательства Ваши замечания, предложения, вопросы отправляйте по адресу comp@piter. com (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах. 1 Краткая памятка по Python Задача главы — освежить в вашей памяти основные структуры данных, ключевые слова, операции управ- ления потоком команд и прочие азы. Я писал эту книгу для программистов на Python среднего уровня, которые хотели бы достичь новых высот профессионализма. Чтобы стать настоящим специалистом, необходимо тщательно изучить все основы. Разобравшись с основами, вы сможете охватить взглядом более широкую картину — это умение пригодится вам вне зависимости от того, кем вы хотите стать: техническим руководителем проекта в Google, доктором компьютер- ных наук или просто первоклассным программистом. Например, доктора компьютерных наук обычно досконально знают все основы своего предмета и могут аргументированно излагать свою позицию, а также находить про- белы, не охваченные исследованиями. Этих людей не ослепляют новейшие технологические достижения. В данной главе приведены важнейшие основы Python, которые станут фундаментом для более сложных вопросов, обсуж- даемых далее в книге. Основные структуры данных Доскональное понимание структур данных — один из важнейших навыков любого программиста. Оно пригодится вам в любом случае: разрабатываете 22 Глава 1. Краткая памятка по Python ли вы проекты машинного обучения, работаете ли с большими базами кода, создаете ли сайты и управляете ими или же пишете алгоритмы. Числовые типы данных и структуры Два важнейших числовых типа данных — integer (целое число) и float (число с плавающей точкой). Integer — положительное или отрицательное число без плавающей точки (например, 3). Float — положительное или отрицательное число, для которого задана определенная точность вычислений с плавающей точкой (например, 3.14159265359). Python предоставляет широкий выбор встроенных числовых операций, а также функциональность для преоб- разования между этими числовыми типами данных. Внимательно изучите примеры в листинге 1.1, чтобы освоить эти чрезвычайно важные числовые операции. Листинг 1.1. Числовые типы данных ## Арифметические операции x, y = 3, 2 print(x + y) # = 5 print(x - y) # = 1 print(x * y) # = 6 print(x / y) # = 1.5 print(x // y) # = 1 print(x % y) # = 1 print(-x) # = -3 print(abs(-x)) # = 3 print(int(3.9)) # = 3 print(float(x)) # = 3.0 print(x ** y) # = 9 Большинство этих операторов очевидны. Обратите внимание, что опера- тор // служит для целочисленного деления и возвращает округленное вниз целочисленное значение (например, 3 // 2 == 1 ). Булевы значения Переменная типа Boolean может принимать только одно из двух значений — False и True В языке Python типы данных Boolean и integer тесно связаны: «под капотом» типа данных Boolean используются значения типа integer (по умолчанию булево значение False представлено целочисленным значением 0 , а булево Основные структуры данных 23 значение True —целочисленным значением 1 ). В листинге 1.2 приведен при- мер этих двух ключевых слов Boolean. Листинг 1.2. Булевы значения False и True x = 1 > 2 print(x) # False y = 2 > 1 print(y) # True После вычисления значений указанных выражений переменная x будет ссы- латься на булево значение False , а переменная y — на булево значение True Создать более сложные выражения на языке Python можно с помощью булевых значений, содержащих три следующих важных ключевых слова. Ключевые слова: and, or, not Булевы выражения соответствуют основным логическим операторам. Соче- тание их всего с тремя следующими ключевыми словами позволяет создавать обширный спектр потенциально весьма сложных выражений: and — выражение x and y равно True , если x равно True и y равно True Если же хотя бы одно из них равно False , то и все выражение в целом будет равно False ; or — выражение x or y равно True , если x равно True или y равно True Если же хотя бы одно из них равно True , то и все выражение в целом будет равно True ; not — выражение not x равно True , если x равно False . В противном случае это выражение равно False Рассмотрим следующий фрагмент кода, представленный в листинге 1.3. Листинг 1.3. Ключевые слова and, or и not x, y = True, False print((x or y) == True) # True print((x and y) == False) 24 Глава 1. Краткая памятка по Python # True print((not y) == True) # True С помощью этих трех ключевых слов можно выразить любые логические выражения, которые только могут понадобиться. Приоритет булевых операторов Для понимания булевой логики очень важен порядок применения булевых операторов. Например, рассмотрим выражение на естественном языке "идет дождь и холодно или ветрено" . Его можно интерпретировать двояко: "(идет дождь и холодно) или ветрено" — в этом случае выражение будет истинным, если ветрено, — даже если дождь не идет; "идет дождь и (холодно или ветрено)" — в этом же случае выражение будет ложным, если дождь не идет, — неважно, холодно или дует ветер. Порядок булевых операторов важен. Правильной будет первая интерпре- тация выражения, поскольку оператор логического И ( and ) обладает при- оритетом перед оператором логического ИЛИ ( or ). Рассмотрим фрагмент кода, приведенный в листинге 1.4. Листинг 1.4. Тип данных Boolean ## 1. Булевы операции x, y = True, False print(x and not y) # True print(not x and y or x) # True ## 2. Если вычисление значения условия дает False if None or 0 or 0.0 or '' or [] or {} or set(): print("Dead code") # Не достигается Этот код демонстрирует два важных нюанса. Во-первых, булевы операторы подчиняются правилам приоритета: наивысший приоритет у оператора not , далее следует оператор and , а затем оператор or . Во-вторых, следующие значения автоматически вычисляются как равные False : ключевое слово Основные структуры данных 25 None , целочисленное значение 0 , значение с плавающей точкой 0.0 , пустые строки и пустые объекты контейнерных типов. Строковые значения Строки Python представляют собой последовательности символов. Они неизменяемы, а после создания не могут быть модифицированы. Хотя существуют и другие способы создания строковых значений, чаще всего применяются следующие пять: одинарные кавычки: 'Yes' ; двойные кавычки: "Yes" ; тройные кавычки для многострочных строковых значений: '''Yes''' или """Yes""" ; методы для работы со строками: str(5) == '5' равно True ; конкатенация: 'Py' + 'thon' равно 'Python' Нередко в строковых значениях приходится использовать пробельные сим- волы. В число чаще всего применяемых пробельных символов входит символ новой строки \n , символ пробела \s и символ табуляции \t В листинге 1.5 приведены важнейшие методы для работы со строками. Листинг 1.5. Строковые типы данных ## Важнейшие методы для работы со строками y = " This is lazy\t\n " print(y.strip()) # Удаляем пробелы: 'This is lazy' print("DrDre".lower()) # В нижнем регистре: 'drdre' print("attention".upper()) # В верхнем регистре: 'ATTENTION' print("smartphone".startswith("smart")) # Сопоставляет префикс строки с аргументом: True print("smartphone".endswith("phone")) # Сопоставляет суффикс строки с аргументом: True print("another".find("other")) 26 Глава 1. Краткая памятка по Python # Индекс найденного вхождения: 2 print("cheat".replace("ch", "m")) # Заменяет все вхождения первого аргумента на второй: meat print(','.join(["F", "B", "I"])) # Склеивает все элементы списка, используя строку-разделитель: F,B,I print(len("Rumpelstiltskin")) # Длина строки: 15 print("ear" in "earth") # Содержится: True Этот далеко не полный список методов для работы со строками демон- стрирует широкие возможности типа данных string, позволяющие решать распространенные задачи работы со строками с помощью встроенной функциональности Python. Если вы не знаете, как решить какую-то задачу, связанную со строками, то загляните в онлайн-руководство, в котором пере- числены все методы для работы со строками: https://docs.python.org/3/library/ string.html#module-string Boolean, integer, float и string — важнейшие основные типы данных в язы- ке Python. Но нередко приходится не просто создавать элементы данных, а и структурировать их. В подобных случаях вам пригодятся контейнерные типы данных. Но прежде чем рассмотреть их подробно, коротко обсудим важный специальный тип данных: None. |