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

  • Составляющая №6: арифметические операторы

  • Рис. 1.3.

  • Рис. 1.4.

  • Составляющая №7: ввод/вывод

  • Составляющая №8: создание и вызов функций

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


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница6 из 74
    1   2   3   4   5   6   7   8   9   ...   74
    45
    Если исключение возникнет в блоке except или для возникшего исклю
    чения не будет обнаружено соответствующего предложения except, то
    Python начнет поиск блока except в следующем объемлющем контек
    сте. Поиск подходящего обработчика исключения будет выполняться в направлении наружу и вверх по стеку вызовов, пока не будет найде
    но соответствие. Если соответствия найдено не будет, то программа бу
    дет аварийно завершена с выводом сообщения об ошибке. В случае по
    явления необработанного исключения интерпретатор Python выводит диагностическую информацию и текст сообщения.
    Например:
    s = input("enter an integer: ")
    try:
    i = int(s)
    print("valid integer entered:", i)
    except ValueError as err:
    print(err)
    Если пользователь введет 3.5, будет выведено сообщение:
    invalid literal for int() with base 10: '3.5'
    (неверный литерал типа int() по основанию 10: '3.5')
    Но если он введет 13, вывод будет иной:
    valid integer entered: 13
    В многих книгах считается, что обработка исключений – это тема по
    вышенной сложности, и ее рассмотрение откладывается как можно дальше. Но возбуждение и особенно обработка исключений – это фун
    даментальный способ работы Python. поэтому мы затронули этот во
    прос в самом начале. И, как будет показано позже, обработчики ис
    ключений могут сделать программный код более удобочитаемым, от
    деляя «исключительные» случаи от обработки, которая для нас пред
    ставляет наибольший интерес.
    Составляющая №6: арифметические операторы
    Язык Python предоставляет полный комплект арифметических опера
    торов, включая двухместные операторы, выполняющие четыре основ
    ных арифметических действия: + (сложение),

    (вычитание), * (умно
    жение) и / (деление). Кроме того, многие типы данных в языке Python допускают использование комбинированных операторов присваива
    ния (или, в соответствии с другой используемой системой терминов, –
    операторов дополняющего присваивания), таких как += и *=. Операто
    ры +,

    и * действуют так, как и следовало ожидать, когда в качестве операндов выступают целые числа:
    >>> 5 + 6 11
    >>> 3  7

    46
    Глава 1. Быстрое введение в процедурное программирование
    4
    >>> 4 * 8 32
    Обратите внимание, что оператор может использоваться как унарный
    (оператор отрицания) и как двухместный оператор (вычитание), что является вполне обычным для большинства языков программирова
    ния. Язык Python начинает выделяться из общей массы других язы
    ков, когда дело доходит до оператора деления:
    >>> 12 / 3 4.0
    >>> 3 / 2 1.5
    Оператор деления возвращает значение с плавающей точ
    кой, а не целое значение. Во многих других языках он возвращает целое значение, отсекая дробную часть. Если требуется получить целочисленный результат, его всегда можно преобразовать с помощью int() (или использовать оператор деления с усечением //, который будет рассмат
    риваться позже).
    >>> a = 5
    >>> a
    5
    >>> a += 8
    >>> a
    13
    На первый взгляд в предыдущих инструкциях нет ничего особенного,
    особенно для тех, кто знаком с Cподобными языками программирова
    ния. В таких языках программирования комбинированные операторы присваивания являются сокращенной формой записи присваивания результата операции, например, выражение a += 8 эквивалентно вы
    ражению a = a + 8. Однако следует иметь в виду две важные тонкости:
    одна имеет отношение только к языку Python и одна характерна для комбинированных операторов присваивания во всех языках.
    Первое, что важно запомнить, это то, что тип int является неизменяе
    мым, то есть после присваивания значение типа int нельзя изменить.
    Поэтому при выполнении комбинированного оператора присваивания с неизменяемыми объектами в действительности создается новый объ
    ект с результатом, а затем целевая ссылка на объект привязывается к этому новому объекту. То есть когда в предыдущем случае интерпре
    татор Python встретит инструкцию a += 8, он вычислит значение a + 8
    , сохранит результат в новом объекте типа int и запишет в a ссыл
    ку на этот новый объект типа int. (Если после этого в программе не ос
    танется ни одной ссылки, указывающей на первоначальный объект,
    он будет утилизирован сборщиком мусора.) Рис. 1.3 иллюстрирует,
    как это происходит.
    Числовые операторы и функции, стр. 74

    «Золотой запас» Python
    47
    Вторая особенность заключается в том, что выражение a operator= b –
    это не совсем то же самое, что выражение a = a operator b. Комбиниро
    ванная версия ищет значение a всего один раз, поэтому потенциально она выполняется быстрее. Кроме того, если a – это сложное выражение
    (например, элемент списка с вычисляемым индексом, таким как items[offset + index]
    ), то комбинированная версия может оказаться менее подверженной ошибкам в случае, когда выражение, вычисляю
    щее индекс, потребуется изменить, потому что программисту придет
    ся изменить всего одно выражение, а не два.
    Язык Python перегружает (то есть позволяет использовать с данными разных типов) операторы + и += для строк и для списков. Первый из них выполняет операцию конкатенации, а второй – добавление для строк и расширение (добавление другого списка в конец) для списков:
    >>> name = "John"
    >>> name + "Doe"
    'JohnDoe'
    >>> name += " Doe"
    >>> name
    'John Doe'
    Подобно целым числам, строки являются неизменяемыми, поэтому,
    когда используется оператор +=, создается новая строка, и ссылка, рас
    положенная слева от оператора, связывается с новым объектом точно так же, как это было описано выше для случая с объектами типа int.
    Списки поддерживают аналогичный синтаксис, но за кулисами вы
    полняются другие действия:
    >>> seeds = ["sesame", "sunflower"]
    >>> seeds += ["pumpkin"]
    >>> seeds
    ['sesame', 'sunflower', 'pumpkin']
    Поскольку списки относятся к категории изменяемых объектов, опе
    ратор += модифицирует существующий объект списка, поэтому по
    вторной привязки ссылки seeds не происходит. Рис. 1.4 демонстриру
    ет, как это происходит.
    i = 73
    i
    73
    i += 2
    i
    73 75
    Рис. 1.3. Комбинированные операторы присваивания
    с неизменяемыми объектами

    48
    Глава 1. Быстрое введение в процедурное программирование
    Если синтаксис языка Python так хитроумно скрывает различия меж
    ду изменяемыми и неизменяемыми типами данных, то зачем вообще делаются такие различия? Причина главным образом заключается в обеспечении высокой производительности. Действия с неизменяе
    мыми типами потенциально имеют более эффективную реализацию
    (так как они никогда не изменяются), чем действия с изменяемыми типами. Кроме того, некоторые типы коллекций, такие как множест
    ва, могут включать в себя только данные неизменяемых типов. С дру
    гой стороны, изменяемые типы удобнее в использовании. Случаи, ко
    гда различия между этими двумя категориями приобретают особую важность, мы будем рассматривать, например, в главе 4 – при обсуж
    дении аргументов функций, имеющих значения по умолчанию; в гла
    ве 3 – при обсуждении списков, множеств и некоторых других типов данных; и в главе 6, где будет показано, как создавать свои собствен
    ные типы данных.
    Правый операнд в операторе += для списков должен быть итерируе
    мым объектом, в противном случае будет возбуждено исключение:
    >>> seeds += 5
    Traceback (most recent call last):
    (Трассировочная информация (самый последний вызов внизу)
    TypeError: 'int' object is not iterable
    (TypeError: объект 'int' не является итерируемым)
    Правильный способ расширения списка заключается в том, чтобы ис
    пользовать итерируемый объект, например, список:
    >>> seeds += [5]
    >>> seeds
    ['sesame', 'sunflower', 'pumpkin', 5]
    И, конечно же, сам итерируемый объект, за счет которого выполняет
    ся расширение списка, может содержать более одного элемента:
    >>> seeds += [9, 1, 5, "poppy"]
    >>> seeds
    ['sesame', 'sunflower', 'pumpkin', 5, 9, 1, 5, 'poppy']
    m = [5, 9]
    m
    0 1
    5 9
    m += [6]
    m
    0 1
    2 5
    9 6
    Рис. 1.4. Комбинированные операторы присваивания
    с изменяемыми объектами

    «Золотой запас» Python
    49
    Попытка добавить простую строку (например, "durian"), а не список,
    содержащий ее ( ["durian"]), приведет к логичному, но, возможно, не
    ожиданному результату:
    >>> seeds = ["sesame", "sunflower", "pumpkin"]
    >>> seeds += "durian"
    >>> seeds
    ['sesame', 'sunflower', 'pumpkin', 'd', 'u', 'r', 'i', 'a', 'n']
    Оператор += списков расширяет список, добавляя к нему каждый эле
    мент итерируемого объекта, находящегося справа, а поскольку строка –
    это итерируемый объект, то каждый символ строки будет добавлен как отдельный элемент. При использовании метода append() его аргу
    мент всегда добавляется в список как единый элемент.
    Составляющая №7: ввод/вывод
    Чтобы писать понастоящему полезные программы, нам необходимо иметь возможность читать входные данные – например, с клавиатуры или из файла и выводить результаты – либо на консоль, либо в файлы.
    Мы уже использовали встроенную функцию print(), но ее рассмотре
    ние отложим до главы 4. В этом подразделе мы сосредоточим свое вни
    мание на консольном вводе/выводе, а для чтения и записи файлов бу
    дем использовать механизм перенаправления командной оболочки.
    В языке Python имеется встроенная функция input(), с помощью кото
    рой можно читать ввод пользователя. Эта функция принимает необя
    зательный строковый аргумент (который выводится в консоли как строка приглашения к вводу) и ожидает, пока пользователь введет от
    вет и завершит ввод клавишей
    Enter (или Return). Если пользователь не введет никакой текст и просто нажмет клавишу
    Enter, функция input()
    вернет пустую строку, в противном случае она возвращает строку, со
    держащую ввод пользователя без символа завершения строки.
    Ниже приводится первая «полезная» программа. В ней использовано большинство из уже описанных составляющих, единственное новое в ней – это вызов функции input():
    print("Type integers, each followed by Enter; or just Enter to finish")
    total = 0
    count = 0
    while True:
    line = input("integer: ")
    if line:
    try:
    number = int(line)
    except ValueError as err:
    print(err)
    continue total += number

    50
    Глава 1. Быстрое введение в процедурное программирование count += 1
    else:
    break if count:
    print("count =", count, "total =", total, "mean =", total / count)
    Эта программа (файл sum1.py в примерах к книге) состо
    ит всего лишь из 17 строк выполняемого программного кода. Ниже приводятся результаты типичного сеанса ра
    боты с программой:
    Type integers, each followed by Enter; or just Enter to finish number: 12
    number: 7
    number: 1x invalid literal for int() with base 10: '1x'
    (неверный литерал типа int() по основанию 10: '1x')
    number: 15
    number: 5
    number:
    count = 4 total = 39 mean = 9.75
    Несмотря на небольшие размеры, программа обладает достаточно вы
    сокой устойчивостью к ошибкам. Если пользователь введет строку,
    которая не может быть преобразована в целое число, проблема будет обнаружена обработчиком исключений, который выведет соответст
    вующее сообщение и передаст управление в начало цикла (инструкция continues
    ). А заключительная инструкция if предотвратит вывод ста
    тистической информации, если пользователь в течение сеанса не ввел ни одного числа, избежав тем самым выполнения операции деления на ноль.
    Работа с файлами подробно будет описана в главе 7, а пока мы можем создавать файлы за счет простого перенаправления вывода функции print()
    средствами командной оболочки. Например, команда
    C:\>test.py > results.txt приведет к тому, что весь вывод, производимый простой функцией print()
    , которая вызывается в вымышленной программе test.py, будет записан в файл results.txt. Этот прием одинаково хорошо работает как в консоли Windows, так и в консоли UNIX. Если в системе Windows уже установлена версия Python 2 и она используется по умолчанию, то команда должна выглядеть так: C:\Python30\python.exe test.py > re
    sults.txt
    ; если путь к интерпретатору Python 3 в переменной окруже
    ния PATH стоит первым (мы больше не будем напоминать об этом), то команда должна выглядеть так: python test.py > results.txt. В систе
    мах UNIX нам необходимо сделать программу выполняемой (chmod +x test.py
    ) и затем вызвать ее командой ./test.py, если каталог, в кото
    ром она находится, не содержится в переменной окружения PATH.
    Примеры к книге, стр. 15

    «Золотой запас» Python
    51
    Чтение данных можно реализовать за счет перенаправления файла с данными на вход программы – по аналогии с перенаправлением вы
    вода. Однако если использовать перенаправление ввода с программой
    sum1.py
    , она завершится с ошибкой. Это обусловлено тем, что функ
    ция input() возбуждает исключение, когда принимает символ EOF
    (end of file – конец файла). Ниже приводится более устойчивая версия
    (sum2.py), которая способна принимать ввод с клавиатуры или за счет перенаправления файла:
    print("Type integers, each followed by Enter; or ^D or ^Z to finish")
    total = 0
    count = 0
    while True:
    try:
    line = input()
    if line:
    number = int(line)
    total += number count += 1
    except ValueError as err:
    print(err)
    continue except EOFError:
    break if count:
    print("count =", count, "total =", total, "mean =", total / count)
    Если выполнить команду sum2.py < data\sum2.dat (где sum2.dat – это файл, содержащий список чисел, по одному числу в строке, и находя
    щийся в каталоге data в примерах к книге), на консоль будет выведено:
    Type integers, each followed by Enter; or ^D or ^Z to finish count = 37 total = 1839 mean = 49.7027027027
    Мы внесли в программу некоторые незначительные изменения, чтобы она могла принимать ввод как в интерактивном режиме, так и из пере
    направляемого файла. Вопервых, мы изменили признак завершения программы с пустой строки на символ EOF (
    Ctrl+D – в UNIX, Ctrl+Z, En
    ter
    – в Windows). Это сделало программу более устойчивой при работе с файлами, содержащими пустые строки. Вовторых, мы больше не выводим строку подсказки перед вводом каждого числа, поскольку в этом нет никакого смысла при перенаправлении ввода. И втретьих,
    мы используем единый блок try с двумя обработчиками исключений.
    Обратите внимание: в случае ввода неправильного целого числа (с кла
    виатуры или в случае «ошибочной» строки в перенаправляемом фай
    ле) преобразование int() возбудит исключение ValueError и управление немедленно будет передано соответствующему блоку except. Это озна

    52
    Глава 1. Быстрое введение в процедурное программирование чает, что значения total и count не будут увеличены при встрече с ошибочными данными, то есть именно то, что нам и требуется.
    Точно так же мы могли бы использовать два отдельных блока try:
    while True:
    try:
    line = input()
    if line:
    try:
    number = int(line)
    except ValueError as err:
    print(err)
    continue total += number count += 1
    except EOFError:
    break
    Но мы предпочли сгруппировать обработку исключений в конце, что
    бы не загромождать лишними конструкциями основной блок обра
    ботки.
    Составляющая №8: создание и вызов функций
    Вполне возможно написать программу, пользуясь исключительно ти
    пами данных и управляющими структурами, которые мы рассмотрели в предыдущих подразделах. Однако очень часто бывает необходимо по
    вторно выполнять одну и ту же обработку, но с некоторыми отличиями в начальных значениях. Язык Python предоставляет возможность оформления блоков программного кода в виде функций, параметризуе
    мых аргументами, которые им передаются. Ниже приводится общий синтаксис определения функции:
    def functionName(arguments):
    suite
    Часть arguments не является обязательной; для передачи нескольких аргументов их необходимо отделить друг от друга запятыми. Любая функция в языке Python возвра
    щает некоторое значение – по умолчанию это значение
    None
    ; если мы явно не возвращаем значение с помощью инструкции return value, где value – это возвращаемое значение. Возвращаемое значение может быть единст
    венным значением или кортежем возвращаемых значе
    ний. Возвращаемое значение может игнорироваться вы
    зывающей программой, в этом случае оно просто унич
    тожается.
    Примечательно, что инструкция def действует как оператор присваи
    вания. При выполнении инструкции def создаются новый объект
    Инструкция
    return
    , стр. 205

    «Золотой запас» Python
    53
    функция и ссылка на объект с указанным именем, которая указывает на объектфункцию. Поскольку функции – это объекты, они могут со
    храняться в виде элементов коллекций и передаваться в качестве аргу
    ментов другим функциям, в чем вы сможете убедиться в последующих главах.
    Часто в интерактивных консольных приложениях возникает необхо
    димость получить целое число от пользователя. Ниже приводится функция, которая выполняет эту операцию:
    def get_int(msg):
    while True:
    try:
    i = int(input(msg))
    return i except ValueError as err:
    print(err)
    Эта функция принимает единственный аргумент, msg. Внутри цикла while пользователю предлагается ввести целое число. Если он вводит чтото неправильное, возбуждается исключение ValueError. В этом слу
    чае выводится сообщение об ошибке, и цикл повторяется. После ввода правильного целого числа оно возвращается вызывающей программе.
    Ниже показано, как можно использовать эту функцию:
    age = get_int("enter your age: ")
    В этом примере единственный параметр является обязательным, пото
    му что мы не предусматриваем значение по умолчанию для него.
    В действительности язык Python предоставляет очень сложный и гиб
    кий синтаксис для описания параметров функции, включая значения аргументов по умолчанию, а также позиционные и именованные аргу
    менты. Полный синтаксис объявления функций будет рассматривать
    ся в главе 4.
    Создавая собственные функции, мы можем удовлетворить любые на
    ши потребности, но во многих случаях в этом нет необходимости, по
    тому что в составе языка Python имеется масса встроенных функций и намного больше функций содержится в модулях стандартной биб
    лиотеки. Поэтому многое из того, что нам может потребоваться, уже существует.
    Модуль в языке Python – это обычный файл .py с программным кодом на языке Python, содержащим определения функций и классов (не
    стандартных типов данных) и некоторых переменных. Чтобы полу
    чить доступ к функциональным возможностям модуля, его сначала необходимо импортировать. Например:
    import sys

    1   2   3   4   5   6   7   8   9   ...   74


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