Главная страница
Навигация по странице:

  • Рис. 2.7.

  • Рис. 2.8.

  • В заключение

  • Программирование на Python 3. Руководство издательство СимволПлюс


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница15 из 74
    ".format(color))
    fields = extract_fields(line)
    for field in fields:
    if not field:
    print("")
    else:
    number = field.replace(",", "")
    try:
    x = float(number)
    print("".format(round(x)))
    except ValueError:
    field = field.title()
    field = field.replace(" And ", " and ")
    field = escape_html(field)
    if len(field) <= maxwidth:
    print("".format(field))
    else:
    print("".format(field,
    maxwidth))
    print("")
    Мы не можем использовать метод str.split(",") для разбиения каж
    дой строки на поля, потому что запятые могут находиться внутри строк в кавычках. Поэтому мы возложили эту обязанность на функ
    цию extract_fields(). Получив список строк полей (в виде строк без ок
    ружающих их кавычек), мы выполняем обход списка и создаем для каждого поля ячейку таблицы.
    Если поле пустое, мы выводим пустую ячейку. Если поле было заклю
    чено в кавычки, это может быть строка или число в кавычках, содер
    жащее символы запятой, например "1,566". Учитывая такую возмож
    ность, мы создаем копию поля без запятых и пытаемся преобразовать ее в число типа float. Если преобразование удалось, мы определяем

    Примеры
    123
    выравнивание в ячейке по правому краю, а значение поля округляется до ближайшего целого, которое и выводится. Если преобразование не удалось, следовательно, поле содержит строку. В этом случае мы с по
    мощью метода str.title() изменяем регистр символов и замещаем сло
    во «And» на слово «and», устраняя побочный эффект действия метода str.title()
    . Затем выполняется экранирование специальных символов
    HTML и выводится либо поле целиком, либо первые maxwidth символов с добавлением многоточия. Простейшей альтернативой использова
    нию вложенного поля замены в строке формата является получение среза строки, например:
    print("
    ".format(field[:maxwidth]))
    Еще одно преимущество такого подхода состоит в том, что он требует меньшего объема ввода с клавиатуры.
    def extract_fields(line):
    fields = []
    field = ""
    quote = None for c in line:
    if c in "\"'":
    if quote is None: # начало строки в кавычках quote = c elif quote == c: # конец строки в кавычках quote = None else:
    field += c # другая кавычка внутри строки в кавычках continue if quote is None and c == ",": # end of a field fields.append(field)
    field = ""
    else:
    field += c # добавить символ в поле if field:
    fields.append(field) # добавить последнее поле в список return fields
    Эта функция читает символы из строки один за другим и накапливает список полей, где каждое поле – это строка без окружающих ее кавы
    чек. Функция способна обрабатывать поля, не заключенные в кавыч
    ки, и поля, заключенные в кавычки или в апострофы, корректно обра
    батывая запятые и кавычки (апострофы в строках, заключенных в ка
    вычки, и кавычки в строках, заключенных в апострофы).
    def escape_html(text):
    text = text.replace("&", "&")
    text = text.replace("<", "<")
    text = text.replace(">", ">")
    return text

    124
    Глава 2. Типы данных
    Эта функция просто замещает каждый специальный символ HTML со
    ответствующей ему сущностью языка HTML. В первую очередь, ко
    нечно, мы должны заменить символ амперсанда и угловые скобки, хо
    тя порядок не имеет никакого значения. В стандартной библиотеке
    Python имеется более сложная версия этой функции – вы получите возможность использовать ее в упражнениях и еще раз встретитесь с ней в главе 7.
    В заключение
    Эта глава началась с демонстрации списка ключевых слов языка Py
    thon и описания правил, применяемых к идентификаторам в языке
    Python. Благодаря поддержке Юникода идентификаторы языка Py
    thon не ограничены поднабором символов такого небольшого множе
    ства, как ASCII или Latin1.
    Также был описан тип данных int, который отличается от аналогич
    ных типов во многих других языках программирования тем, что не имеет ограничений на размер. Размер целых чисел в языке Python ог
    раничивается лишь объемом машинной памяти, и интерпретатор вполне в состоянии работать с числами, состоящими из сотен цифр.
    Все основные типы данных в языке Python относятся к категории не
    изменяемых, но эта их особенность практически незаметна – за счет того, что комбинированные операторы присваивания (+=, *=,

    =
    , /=
    и другие) позволяют использовать достаточно естественный синтак
    сис, хотя при этом интерпретатор Python создает новые объекты с ре
    зультатами и выполняет повторную привязку к ним наших перемен
    ных. Литералы целых чисел обычно записываются в виде десятичных чисел, но также существует возможность записывать двоичные лите
    ралы, используя префикс 0b, восьмеричные литералы, используя пре
    фикс 0o, и шестнадцатеричные литералы, используя префикс 0x.
    Когда деление двух целых чисел выполняется с помощью оператора /,
    результатом всегда будет число типа float. Это отличает Python от многих других языков программирования, но позволяет избежать не
    которых трудноуловимых ошибок, которые могут возникнуть изза усечения дробной части в результате. (Если необходимо выполнить це
    лочисленное деление, следует использовать оператор //.)
    В языке Python имеется тип данных bool, который может иметь одно из двух значений – True или False. В языке Python имеется три логиче
    ских оператора: and, or и not, два из которых (and и or) опираются на ло
    гику сокращенных вычислений.
    Имеется три разновидности чисел с плавающей точкой: float, complex и decimal.Decimal. Наиболее часто используется тип float – он пред
    ставляет числа с плавающей точкой двойной точности, чьи точные ха
    рактеристики зависят от библиотек C, C# или Java, на основе которых была выполнена компиляция Python. Комплексные числа представле

    В заключение
    125
    ны парой чисел типа float, одно из которых хранит действительную часть комплексного числа, а второе – мнимую. Тип decimal.Decimal реа
    лизован модулем decimal. По умолчанию эти числа имеют точность представления 28 десятичных знаков, однако точность может быть увеличена или уменьшена в зависимости от потребностей.
    Все три типа чисел с плавающей точкой могут использоваться в ком
    бинации с типичными арифметическими операторами и функциями.
    В дополнение к этому модуль math предоставляет разнообразные триго
    нометрические, гиперболические и логарифмические функции, кото
    рые могут использоваться с числами типа float, а модуль cmath предос
    тавляет аналогичное множество функций для работы с числами типа complex
    Большая часть главы посвящена строкам. Литералы строк в языке Py
    thon могут создаваться с помощью апострофов или кавычек, а если возникает необходимость включить в строку символы перевода строки или кавычки, можно использовать тройные кавычки. Для вставки специальных символов могут использоваться различные экраниро
    ванные последовательности, такие как табуляция (\t) и перевод стро
    ки (\n), и символы Юникода, как с использованием шестнадцатерич
    ных экранированных последовательностей, так и с использованием названий символов Юникода. Несмотря на то, что строки поддержива
    ют те же самые операторы сравнения, что и другие типы данных в язы
    ке Python, мы отметили, что сортировка строк, содержащих неанг
    лийские символы, может вызывать сложности.
    Поскольку строки являются последовательностями, к ним может при
    меняться оператор получения среза ([]), имеющий простой, но мощный синтаксис. Строки могут также объединяться с помощью оператора +
    и дублироваться с помощью оператора *; кроме того, можно использо
    вать комбинированные операторы присваивания (+= и *=), хотя для конкатенации строк предпочтительнее использовать метод str.join().
    Строки имеют множество других методов, включая методы проверки их содержимого (такие как str.isspace() и str.isalpha()), методы изме
    нения регистра символов (такие как str.lower() и str.title()), методы поиска (такие как str.find() и str.index()) и многие другие.
    Поддержка строк в языке Python действительно находится на очень высоком уровне, позволяя нам легко отыскивать, извлекать или срав
    нивать как целые строки, так и их части, замещать символы или под
    строки, разбивать строки на списки подстрок и объединять списки строк в единую строку.
    Пожалуй, самым универсальным строковым методом является метод str.format()
    . Этот метод используется для создания строк путем заме
    щения полей значениями переменных и посредством задания специ
    фикаторов формата, точно определяющих характеристики каждого поля, замещаемого некоторым значением. Синтаксис имен замещае
    мых полей позволяет организовать доступ к позиционным или имено

    126
    Глава 2. Типы данных ванным аргументам метода и использовать индексы, ключи или имена атрибутов для доступа к элементам или атрибутам аргументов. Специ
    фикаторы формата позволяют определять символзаполнитель, на
    правление выравнивания и минимальную ширину поля вывода. Кроме того, при форматировании чисел мы можем определять, как должен выводиться знак числа, а для чисел с плавающей точкой указывать число знаков после десятичной точки и выводить их в стандартном или экспоненциальном представлении.
    Мы также обсудили сложную проблему кодировок символов. По умол
    чанию для файлов .py используется кодировка UTF8, благодаря чему мы имеем возможность записывать комментарии, идентификаторы и данные на любом языке человеческого общения. С помощью метода str.encode()
    мы можем преобразовать строку в последовательность бай
    тов, используя определенную кодировку, а с помощью метода bytes.de
    code()
    выполнить обратное преобразование последовательности байтов в строку, используя определенную кодировку. Широкое разнообразие кодировок, находящихся в использовании, может доставлять массу неудобств, но кодировка UTF8 быстро превращается в фактический стандарт для простых текстовых файлов (и уже используется по умол
    чанию для XMLфайлов), поэтому данная проблема должна потерять свою остроту в ближайшие годы.
    В дополнение к типам данных, рассматривавшимся в этой главе, Py
    thon предоставляет еще два встроенных типа данных – bytes и bytearray,
    оба они будут рассматриваться в главе 7. В языке Python имеется так
    же несколько типов коллекций, часть которых является встроенными типами, а часть реализована в стандартной библиотеке. Наиболее важ
    ные типы коллекций языка Python будут рассматриваться в следую
    щей главе.
    Упражнения
    1. Измените программу print_unicode.py так, чтобы пользователь мог вводить в командной строке несколько разных слов и получать только те строки из таблицы символов Юникода, в которых содер
    жатся все слова, указанные пользователем. Это означает, что мы сможем вводить такие команды:
    print_unicode_ans.py greek symbol
    Один из способов достижения поставленной цели состоит в том,
    чтобы заменить переменную word (которая может хранить 0, None или строку) списком words. Не забудьте изменить информацию о по
    рядке использования. В результате изменений не более десяти строк программного кода добавится и не более десяти строк изме
    нится. Решение находится в файле print_unicode_ans.py (Пользова
    тели Windows и кроссплатформенной версии программы должны

    Упражнения
    127
    модифицировать файл print_inicode_uni.py, а решение находится в файле print_inicode_uni_ans.py.)
    2. Измените программу quadratic.py так, чтобы она не выводила коэф
    фициенты со значением 0.0, а отрицательные коэффициенты выво
    дились бы как

    n
    , а не +

    n
    . Для этого придется заменить последние пять строк программы примерно пятнадцатью строками. Решение находится в файле quadratic_ans.py. (Пользователи Windows и кроссплатформенной версии программы должны модифицировать файл quadratic_uni.py, а решение находится в файле quadratic_uni_
    ans.py
    .)
    3. Удалите функцию escape_html() из программы cvs2html.py и ис
    пользуйте вместо нее функцию xml.sax.saxutils.escape() из модуля xml.sax.saxutils
    . Для этого потребуется добавить одну новую строку
    (с инструкцией import), удалить пять строк (с ненужной функцией)
    и изменить одну строку (задействовать функцию xml.sax.saxutils.
    escape()
    вместо escape_html()). Решение приводится в файле csv2
    html1_ans.py
    4. Измените программу cvs2html.py еще раз и добавьте в нее новую функцию с именем process_options(). Эта функция должна вызы
    ваться из функции main() и возвращать кортеж с двумя значениями:
    maxwidth
    (типа int) и format (типа str). При вызове функция process_options()
    должна устанавливать maxwidth в значение по умол
    чанию 100, а строку format – в значение по умолчанию ".0f", которое будет использоваться как спецификатор формата при выводе чисел.
    Если пользователь вводит в командной строке «

    h» или «
    ––
    help»,
    должно выводиться сообщение о порядке использования и возвра
    щаться кортеж (None, None). (В этом случае функция main() ничего делать не должна.) В противном случае функция должна прочитать аргументы командной строки и выполнить соответствующие при
    сваивания. Например, устанавливать значение переменной maxwidth,
    если задан аргумент «maxwidth=n», и точно так же устанавливать значение переменной format, если задан аргумент «format=s». Ниже приводится сеанс работы с программой, когда пользователь затребо
    вал инструкцию о порядке работы:
    csv2html2_ans.py h usage:
    csv2html.py [maxwidth=int] [format=str] < infile.csv > outfile.html maxwidth is an optional integer; if specified, it sets the maximum number of characters that can be output for string fields,
    otherwise a default of 100 characters is used.
    (maxwidth – необязательное целое число. Если задано, определяет максимальное число символов для строковых полей. В противном случае используется значение по умолчанию 100.)
    format is the format to use for numbers; if not specified it defaults to ".0f".

    1   ...   11   12   13   14   15   16   17   18   ...   74
    1   ...   11   12   13   14   15   16   17   18   ...   74
    119
    ра, но мы использовали некоторые имена Юникода для вывода пары специальных символов.
    csv2html.py
    Часто бывает необходимо представить данные в формате HTML. В этом подразделе мы разработаем программу, которая читает данные из файла в простом формате CSV (Comma Separated Value – значения,
    разделенные запятыми) и выводит таблицу HTML, содержащую эти данные. В составе Python присутствует мощный и сложный модуль для работы с форматом CSV и похожими на него – модуль csv, но здесь мы будем выполнять всю обработку вручную.
    В формате CSV каждая запись располагается на одной строке, а поля внутри записи отделяются друг от друга запятыми. Каждое поле мо
    жет быть либо строкой, либо числом. Строки должны окружаться апо
    строфами или кавычками, а числа не должны окружаться кавычками,
    если они не содержат запятые. Внутри строк допускается присутствие запятых, и они не должны интерпретироваться как разделители по
    лей. Мы будем исходить из предположения, что первая запись в файле содержит имена полей. На выходе будет воспроизводиться таблица в формате HTML с выравниванием текста по левому краю (по умолча
    нию для HTML) и с выравниванием чисел по правому краю, по одной строке на запись и по одной ячейке на поле.
    Программа должна вывести открывающий тег таблицы HTML, затем прочитать каждую строку данных и для каждой строки вывести соот
    ветствующую строку таблицы HTML, а в завершение вывести закры
    вающий тег таблицы HTML. Мы будем использовать светлозеленый цвет фона для первой строки таблицы (где будут выводиться названия полей), а при выводе строк с данными будем чередовать белый и свет
    ложелтый цвет фона. Кроме того, нам необходимо правильно экрани
    ровать специальные символы HTML («&», «<» и «>»), а строки немно
    го сократить.
    Ниже приводится маленький фрагмент файла с данными:
    "COUNTRY","2000","2001",2002,2003,2004
    "ANTIGUA AND BARBUDA",0,0,0,0,0
    "ARGENTINA",37,35,33,36,39
    "BAHAMAS, THE",1,1,1,1,1
    "BAHRAIN",5,6,6,6,6
    Предположим, что данные находятся в файле data/co2sample.csv и вы
    полнена команда csv2html.py < data/co2sample.csv > co2sample.html,
    тогда файл co2sample.html должен содержать примерно следующее:





    120
    Глава 2. Типы данных




    Country20002001200220032004
    Argentina3735333639

    Мы немного привели в порядок результаты работы программы и опус
    тили некоторые строки, подставив вместо них многоточия. Мы ис
    пользовали очень простую версию HTML – HTML 4 transitional, без применения таблиц стилей. На рис. 2.7 показано, как выглядит полу
    ченная таблица в вебброузере.
    Теперь, когда мы увидели, как используется программа и что она дела
    ет, можно приступать к изучению программного кода. Программа на
    чинается с импортирования модуля sys – с этого момента мы не будем больше показывать строки, выполняющие импортирование, если в них не импортируется нечто необычное или они не требуют обсуждения.
    Последняя инструкция в программе – это простой вызов функции:
    main()
    Хотя в языке Python не требуется явно указывать точку входа в про
    грамму, как в некоторых других языках программирования, тем не менее является распространенной практикой создание в программе на языке Python функции с именем main(), которая вызывается для вы
    полнения обработки. Поскольку функция не может вызываться до то
    го, как она будет определена, мы должны вставлять вызов main() толь
    ко после того, как данная функция будет определена. Порядок следо
    вания функций в файле (то есть порядок, в котором они создаются) не имеет значения.
    В программе csv2html.py первой вызываемой функцией является функ
    ция main(), которая в свою очередь вызывает функции print_start()
    и print_line(). Функция print_line() вызывает функции extract_fields()
    и escape_html(). Структура программы показана на рис. 2.8.
    Когда интерпретатор Python читает файл, он начинает делать это с са
    мого начала. Поэтому сначала будет выполнен импорт, затем будет
    Рис. 2.7. Таблица, произведенная программой csv2html.py, в броузере

    Примеры
    121
    создана функция main(), а затем будут созданы остальные функции –
    в том порядке, в каком они следуют в файле. Когда интерпретатор, на
    конец, достигнет вызова main() в конце файла, все функции, которые вызываются функцией main() (и все функции, которые вызываются этими функциями), будут определены. Выполнение обработки, как и следовало ожидать, начинается в точке вызова функции main().
    Рассмотрим все функции по порядку, начиная с функции main().
    def main():
    maxwidth = 100
    print_start()
    count = 0
    while True:
    try:
    line = input()
    if count == 0:
    color = "lightgreen"
    elif count % 2:
    color = "white"
    else:
    color = "lightyellow"
    print_line(line, color, maxwidth)
    count += 1
    except EOFError:
    break print_end()
    Переменная maxwidth используется для хранения числа символов в ячей
    ке. Если поле больше, чем это число, часть строки отсекается и на ме
    сто отброшенного текста добавляется многоточие. Программный код
    вызывает
    вызывает
    вызывает
    import sys def main():
    def print_start():
    def print_line():
    def extract_fields():
    def escape_html():
    def print_end():
    main()
    Рис. 2.8. Структура программы csv2html.py

    122
    Глава 2. Типы данных функций print_start(), print_line() и print_end() будет приведен чуть ниже. Цикл while выполняет обход всех входных строк – это могут быть строки, вводимые пользователем с клавиатуры, но мы предпола
    гаем, что данные будут перенаправлены из файла. Далее выбирается цвет фона и вызывается функция print_line(), которая выводит стро
    ку в виде строки таблицы в формате HTML.
    def print_start():
    print("")
    def print_end():
    print("
    ")
    Мы могли бы не создавать эти две функции и просто вставить соответ
    ствующие вызовы print() в функцию main(). Но мы предпочитаем вы
    делять логику, так как это делает реализацию более гибкой, хотя в этом маленьком примере гибкость не имеет большого значения.
    def print_line(line, color, maxwidth):
    print("
    {0:d}{0}{0:.{1}} ...
    {0} ...


    написать администратору сайта