Саммерфилд - Программирование на Python 3 (1077331), страница 27
Текст из файла (страница 27)
Литералы целых чисел обычно записываются в виде десятичных чисел, но также существует возможность записывать двоичные литералы, используя префикс ОО, восьмеричные литералы, используя префикс Оо, и шестнадцатеричные литералы, используя префикс Ох. Когда деление двух целых чисел выполняется с помощью оператора /, результатом всегда будет число типа 11сат. Это отличает Ру$11оп от многих других языков программирования, но позволяет избежать некоторых трудноуловимых ошибок, которые могут возникнуть из-за усечения дробной части в результате. (Если необходимо выполнить целочисленное деление, следует использовать оператор //.) В языке Ру$воп имеется тип данных Осе!, который может иметь одно из двух значений — Т псе или Еа1зе.
В языке Ру(поп имеется три логических оператора: апэ, сг и псц два из которых (алО и ог) опираются на логику сокращенных вычислений. Имеется три разновидности чисел с плавающей точкой: 11сац согр1ех и эес1за1. Оес(за1. Наиболее часто используется тип Т1саг — он представляет числа с плавающей точкой двойной точности, чьи точные характеристики зависят от библиотек С, С№ или дача, на основе которых была выполнена компиляция Ру1поп.
Комплексные числа представле- В заключение ны парой чисел типа г1оаг, одно из которых хранит действительную часть комплексного числа, а второе — мнимую. Тип бес! аа1. Вес заа! реализован модулем бесзэа1. По умолчанию эти числа имеют точность представления 28 десятичных знаков, однако точность может быть увеличена или уменьшена в зависимости от потребностей.
Все три типа чисел с плавающей точкой могут использоваться в комбинации с типичными арифметическими операторами и функциями. В дополнение к этому модулыагп предоставляет разнообразные тригонометрические, гиперболические и логарифмические функции, которые могут использоваться с числами типа г!оаг, а модуль сэа!и предоставляет аналогичное множество функций для работы с числами типа соар1ех. Большая часть главы посвящена строкам. Литералы строк в языке Ру- $)зоп могут создаваться с помощью апострофов или кавычек, а если возникает необходимость включить в строку символы перевода строки или кавычки, можно использовать тройные кавычки.
Для вставки специальных символов могут использоваться различные экранированные последовательности, такие как табуляция (!!) и перевод строки (1п), и символы Юникода, как с использованием шестнадцатеричных экранированных последовательностей, так и с использованием названий символов Юникода. Несмотря на то, что строки поддерживают те же самые операторы сравнения, что и другие типы данных в языке РуФЬоп, мы отметили, что сортировка строк, содержащих неанглийские символы, может вызывать сложности. Поскольку строки являются последовательностями, к ним может применяться оператор получения среза ([)), имеющий простой, но мощный синтаксис.
Строки могут также объединяться с помощью оператора э и дублироваться с помощью оператора *; кроме того, можно использовать комбинированные операторы присваивания (+= и *=), хотя для конкатенации строк предпочтительнее использовать метод а! г. ) о!и(). Строки имеют множество других методов, включая методы проверки их содержимого (такие как а! г. !эарасе() и а! г, !аа1рпа()), методы изменения регистра символов (такие как згг.1онег() и з!г. !!!1е()), методы поиска(такие как э!г. г!пб() и згг. !пбех()) и многие другие. Поддержка строк в языке Ру!)зоп действительно находится на очень высоком уровне, позволяя нам легко отыскивать, извлекать или сравнивать как целые строки, так и их части, замещать символы или подстроки, разбивать строки на списки подстрок и объединять списки строк в единую строку.
Пожалуй, самым универсальным строковым методом является метод агг. (огэат(). Этот метод используется для создания строк путем замещения полей значениями переменных и посредством задания спецификаторов формата, точно определяющих характеристики каждого поля, замещаемого некоторым значением. Синтаксис имен замещаемых полей позволяет организовать доступ к позиционным или имено- 126 Глава 2. Типы данных ванным аргументам метода и использовать индексы, ключи или имена атрибутов для доступа к элементам или атрибутам аргументов. Спецификаторы формата позволяют определять символ-заполнитель, направление выравнивания и минимальную ширину поля вывода.
Кроме того, при форматировании чисел мы можем определять, как должен выводиться знак числа, а для чисел с плавающей точкой указывать число знаков после десятичной точки и выводить их в стандартном или экспоненциальном представлении. Мы также обсудили сложную проблему кодировок символов. По умолчанию для файлов .ру используется кодировка Т)ТР-8, благодаря чему мы имеем возможность записывать комментарии, идентификаторы и данные на любом языке человеческого общения. С помощью метода згг, епсоое() мы можем преобразовать строку в последовательность байтов, используя определенную кодировку, а с помощью метода Ьузез, Овсове() выполнить обратное преобразование последовательности байтов в строку, используя определенную кодировку. Широкое разнообразие кодировок, находящихся в использовании, может доставлять массу неудобств, но кодировка ТТТР-8 быстро превращается в фактический стандарт для простых текстовых файлов (и уже используется по умолчанию для ХМ( -файлов), поэтому данная проблема должна потерять свою остроту в ближайшие годы.
В дополнение к типам данных, рассматривавшимся в этой главе, РуЗйоп предоставляет еще два встроенных типа данных — Ьузез и Ьусеа г гау, оба они будут рассматриваться в главе 7. В языке РуЗ)гоп имеется также несколько типов коллекций, часть которых является встроенными типами, а часть реализована в стандартной библиотеке.
Наиболее важные типы коллекций языка Руспоп будут рассматриваться в следующей главе. Упражнения 1. Измените программу рппг ип!сог2еру так, чтобы пользователь мог вводить в командной строке несколько разных слов и получать только те строки из таблицы символов Юникода, в которых содержатся все слова, указанные пользователем. Это означает, что мы сможем вводить такие команды: рг1пг сп1сосе апз.ру огезх зузьо1 Один из способов достижения поставленной цели состоит в том, чтобы заменить переменную нпгс (которая может хранить О, йопе или строку) списком ногоз. Не забудьте изменить информацию о порядке использования.
В результате изменений не более десяти строк программного кода добавится и не более десяти строк изменится. Решение находится в файле рггпЗ ипгсог(е апз.ру (Пользователи Т)(г)пдохуз и кроссплатформенной версии программы должны Упражнения 127 модифицировать файл ргьп1 1п(сот)е ип1.ру, а решение находится в файле рг(п1 (п1сог)е ип1 апзру.) 2. Измените программу диас(газ(ору так, чтобы она не выводила коэффициенты со значением 0,0, а отрицательные коэффициенты выводились бы как -л, а не + -л.
Для этого придется заменить последние пять строк программы примерно пятнадцатью строками. Решение находится в файле диас(га11с апзру. (Пользователи МГ[пс(отвз и кроссплатформенной версии программы должны модифицировать файл диас(га11с ип(.ру, а решение находится в файле диас(га11с ип1 а из.ру.) 3.
Удалите функцию езсзре ЬШ1() из программы соз2)»1т1ру и используйте вместо нее функцию хв1. зах, захц1!1з. езсаре() из модуля ха1. звх. Вахог!1з. Для этого потребуется добавить одну новую строку (с инструкцией !прог!), удалить пять строк (с ненужной функцией) и изменить одну строку (задействовать функцию ха1.
звх. пахот!1з. езсаре() вместо езсаре ЬШ1()). Решение приводится в файле сзо2- )»1т11 апз.ру. 4. Измените программу срз2)»1т1ру еще раз и добавьте в нее новую функцию с именем ргосезз ор!!Ьпз(). Эта функция должна вызываться из функции за [и( ) и возвращать кортеж с двумя значениями: вахи!01П (типа !и!) и 1огаас (типа з!г). При вызове функция ргосезз орс!опз( ) должна устанавливатыахитбЬЬ в значение по умолчанию 100, а строку (о гва! — в значение по умолчанию " . 01", которое будет использоваться как спецификатор формата при выводе чисел. Если пользователь вводит в командной строке «-)т» или « — йе!р», должно выводиться сообщение о порядке использования и возвращаться кортеж (1«опе, 1«опе).
(В этом случае функция аа!и() ничего делать не должна.) В противном случае функция должна прочитать аргументы командной строки и выполнить соответствующие присваивания. Например, устанавливать значение переменной вахи!Ьсп, если задан аргумент «шахчгЫЬ)т=п», и точно так же устанавливать значение переменной [о гав!, если задан аргумент «бог!па(=з». Ниже приводится сеанс работы с программой, когда пользователь затребовал инструкцию о порядке работы: сз»2птв12 впз.ру -П взвоз: СЗ»2МВ1.ру [ИВХИтстлгют) [ГОГВВт=втГ) < тлт11В.СЗУ > Ооттт1е.лти1 ивхмютл !з вп орттопв1 тптврвг; !Г зрвс!Гтвд, ы звтз тпв ввх!эцв пцвЬвг ог слвгвствгз тлвт свп Ьв острот Гог зтг!пр Гтв1сз, о!пеги!зв в овгвц11 ог 100 спвгвствгз !з цзво.
(ввхмтстп — необязательное волов число. Если задана, определяет мвксимвльнов число символов для строкових полей В противном случае используется значение по умолчание 100.) гогввт тз тьв Гогввт то цзв Гог пциовгз; тГ пот зрвст[твс тт Овтво1тз то ".ОГ". Глава 2. Типы данных (Гогват — фориат вывода чисел. Если не задан, по умолчание используется формат " 01".) А ниже приводится пример командной строки, в которой установ- лены оба аргумента: сву2тв12 апв,ру вахнина=20 гогват=0.2( < ауоата.сву > муса!а, та1 Не забудьте изменить функцию рг!и! 1!пе() так, чтобы она использовала переменную То гав! при выводе чисел — для этого вам придется передавать функции дополнительный аргумент, добавить одну строку и изменить еще одну строку.
И это немного затронет функцию аа!и(). Функция ргосевз орс!опв() должна содержать порядка двадцати пяти строк (включая девять строк с текстом сообщения о порядке использования). Это упражнение может оказаться сложным для неопытных программистов. В состав примеров входят два файла с тестовыми данными: т!ага/ со2-ватр1е.сви и г(ага/со2-1гот-Говв!11ие!в.сви. Решение приводится в файле сво2)г!т(2 опару. В главе 5 мы увидим, как для обработки аргументов командной строки можно использовать модуль оп! ра гзе.