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

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

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


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница7 из 74
    1   2   3   4   5   6   7   8   9   10   ...   74
    54
    Глава 1. Быстрое введение в процедурное программирование
    Для импортирования модуля используется инструкция import, за ко
    торой следует имя файла .py, но без расширения.
    1
    Как только модуль будет импортирован, мы можем обращаться к его функциям, классам или переменным, содержащимся в нем. Например:
    print(sys.argv)
    Модуль sys содержит переменную argv – список, первым элементом ко
    торого является имя, под которым была вызвана программа, а вторым и последующими элементами – аргументы командной строки. Две вы
    шеприведенные строки составляют целую программу echoargs.py. Ес
    ли вызвать эту программу командой echoargs.py

    v
    , она выведет ['echo
    args.py', '

    v']
    . (В системах UNIX первым элементом может быть стро
    ка './echoargs.py'.)
    В общем случае синтаксис обращения к функции из мо
    дуля выглядит так: moduleName.functionName(arguments).
    Здесь используется оператор точки («доступ к атрибу
    ту»), который был представлен в составляющей №3.
    Стандартная библиотека содержит огромное число моду
    лей, и многие из них мы будем использовать в этой кни
    ге. Имена всех стандартных модулей состоят только из символов нижнего регистра, поэтому для отличия своих модулей при именовании модулей многие программи
    сты используют прием чередования регистра символов
    (например, MyModule).
    В качестве примера приведем модуль random (в стандартной библиоте
    ке хранится в файле random.py), содержащий множество полезных функций:
    import random x = random.randint(1, 6)
    y = random.choice(["apple", "banana", "cherry", "durian"])
    После выполнения этих инструкций переменная x будет содержать це
    лое число в диапазоне от 1 до 6 включительно, а переменная y – одну из строк из списка, переданного функции random.choice().
    Как правило, все инструкции import помещаются в нача
    ло файлов .py, после строки shebang и после комментари
    ев с описанием модуля. (Порядок описания модулей рас
    сматривается в главе 5.) Мы рекомендуем сначала им
    портировать модули из стандартной библиотеки, затем модули сторонних разработчиков, а потом ваши собст
    венные.
    1
    Модуль sys, некоторые другие модули и модули, реализованные на языке C,
    не обязательно должны храниться в виде файлов с расширением .py, но ис
    пользуются они точно так же.
    Оператор точки,
    стр. 35
    Shebang – строка (
    #!
    ), стр. 25

    Примеры
    55
    Примеры
    В предыдущем разделе мы узнали достаточно много о языке Python,
    чтобы иметь возможность приступить к созданию своих программ.
    В этом разделе мы рассмотрим две законченные программы, которые используют только те возможности языка Python, которые были опи
    саны выше. Примеры должны продемонстрировать уже доступные возможности и помочь закрепить полученные знания.
    В последующих главах мы узнаем значительно больше о языке Python и о библиотеке, благодаря чему мы сможем писать более короткие и более надежные программы, чем те, что представлены здесь. Но для начала необходимо заложить фундамент, на котором будет строиться остальное здание.
    bigdigits.py
    Первая программа, которую мы рассмотрим, очень короткая, хотя в ней имеется несколько интересных особенностей, включая список спи
    сков. Эта программа принимает число в виде аргумента командной строки и выводит его на экран, используя «большие» цифры.
    На серверах, где множество пользователей совместно пользуются вы
    сокоскоростным принтером, обычной практикой считается, когда за
    дание для печати каждого пользователя предваряется титульным лис
    том, на котором с помощью описываемой методики выводится имя пользователя и некоторая дополнительная идентификационная ин
    формация.
    Мы будем рассматривать программный код в три этапа: импортирова
    ние, создание списков, хранящих данные, используемые программой,
    и собственно обработка. Но для начала посмотрим пример вывода:
    bigdigits.py 41072819
    * * *** ***** *** *** * ****
    ** ** * * * * * * * ** * *
    * * * * * * * * * * * * *
    * * * * * * * *** * ****
    ****** * * * * * * * * *
    * * * * * * * * * *
    * *** *** * ***** *** *** *
    Мы не показали здесь строку приглашения к вводу в консоли (или ве
    дущую комбинацию ./ для пользователей UNIX) – к настоящему вре
    мени мы считаем их наличие чемто подразумеваемым.
    import sys
    Поскольку нам потребуется читать аргумент командной строки (выво
    димое число), нам необходимо будет обращаться к списку sys.argv, по
    этому начнем с того, что импортируем модуль sys.

    56
    Глава 1. Быстрое введение в процедурное программирование
    Каждая цифра будет представлена списком строк. Например, ниже показано представление цифры 0:
    Zero = [" *** ",
    " * * ",
    "* *",
    "* *",
    "* *",
    " * * ",
    " *** "]
    Обратите внимание, что список строк Zero располагается в нескольких строках. Обычно инструкции языка Py
    thon занимают одну строку, но они могут занимать и не
    сколько строк, если они представлены выражением в скобках. Литералы списков, множеств, словарей, спи
    сок аргументов функции или многострочные инструк
    ции, в которых символ конца строки экранируется сим
    волом обратного слеша (\) – во всех этих случаях инст
    рукции могут занимать несколько строк, при этом отсту
    пы во второй и последующих строках не учитываются.
    Каждый список, представляющий цифру, содержит семь строк, все одинаковой длины, причем эта длина может изменяться от цифры к цифре. Списки с изображением остальных цифр строятся аналогич
    ным образом, но они выведены несколько иначе – для компактности,
    а не для ясности:
    One = [" * ", "** ", " * ", " * ", " * ", " * ", "***"]
    Two = [" *** ", "* *", "* * ", " * ", " * ", "* ", "*****"]
    # ...
    Nine = [" ****", "* *", "* *", " ****", " *", " *", " *"]
    Последний элемент данных, который нам потребуется, – это список всех списков цифр:
    Digits = [Zero, One, Two, Three, Four, Five, Six, Seven, Eight, Nine]
    Мы могли бы создать список списков Digits, не создавая промежуточ
    ные переменные. Например:
    Digits = [
    [" *** ", " * * ", "* *", "* *", "* *",
    " * * ", " *** "], # Zero
    [" * ", "** ", " * ", " * ", " * ", " * ", "***"], # One
    # ...
    [" ****", "* *", "* *", " ****", " *", " *",
    " *"] # Nine
    ]
    Мы предпочли использовать отдельные переменные для каждого чис
    ла для удобочитаемости и потому, что вариант на основе переменных выглядит более аккуратным.
    Тип
    set
    , стр. 144
    Тип
    dict
    , стр. 151

    Примеры
    57
    Далее приведена остальная часть программного кода, чтобы вы могли ознакомиться с ней, прежде чем продолжить читать пояснения.
    try:
    digits = sys.argv[1]
    row = 0
    while row < 7:
    line = ""
    column = 0
    while column < len(digits):
    number = int(digits[column])
    digit = Digits[number]
    line += digit[row] + " "
    column += 1
    print(line)
    row += 1
    except IndexError:
    print("usage: bigdigits.py ")
    except ValueError as err:
    print(err, "in", digits)
    Программный код полностью обернут в конструкцию обработки ис
    ключений, которая способна перехватывать два вида исключений, ко
    гда чтото пойдет не так. Сначала мы пытаемся извлечь параметр ко
    мандной строки. Индексация элементов в списке sys.argv начинается с нуля, как и в любых других списках в языке Python. Элемент списка с индексом 0 – это имя программы, под которым она была вызвана, по
    этому данный список в любой программе имеет как минимум один элемент. Если при вызове программы аргумент не был указан, то при попытке обратиться ко второму элементу списка, состоящему из одно
    го элемента, будет возбуждено исключение IndexError. В этом случае управление немедленно будет передано соответствующему блоку обра
    ботки исключений, где мы просто выводим информацию о порядке ис
    пользования программы. После этого выполнение программы продол
    жается за концом блока try, но так как за его пределами больше нет программного кода, то программа просто завершается.
    Если исключение IndexError не возбуждается, в строку digits записывается аргумент командной строки, кото
    рая, как мы надеемся, состоит из одних цифр. (Вспомни
    те, как в описании составляющей №2 мы говорили, что идентификаторы в языке Python чувствительны к реги
    стру символов, поэтому digits и Digits – это разные иден
    тификаторы.) Каждая большая цифра представлена се
    мью строками, и чтобы правильно вывести число, мы должны сначала вывести верхние строки всех цифр, за
    тем следующие строки всех цифр и т. д., пока не будут выведены все семь строк. Для обхода всех строк мы ис
    пользуем цикл while. Вместо него можно было бы ис
    пользовать цикл for row in (0, 1, 2, 3, 4, 5, 6):,
    Функция
    range()
    , стр. 167

    58
    Глава 1. Быстрое введение в процедурное программирование а позднее будет представлен более интересный способ, основанный на использовании встроенной функции range().
    Переменная line используется для сборки строки из отдельных строк всех имеющихся цифр. Далее выполняется обход в цикле всех коло
    нок, то есть всех цифр в аргументе командной строки. Мы извлекаем каждый символ, используя выражение digits[column], и преобразуем полученную цифру в целое число number. Если при преобразовании воз
    никает ошибка, возбуждается исключение ValueError и управление не
    медленно передается соответствующему обработчику ошибок. В этом случае мы выводим сообщение об ошибке, и выполнение продолжает
    ся за пределами блока try. Как уже отмечалось ранее, поскольку за его пределами больше нет программного кода, то программа просто завер
    шается.
    В случае благополучного преобразования значение number использует
    ся как индекс в списке Digits, из которого извлекается список строк digit
    . Затем мы добавляем строку с индексом row из этого списка в соз
    даваемую строку line и добавляем два пробела, чтобы отделить цифры друг от друга.
    Каждый раз, когда внутренний цикл while завершает работу, мы выво
    дим собранную строку. Ключом к пониманию этой программы являет
    ся фрагмент кода, где выполняется сборка строки line из строк отдель
    ных цифр. Попробуйте запустить эту программу, чтобы получить представление о том, как она работает. Мы еще вернемся к этой про
    грамме в упражнениях, чтобы попытаться несколько улучшить вывод.
    generate_grid.py
    Часто бывает необходимо сгенерировать тестовые данные. Не сущест
    вует какойлибо универсальной программы, которая делала бы это,
    поскольку требования к тестовым данным могут изменяться очень сильно. Язык Python часто используется для создания массивов тесто
    вых данных, потому что программы на языке Python писать и моди
    фицировать не составляет большого труда. В этом подразделе мы соз
    дадим программу, которая будет генерировать матрицу из случайных целых чисел, где пользователь сможет указать число строк и столбцов,
    а также диапазон целых чисел. Для начала рассмотрим пример запус
    ка программы:
    generate_grid.py rows: 4x invalid literal for int() with base 10: '4x'
    (ошибочный литерал типа int() по основанию 10: '4x')
    rows: 4
    columns: 7
    minimum (or Enter for 0): 100
    maximum (or Enter for 1000):
    554 720 550 217 810 649 912

    Примеры
    59
    24 908 742 65 74 724 825 711 968 824 505 741 55 723 180 60 794 173 487 4 35
    Программа работает в интерактивном режиме, и при первой попытке мы допустили ошибку при вводе числа строк. Программа ответила вы
    водом сообщения об ошибке и затем попросила повторить ввод числа строк. При запросе ввести максимальное число мы просто нажали кла
    вишу
    Enter, чтобы использовать число по умолчанию.
    Мы будем рассматривать программный код в четыре приема: импорт,
    определение функции get_int() (более сложная версия, чем была пока
    зана в составляющей №8), взаимодействие с пользователем, во время которого принимаются вводимые числа, и собственно обработка.
    import random
    Чтобы получить доступ к функции random.randint(), нам необходимо импортировать модуль random.
    def get_int(msg, minimum, default):
    while True:
    try:
    line = input(msg)
    if not line and default is not None:
    return default i = int(line)
    if i < minimum:
    print("must be >=", minimum)
    else:
    return i except ValueError as err:
    print(err)
    Функция требует три аргумента: строку приглашения к вводу, мини
    мальное значение и значение по умолчанию. Если пользователь просто нажимает клавишу
    Enter, у функции имеется две возможности. Если аргумент default имеет значение None, то есть значение по умолчанию не задано, то управление передается строке i = int(line). Попытка преобразования терпит неудачу (потому что пустая строка не может быть преобразована в целое число), и возбуждается исключение Value
    Error
    . Но если аргумент default имеет значение, отличное от None, оно возвращается вызывающей программе. В противном случае функция попытается преобразовать в целое число текст, введенный пользовате
    лем, и если преобразование будет выполнено благополучно, функция проверит, чтобы введенное число было не меньше аргумента minimum.
    Таким образом, функция всегда будет возвращать либо значение аргу
    мента default (если пользователь просто нажмет клавишу
    Enter), либо целое число, большее или равное значению аргумента minimum.
    rows = get_int("rows: ", 1, None)
    columns = get_int("columns: ", 1, None)
    Функция
    random.
    randint()
    , стр. 54

    60
    Глава 1. Быстрое введение в процедурное программирование minimum = get_int("minimum (or Enter for 0): ", 1000000, 0)
    default = 1000
    if default < minimum:
    default = 2 * minimum maximum = get_int("maximum (or Enter for " + str(default) + "): ",
    minimum, default)
    Наша функция get_int() упрощает получение числа строк и столбцов,
    а также минимальное и максимальное значения желаемого диапазона случайных чисел. Для числа столбцов и строк мы передаем в аргумен
    те default значение None, что означает отсутствие значения по умолча
    нию, то есть пользователь должен ввести целое число. При запросе ми
    нимального значения мы указали значение по умолчанию 0, а при за
    просе максимального значения выбирается значение по умолчанию
    1000, или в два раза больше минимального значения, если минималь
    ное значение окажется больше или равно 1000.
    Как уже отмечалось в предыдущем примере, список аргументов при вызове функции может занимать любое число строк в исходном про
    граммном коде, при этом величина отступов во второй и последующих строках не будет иметь значения.
    Получив от пользователя число строк и столбцов, а также желатель
    ные минимальное и максимальное значения случайных чисел, можно приступать к работе.
    row = 0
    while row < rows:
    line = ""
    column = 0
    while column < columns:
    i = random.randint(minimum, maximum)
    s = str(i)
    while len(s) < 10:
    s = " " + s line += s column += 1
    print(line)
    row += 1
    Для создания матрицы мы используем три цикла while. Внешний цикл обрабатывает строки, средний – столбцы и внутренний – симво
    лы. В среднем цикле мы получаем случайное число из указанного диа
    пазона и преобразуем его в строку. Внутренний цикл while обеспечива
    ет дополнение строки ведущими пробелами так, чтобы каждое число было представлено строкой из 10 символов. Строка line используется для накопления чисел в строке матрицы, которая выводится после то
    го, как будут добавлены числа для всех колонок. На этом мы заверша
    ем наш второй пример.

    В заключение
    61
    Язык Python предоставляет весьма широкие возможно
    сти по форматированию строк, а также обеспечивает поддержку цикла for ... in. Поэтому в более реалистич
    ных версиях bigdigits.py и generate_grid.py можно было бы использовать циклы for ... in, а в generate_grid.py
    можно было бы также использовать возможности языка
    Python по форматированию строк вместо неуклюжего приема дополнения пробелами. Но мы ограничили себя восемью составляющими языка Python, представленны
    ми в этой главе, которых оказалось вполне достаточно для написания законченных и полезных программ. В ка
    ждой последующей главе мы будем знакомиться с новы
    ми особенностями языка Python, поэтому по мере про
    движения вперед мы будем видеть (и обретать способ
    ность писать) все более сложные программы.
    В заключение
    В этой главе мы узнали, как редактировать и запускать программы на языке Python. и рассмотрели пару маленьких, но законченных про
    грамм. Но большая часть главы была посвящена восьми составляю
    щим «золотого запаса» языка Python, знания которых вполне доста
    точно для создания настоящих программ.
    Мы начали с двух основных типов данных в языке Python – int и str.
    Целочисленные литералы записываются точно так же, как и во мно
    гих других языках программирования. Строковые литералы записы
    ваются либо с помощью кавычек, либо с помощью апострофов. Неваж
    но, что будет использоваться – кавычки или апострофы, главное, что
    бы с обоих концов литерала использовался один и тот же тип кавычек.
    У нас имеется возможность выполнять преобразования между строка
    ми и целыми числами, например, int("250") и str(125). Если преобра
    зование строки в целое число терпит неудачу, возбуждается исключе
    ние ValueError; с другой стороны, в строку может быть преобразовано практически все, что угодно.
    Строки – это последовательности, поэтому те функции и операции, ко
    торые могут применяться к последовательностям, могут применяться и к строкам. Например, обратиться к определенному символу можно с помощью оператора доступа ([]), конкатенацию строк можно выпол
    нить с помощью оператора +, а дополнение одной строки другой – с по
    мощью оператора +=. Так как строки являются неизменными объекта
    ми, операция дополнения строки за кулисами создает новую строку,
    представляющую собой результат конкатенации заданных строк,
    и перепривязывает ссылку на строковый объект, указанный слева от знака =, на результирующую строку. Мы также имеем возможность выполнять итерации по символам в строке, используя цикл for ... in,
    Метод
    1   2   3   4   5   6   7   8   9   10   ...   74


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