Как устроен Python. Как устроен Python. Харрисон. Харрисон Мэтт
Скачать 5.41 Mb.
|
9.2. Синтаксис форматных строк В форматных строках существует специальный синтаксис для полей- заполнителей. Если форматной строке передается объект, для поиска атрибутов может использоваться синтаксис .имя _ атрибута . Также под- держивается возможность извлечения индексируемых элементов с ис- пользованием записи [индекс] . В документации Python они называются 9.2. Синтаксис форматных строк 75 именами полей. Имена полей могут быть пустыми, содержать имя аргу- мента с ключевым словом, номер позиционного аргумента или индекс в списке или словаре (в квадратных скобках): >>> 'Name: {}'.format('Paul') 'Name: Paul' >>> 'Name: {name}'.format(name='John') 'Name: John' >>> 'Name: {[name]}'.format({'name':'George'}) 'Name: George' В фигурные скобки ( { и } ) также может быть заключено целое число. Оно определяет позицию аргумента, переданного .format (нумерация начинается с нуля). В следующем примере используются номера по- зиционных аргументов. Первый аргумент, .format , 'Paul' , находится в позиции 0; второй, 'George' , находится в позиции 1; наконец, 'John' находится в позиции 2: >>> 'Last: {2} First: {0}'.format('Paul', 'George', ... 'John') 'Last: John First: Paul' Существует целый язык форматирования строк. Поставив двоеточие после имени поля, вы сможете передать дополнительную форматную информацию. Формат описан ниже. Все, что заключено в квадратные скобки, не является обязательным. :[[fill]align][sign][#][0][width][grouping_option][.precision][type] В следующей таблице перечислены поля и их значения. Поле Описание fill Символ, используемый для заполнения из align (пробел по умолча- нию) align Тип выравнивания вывода: < (по левому краю), > (по правому краю), ^ (по центру) или = (вставить дополнение после знака) sign Для чисел: + (выводить знак как для положительных, так и для отрицательных чисел), (по умолчанию, выводить знак только для отрицательных чисел) или пробел (начальные пробелы для положи- тельных чисел, знак для отрицательных чисел) 76 Глава 9. Строки Поле Описание # Префикс для целых чисел: 0b (двоичные), 0o (восьмеричные) или 0x (шестнадцатеричные) 0 Дополняющие нули width Минимальная ширина поля grouping_ option Разделители в числах: , (тысячи разделяются запятыми), _ (тысячи разделяются подчеркиваниями) .precision Для чисел с плавающей точкой (количество знаков в дробной части), для нечисловых данных (максимальная длина) type Числовой тип или s (строковый формат по умолчанию); см. таблицы форматирования для целых чисел и чисел с плавающей точкой В следующих таблицах перечислены различные средства форматирова- ния целых чисел и чисел с плавающей точкой. Целые типы Описание b Двоичный c Символьный — преобразуется в символ Юникода d Десятичный (по умолчанию) n Десятичный с разделителями для локального контекста o Восьмеричный x Шестнадцатеричный (нижний регистр) X Шестнадцатеричный (верхний регистр) Типы с плаваю- щей точкой Описание e/E Экспоненциальная запись (буква «e» в нижнем/верхнем реги- стре) f Фиксированная точка g/G Универсальная запись. Фиксированная или экспоненциальная запись в зависимости от числа (по умолчанию g) n g с разделителями для локального контекста % Проценты (с умножением на 100) 9.3. Примеры форматирования 77 9.3. Примеры форматирования Ниже приведены некоторые примеры использования .format . Чтобы отформатировать строку в центре поля из 12 символов, окруженную символами * , используйте приведенный ниже код. Здесь * — символ-за- полнитель, ^ — поле выравнивания, а 12 — поле ширины: >>> "Name: {:*^12}".format("Ringo") 'Name: ***Ringo****' Затем отформатируем число в процентах с шириной 10, одним знаком в дробной части и знаком перед дополнением ширины. Здесь = — поле выравнивания, + гарантирует, что в отформатированном значении всег- да выводится знак (как для отрицательных, так и для положительных чисел), 10.1 — поля ширины и точности, а % — тип для преобразования числа в проценты: >>> "Percent: {:=+10.1%}".format(-44/100) 'Percent: - 44.0%' Далее следуют примеры двоичного и шестнадцатеричного преобразования. Полю типа целого числа присваиваются значения b и x соответственно: >>> "Binary: {:b}".format(12) 'Binary: 1100' >>> "Hex: {:x}".format(12) 'Hex: c' ПРИМЕЧАНИЕ Метод .format для строк предоставляет альтернативу для оператора % , сходную с функцией C printf . Оператор % также доступен, и некоторые пользователи предпочитают именно его, поскольку в простых случаях запись получается короче, а также из-за его сходства с C. Заполнители %s , %d и %x заменяются своими строковыми, целыми и шестнадцатеричными значениями соответственно. Несколько примеров: >>> "Num: %d Hex: %x" % (12, 13) 'Num: 12 Hex: d' >>> "%s %s" % ('hello', 'world') 'hello world' 78 Глава 9. Строки СОВЕТ Отличный источник информации о форматировании — встроенная справоч- ная документация, доступная в REPL. Введите команду >>> help() Команда включает режим справочной информации и выводит приглашение help> . Введите команду help> FORMATTING Просмотрите вывод — вы найдете в нем много примеров. Если просто нажать Enter в приглашении help> , вы вернетесь к обычному приглашению. Также немало полезной информации можно найти на сайте https://pyformat. info/ . Здесь представлено много примеров форматирования как с использо- ванием .format , так и с более старым оператором % Информация о форматировании строк также содержится в разделе STRINGS справочной информации. 9.4. F-строки В Python 3.6 появилась новая разновидность строк — так называемые f-строки. Если поставить перед строкой префикс f , в заполнители можно будет включить код. Простой пример: >>> name = 'matt' >>> f'My name is {name}' 'My name is matt' Python просматривает заполнитель и вычисляет содержащийся там код. В заполнитель можно включить вызовы функций, вызовы методов или любой другой произвольный код: >>> f'My name is {name.capitalize()}' 'My name is Matt' Также можно передать форматные строки после двоеточия ( : ): >>> f'Square root of two: {2**.5:5.3f}' 'Square root of two: 1.414' 9.6. Упражнения 79 9.5. Итоги В этой главе мы представили строки. Строки могут определяться с раз- ными ограничителями. В отличие от других языков, в которых строки, заключенные в двойные кавычки " и одинарные кавычки ' , могут работать по-разному, в Python их поведение не различается. Впрочем, строки в трой- ных кавычках могут состоять из нескольких физических строк (абзацев). Мы также рассмотрели метод .format и разобрали несколько примеров форматирования строк. В завершение главы была представлена одна из новых возможностей Python 3.6 — f-строки. 9.6. Упражнения 1. Создайте переменную name , указывающую на ваше имя. Создайте другую переменную — age — с целым числом, соответствующим вашему возрасту. Выведите отформатированную строку с обоими значениями. Например, для имени Fred и возраста 23 должна быть выведена строка: Fred is 23 2. Создайте переменную paragraph , которая содержит следующий текст: "Python is a great language!", said Fred. "I don't ever remember having this much fun before." 3. Посетите сайт https://unicode.org и найдите в греческой таблице сим- волов букву «омега». Создайте строку, которая содержит символ «омега», используя как кодовый пункт в Юникоде (форма \u ), так и имя символа в Юникоде (форма \N ). Кодовый пункт — шестнад- цатеричное число в таблице, имя выводится жирным шрифтом по- сле кодового пункта. Например, букве «тэта» соответствует кодо- вый пункт 03f4 и имя GREEK CAPITAL THETA SYMBOL 4. Создайте переменную item , которая указывает на строку "car" Создайте переменную cost , которая указывает на число 13499.99. Выведите строку, в которой значение item выравнивается по лево- му краю поля из 10 символов, а cost — по правому краю поля из 10 символов с 2 цифрами в дробной части и разделением тысяч за- пятыми. Результат должен выглядеть так (без кавычек): 'car 13,499.99' 10 dir, help и pdb Наше знакомство со строками было в лучшем случае поверхностным, но сейчас нужно ненадолго прерваться для обсуждения двух важных функций и одной библиотеки, включенных в поставку Python. Первая функция — dir — показывает, каким мощным и полезным инструментом является REPL. Функция dir возвращает атрибуты объекта. Если у вас открыт интерпретатор Python и вы хотите узнать атрибуты строки, эта функция выдает следующий результат: >>> dir('Matt') ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] 10.1. Специальные методы 81 dir выводит все атрибуты переданного объекта. Так как функции dir была передана строка 'Matt' , функция выводит атрибуты строки. Эта удобная возможность языка Python демонстрирует его философию по принципу «батарейки прилагаются»: Python предоставляет простой механизм для получения атрибутов любого объекта. В других языках для получения доступа к такой функциональности могут потребоваться специальные сайты, документация или IDE, но в Python благодаря наличию REPL эту информацию можно получить быстро и легко. Список атрибутов упорядочен по алфавиту; на первую пару атрибутов, начинающихся с __ , обычно можно не обращать внимания. Позднее вам встретятся такие атрибуты, как capitalize (запись строки с прописной буквы), format (форматирование строк, продемонстрированное выше) или lower (преобразование строки к нижнему регистру). Эти атрибуты являются методами — функциями, связанными с объектами. Чтобы вызвать функцию, поставьте точку после объекта, укажите имя метода и поставьте круглые скобки. Три примера вызова методов: >>> print('matt'.capitalize()) Matt >>> print('Hi {}'.format('there')) Hi there >>> print('YIKES'.lower()) yikes 10.1. Специальные методы Возможно, вас интересуют атрибуты, начинающиеся с __ . Как было сказано выше, эти атрибуты соответствуют методам; люди называют их специаль- ными, волшебными или дандер-методами (dunder methods). Специальные методы определяют, что происходит во внутренней реализации при выпол- нении операций с объектами. Например, при применении оператора + или % к строке будет вызван метод .__add__ или .__mod__ соответственно. Не- опытные программисты Python обычно забывают о специальных методах. Но когда вы начнете реализовывать собственные классы и захотите, чтобы они реагировали на такие операции, как + или % , вы можете определить их. 82 Глава 10. dir, help и pdb СОВЕТ В документации help() имеется тема SPECIALMETHODS с описаниями этих методов. Также описания доступны на сайте Python. Откройте раздел Documentation, Language Reference, Data Model — они находятся здесь. 10.2. help Help — другая встроенная функция, используемая в сочетании с REPL. В книге ранее уже упоминался вызов help() без аргументов для вызова справочной документации. Функция help также выводит документацию для метода, модуля, класса или функции, переданной в аргументе. Например, если вас интересует, что делает атрибут upper у строк, информация может быть получена следующим вызовом: >>> help('some string'.upper) Help on built-in function upper: upper(...) method of builtins.str instance S.upper() -> str Return a copy of S converted to uppercase. Функция help в сочетании с REPL позволяет читать документацию, не открывая браузера, и даже без доступа к интернету. Даже если вы по- пали на необитаемый остров, все равно сможете изучать Python — для этого понадобится лишь компьютер с установленной версией Python и источник питания. 10.3. pdb В Python также включен отладчик для пошагового выполнения кода. Он находится в модуле с именем pdb . Эта библиотека построена по об- разцу библиотеки gdb языка C. Чтобы выйти в отладчик в любой точке программы Python, вставьте в нее следующий код: import pdb; pdb.set_trace() 10.3. pdb 83 На самом деле здесь две команды, но я обычно размещаю их в одной строке, разделив точкой с запятой ( ; ) — так после завершения отладки обе команды можно будет удалить одним нажатием клавиши в редакто- ре. Пожалуй, это единственная ситуация, в которой я использую точку с запятой в коде Python (две команды в одной строке). При выполнении в этой строке открывается приглашение (pdb) , напо- минающее приглашение REPL. В нем также можно выполнять код, про- сматривать объекты и переменные. Кроме того, вы сможете установить точки прерывания для последующего анализа. Ниже приведена таблица со списком полезных команд pdb : Команда Описание h, help Вывести список доступных команд n, next Выполнить следующую строку c, cont, continue Продолжать выполнение до следующей точки прерывания w, where, bt Вывести трассировку стека с информацией о текущей по- зиции выполнения u, up Подняться на уровень вверх в стеке d, down Опуститься на уровень вниз в стеке l, list Вывести исходный код текущей строки ПРИМЕЧАНИЕ В книге «Programming Pearls» Джон Бентли (Jon Bentley) пишет: «Когда мне приходится отлаживать маленький алгоритм где-то в недрах большой программы, я иногда использую средства отладки… хотя команды отладочного вывода обычно быстрее реализуются и работают эффективнее хитроумных отладчиков». Я слышал, как Гвидо ван Россум, создатель Python, высказывает то же мнение: он предпочитает отладочный вывод. Принцип отладочного вывода прост: вы вставляете функции print , которые поясняют, что происходит в программе. Часто этого оказывается достаточно для выявления проблемы. Не забудьте удалить команды отладки или преобразовать их в команды записи в журнал перед выпуском кода. Если потребуется более серьезный анализ, вы всегда можете воспользоваться модулем pdb 84 Глава 10. dir, help и pdb 10.4. Итоги Python предоставляет много вспомогательных инструментов, упрощаю- щих жизнь разработчика. Если вы научились работать с REPL, то сможе- те пользоваться ими. Функция dir выводит информацию о том, какими атрибутами обладает объект. Функция help поможет проанализировать эти атрибуты для документации. В этой главе также был представлен модуль pdb . Этот модуль позволяет выполнять код в пошаговом режиме, что может быть полезно при отладке. 10.5. Упражнения 1. Откройте REPL и создайте переменную name со своим именем. Вы- ведите атрибуты строки. Выведите справочную документацию для методов .find и .title 2. Откройте REPL и создайте переменную age со своим возрастом. Выведите атрибуты целого числа. Выведите справочную докумен- тацию для метода .numerator 11 Строки и методы В главе 10 вы узнали о встроенной функции dir и некоторых методах, которые можно вызвать для строковых объектов. Так как строки явля- ются неизменяемыми, эти методы не изменяют строку, а возвращают новую строку или новый результат. Операции со строками позволяют создать новую версию, преобразованную к верхнему регистру, вернуть отформатированную строку, создать строку в нижнем регистре и т. д. Для выполнения этих операций разработчик вызывает методы. Методы представляют собойфункции, вызываемые для экземпляра типа. Что это означает? Чтобы вызвать метод для строкового объекта, поставьте точку ( ) и укажите имя объекта прямо за именем переменной, хранящей данные (или самими данными). За именем объекта должны следовать круглые скобки со списком аргументов. ПРИМЕЧАНИЕ В этой книге я ставлю точку перед именами методов. Это делается для того, чтобы напомнить вам о том, что перед методом должен быть указан объ- ект. Скажем, вместо метода capitalize в тексте будет упоминаться метод .capitalize . Вызов его для объекта text выглядит так: text.capitalize() В этом отношении методы отличаются от функций (таких, как help ), которые вызываются самостоятельно (без объекта или точки): help() 86 Глава 11. Строки и методы name = 'matt' 'matt' Id:4f3b Type:String name Этап 1: Python создает строку correct = name.capitalize() 'matt' Id:4f3b Type:String name Этап 2: Python создает новую строку, начинающуюся с прописной буквы 'Matt' Id:4f3f Type:String correct = name.capitalize() 'matt' Id:4f3b Type:String name Этап 3: Python создает новую переменную 'Matt' Id:4f3f Type:String correct Неизменяемые строки Команда Что делает компьютер Переменные Объекты Переменные Объекты Переменные Объекты |