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

  • Целочисленные типы

  • Синтаксис Описание

  • Числа с плавающей точкой

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


    Скачать 3.74 Mb.
    НазваниеРуководство издательство СимволПлюс
    Дата10.11.2022
    Размер3.74 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование на Python 3.pdf
    ТипРуководство
    #780382
    страница9 из 74
    1   ...   5   6   7   8   9   10   11   12   ...   74

    71
    зультат последнего вычисленного выражения. Во время выполнения обычной программы идентификатор _ отсутствует, если мы явно не оп
    ределяем его в своем программном коде. Некоторые программисты любят использовать _ в качестве идентификатора переменной цикла в циклах for ... in, когда не требуется обращаться к элементам, по которым выполняются итерации. Например:
    for _ in (0, 1, 2, 3, 4, 5):
    print("Hello")
    Но имейте в виду, что те, кто пишет программы, кото
    рые затем интернационализируются, часто используют идентификатор _ в качестве имени функции перевода.
    Делается это, чтобы вместо необходимости писать вся
    кий раз gettext.gettext("Translate me") можно было пи
    сать _("Translate me"). (Чтобы можно было выполнить такой вызов, мы сначала должны импортировать модуль gettext
    , чтобы получить доступ к функции gettext(), на
    ходящейся в этом модуле).
    Давайте рассмотрим примеры допустимых идентификаторов во фраг
    менте программного кода, написанного программистом, говорящим на испанском языке. Здесь предполагается, что была выполнена инст
    рукция import math и гдето выше в программе определены переменные radio и vieja_a
    Ђ
    rea
    :
    π
    1
    = math.pi
    ε = 0.0000001
    nueva_a
    Ђ
    rea =
    π * radio * radio if abs(nueva_a
    Ђ
    rea  vieja_a
    Ђ
    rea) <
    ε:
    print("las a
    Ђ
    reas han convergido")
    Мы использовали здесь модуль math, записали в эпсилон (
    ε
    ) очень ма
    ленькое число с плавающей точкой и с помощью функции abs() нашли абсолютное значение разницы площадей – обо всем об этом мы погово
    рим ниже, в этой же главе. Здесь следует обратить внимание на то, что мы можем использовать в идентификаторах национальные символы и символы греческого алфавита. С той же легкостью мы могли бы ис
    пользовать арабские, китайские, еврейские, японские и русские сим
    волы и практически любые другие алфавитные символы, поддержи
    ваемые кодировкой Юникод.
    Самый простой способ проверить допустимость идентификатора состо
    ит в том, чтобы попробовать присвоить ему некоторое значение в инте
    рактивной оболочке интерпретатора Python или в командной оболочке
    Python среды IDLE. Ниже приводятся несколько примеров:
    >>> stretchfactor = 1
    SyntaxError: can't assign to operator (...)
    1
    Это символ «пи» греческого алфавита (
    π). – Прим. перев.
    Инструкция
    import
    , стр. 53, 230

    72
    Глава 2. Типы данных
    (SyntaxError: невозможно выполнить присваивание оператору (...))
    >>> 2miles = 2
    SyntaxError: invalid syntax (...)
    (SyntaxError: синтаксическая ошибка (...))
    >>> str = 3 # Допустимо, но неправильно
    >>> l'impЂ
    ot31 = 4
    SyntaxError: EOL while scanning singlequoted string (...)
    (SyntaxError: встречен конец строки при анализе строки в апострофах (...))
    >>> l_impЂ
    ot31 = 5
    >>>
    Попытка использовать недопустимый идентификатор вызывает ис
    ключение SyntaxError. В каждом конкретном случае изменяется часть текста сообщения, которая окружена круглыми скобками, поэтому эту часть мы заменили многоточием. В первом примере ошибка обу
    словлена попыткой использовать символ «

    », который не является ал
    фавитным символом Юникода, цифрой или символом подчеркивания.
    Во втором случае ошибка произошла изза того, что начальный символ не является алфавитным символом Юникода или символом подчерки
    вания. Если идентификатор допустим, исключение не возникает, да
    же если выбранный идентификатор совпадает с именем встроенного типа данных, исключения или функции, поэтому третий пример при
    сваивания не вызвал ошибку, хотя выбор такого идентификатора – оп
    рометчивый шаг. В четвертом примере ошибка вызвана использовани
    ем символа апострофа, который не является алфавитным символом
    Юникода, цифрой или символом подчеркивания. Пятый пример –
    пример подходящего варианта.
    Целочисленные типы
    В языке Python имеется два целочисленных типа, int и bool.
    1
    И целые числа, и логические значения являются неизменяемыми объектами,
    но благодаря присутствию в языке Python комбинированных операто
    ров присваивания эта особенность практически незаметна. В логиче
    ских выражениях число 0 и значение False представляют False, а лю
    бое другое целое число и значение True представляют True. В числовых выражениях значение True представляет 1, а False – 0. Это означает,
    что можно записывать весьма странные выражения, например, выра
    жение i += True увеличит значение i на единицу. Естественно, более правильным будет записывать подобные выражения как i += 1.
    1
    В стандартной библиотеке также определяется тип fractions.Fraction (ра
    циональные числа неограниченной точности), который может пригодиться при выполнении некоторых математических и научных вычислений.

    Целочисленные типы
    73
    Целые числа
    Размер целого числа ограничивается только объемом памяти компью
    тера, поэтому легко можно создать и обрабатывать целое число, со
    стоящее из тысяч цифр, правда, скорость работы с такими числами су
    щественно медленнее, чем с числами, которые соответствуют машин
    ному представлению.
    Литералы целых чисел по умолчанию записываются в десятичной сис
    теме счисления, но при желании можно использовать другие системы счисления:
    >>> 14600926 # десятичное число
    14600926
    >>> 0b110111101100101011011110 # двоичное число
    14600926
    >>> 0o67545336 # восьмеричное число
    14600926
    >>> 0xDECADE # шестнадцатеричное число
    14600926
    Двоичные числа записываются с префиксом 0b, восьмеричные – в пре
    фиксом
    0o
    1
    и шестнадцатеричные – с префиксом 0x. В префиксах до
    пускается использовать символы верхнего регистра.
    При работе с целыми числами могут использоваться обычные матема
    тические функции и операторы, как показано в табл. 2.2. Некоторые из функциональных возможностей представлены встроенными функ
    циями, такими как abs() (например, вызов abs(i) вернет абсолютное значение целого числа i), а другие – операторами, применимыми к ти
    пу int (например, выражение i + j вернет сумму целых чисел i и j).
    Для всех двухместных арифметических операторов (+,

    , /, //, % и **)
    имеются соответствующие комбинированные операторы присваива
    ния (+=,

    =
    , /=, //=, %= и **=), где выражение x op= y является логиче
    ским эквивалентом выражения x = x op y, когда в обычной ситуации обращение к значению x не имеет побочных эффектов.
    Объекты могут создаваться путем присваивания литералов перемен
    ным, например, x = 17, или обращением к имени соответствующего типа как к функции, например, x = int(17). Некоторые объекты (на
    пример, типа decimal.Decimal) могут создаваться только посредством использования их типов, так как они не имеют литерального представ
    ления. Создание объекта посредством использования его типа может быть выполнено одним из трех способов.
    1
    Пользователи языка C должны обратить внимание, что одного ведущего 0
    недостаточно, чтобы определить восьмеричное число – в языке Python сле
    дует использовать комбинацию 0o (0 и символ o).

    74
    Глава 2. Типы данных
    Таблица 2.2. Арифметические операторы и функции
    Первый вариант – вызов типа данных без аргументов. В этом случае объект приобретает значение по умолчанию, например, выражение x =
    int()
    создаст целое число 0. Любые встроенные типы могут вызывать
    ся без аргументов.
    Второй вариант – тип вызывается с единственным аргу
    ментом. Если указан аргумент соответствующего типа,
    будет создана поверхностная копия оригинального объек
    та. (Поверхностное копирование рассматривается в гла
    ве 3.) Если задан аргумент другого типа, будет предпри
    нята попытка выполнить преобразование. Такой способ использования описывается в табл. 2.3. Если аргумент имеет тип, для которого поддерживается преобразова
    ние в требуемый тип, и преобразование терпит неудачу,
    возбуждается исключение ValueError, в противном слу
    чае возвращается результат преобразования – объект
    Синтаксис
    Описание
    x + y
    Складывает число x и число y x  y
    Вычитает число y из числа x x * y
    Умножает x на y x / y
    Делит x на y – результатом всегда является значение типа float
    (или complex, если x или y является комплексным числом)
    x // y
    Делит x на y, при этом усекает дробную часть, поэтому резуль
    татом всегда является значение типа int, смотрите также функ
    цию round()
    x % y
    Возвращает модуль (остаток) от деления x на y x ** y
    Возводит x в степень y, смотрите также функцию pow()
    x
    Изменяет знак числа x, если оно не является нулем, если ноль –
    ничего не происходит
    +x
    Ничего не делает, иногда используется для повышения удобо
    читаемости программного кода abs(x)
    Возвращает абсолютное значение x divmod(x, y)
    Возвращает частное и остаток деления x на y в виде кортежа двух значений типа int pow(x, y)
    Возводит x в степень y; то же самое, что и оператор **
    pow(x, y, z)
    Более быстрая альтернатива выражению (x ** y) % z round(x, n)
    Возвращает значение типа int, соответствующее значению x ти
    па float, округленному до ближайшего целого числа (или зна
    чение типа float, округленное до nго знака после запятой, если задан аргумент n)
    Кортежи, стр. 32, 130
    Поверхно
    стное и глубокое копирование, стр. 173

    Целочисленные типы
    75
    требуемого типа. Если тип аргумента не поддерживает преобразование в требуемый тип, возбуждается исклю
    чение TypeError. Встроенные типы float и str поддержи
    вают возможность преобразования в целое число. Точно так же возможно обеспечить преобразование в целое число ваших собственных типов данных, как будет по
    казано в главе 6.
    Таблица 2.3. Функции преобразования целых чисел
    Третий вариант – когда передается два или более аргументов; не все типы поддерживают такую возможность, а для тех типов, что поддер
    живают ее, типы аргументов и их назначение отличаются. В случае типа int допускается передавать два аргумента, где первый аргумент –
    это строка с представлением целого числа, а второй аргумент – число основания системы счисления. Например, вызов int("A4", 16) создаст десятичное значение 164. Этот вариант использования продемонстри
    рован в табл. 2.3.
    В табл. 2.4 перечислены битовые операторы. Все битовые операторы
    (|, ^, &, << и >>) имеют соответствующие комбинированные операторы присваивания (|=, ^=, &=, <<= и >>=), где выражение i op= j является ло
    гическим эквивалентом выражения i = i op j в случае, когда обраще
    ние к значению i не имеет побочных эффектов.
    Если имеется необходимость хранить множество флагов, способных иметь всего два состояния, можно использовать единственное целое число и проверять значения отдельных его битов с помощью битовых операторов. То же самое можно делать менее компактным, но более удобным способом, воспользовавшись логическим типом.
    Синтаксис
    Описание
    bin(i)
    Возвращает двоичное представление целого числа i в виде строки, например, bin(1980) == '0b11110111100'
    hex(i)
    Возвращает шестнадцатеричное представление целого числа i в виде строки, например, hex(1980) == '0x7bc'
    int(x)
    Преобразует объект x в целое число; в случае ошибки во время преобразования возбуждает исключение ValueError, а если тип объекта x не поддерживает преобразование в целое число, воз
    буждает исключение TypeError. Если x является числом с пла
    вающей точкой, оно преобразуется в целое число путем усече
    ния дробной части.
    int(s, base)
    Преобразует строку s в целое число, в случае ошибки возбуж
    дает исключение ValueError. Если задан необязательный аргу
    мент base, он должен быть целым числом в диапазоне от 2 до 36
    включительно.
    oct(i)
    Возвращает восьмеричное представление целого числа i в виде строки, например, oct(1980) == '0o3674'
    Преобразо
    вание типов, стр. 295

    76
    Глава 2. Типы данных
    Таблица 2.4. Битовые операторы, применимые к целым числам
    Логические значения
    Существует два встроенных логических объекта: True и False. Как и все остальные типы данных в языке Python (встроенные, библиотеч
    ные или ваши собственные), тип данных bool может вызываться как функция – при вызове без аргументов возвращается значение False,
    при вызове с аргументом типа bool возвращается копия аргумента,
    а при вызове с любым другим аргументом предпринимается попытка преобразовать указанный объект в тип bool. Все встроенные типы дан
    ных и типы данных из стандартной библиотеки могут быть преобразо
    ваны в тип bool, а добавить поддержку такого преобразования в свои собственные типы данных не представляет никакой сложности. Ниже приводится пара присваиваний логических значений и пара логиче
    ских выражений:
    >>> t = True
    >>> f = False
    >>> t and f
    False
    >>> t and True
    True
    Как уже отмечалось ранее, в языке Python имеется три логических оператора: and, or и not. Выражения с уча
    стием операторов and и or вычисляются в соответствии с логикой сокращенных вычислений (shortcircuit logic),
    и возвращается операнд, определяющий значение всего выражения, тогда как результатом оператора not всегда является либо True, либо False.
    Программисты, использовавшие старые версии языка Python, иногда вместо True и False используют числа 1 и 0 – такой прием срабатывает практически всегда, но в новых программах, когда возникает необхо
    Синтаксис
    Описание
    i | j
    Битовая операция OR (ИЛИ) над целыми числами i и j; отрица
    тельные числа представляются как двоичное дополнение i ^ j
    Битовая операция XOR (исключающее ИЛИ) над целыми числа
    ми i и j i & j
    Битовая операция AND (И) над целыми числами i и j i << j
    Сдвигает значение i влево на j битов аналогично операции i *
    (2 ** j)
    без проверки на переполнение i >> j
    Сдвигает значение i вправо на j битов аналогично операции i //
    (2 ** j)
    без проверки на переполнение

    i
    Инвертирует биты числа i
    Логические операторы,
    стр. 39

    Тип чисел с плавающей точкой
    77
    димость в логическом значении, следует использовать встроенные ло
    гические объекты.
    Тип чисел с плавающей точкой
    Язык Python предоставляет три типа значений с плавающей точкой:
    встроенные типы float и complex и тип decimal.Decimal в стандартной библиотеке. Все три типа данных относятся к категории неизменяе
    мых. Тип float представляет числа с плавающей точкой двойной точ
    ности, диапазон значений которых зависит от компилятора языка C
    (или C# или Java), применявшегося для компиляции интерпретатора
    Python. Числа этого типа имеют ограниченную точность и не могут на
    дежно сравниваться на равенство значений. Числа типа float записы
    ваются с десятичной точкой или в экспоненциальной форме записи,
    например, 0.0, 4., 5.7,

    2.5,

    2e9, 8.9e

    4.
    В машинном представлении числа с плавающей точкой хранятся как двоичные числа. Это означает, что одни дробные значения могут быть представлены точно (такие как 0.5), а другие – только приблизительно
    (такие как 0.1 и 0.2). Кроме того, для представления используется фиксированное число битов, поэтому существует ограничение на ко
    личество цифр в представлении таких чисел. Ниже приводится пояс
    няющий пример, полученный в IDLE:
    >>> 0.0, 5.4, 2.5, 8.9e4
    (0.0, 5.4000000000000004, 2.5, 0.00088999999999999995)
    Проблема потери точности – это не проблема, свойственная только языку Python; все языки программирования обнаруживают проблему с точным представлением чисел с плавающей точкой.
    Если вам действительно необходимо обеспечить высокую точность,
    можно использовать числа типа decimal.Decimal. Эти числа обеспечива
    ют уровень точности, который вы укажете (по умолчанию 28 знаков после запятой), и могут точно представлять периодические числа, та
    кие как 0.1 1
    , но скорость работы с такими числами существенно ниже,
    чем с обычными числами типа float. Вследствие высокой точности числа типа decimal.Decimal прекрасно подходят для производства фи
    нансовых вычислений.
    Смешанная арифметика поддерживается таким образом, что резуль
    татом выражения с участием чисел типов int и float является число типа float, а с участием типов float и complex результатом является число типа complex. Поскольку числа типа decimal.Decimal имеют фик
    сированную точность, они могут участвовать в выражениях только
    1
    В десятичной системе счисления число 0.1 не является периодической дро
    бью, но в двоичной (то есть в машинном представлении) – это действитель
    но периодическая дробь. – Прим. перев.

    78
    Глава 2. Типы данных с другими числами decimal.Decimal и с числами типа int; результатом таких выражений является число decimal.Decimal. В случае попытки выполнить операцию над несовместимыми типами возбуждается ис
    ключение TypeError.
    Числа с плавающей точкой
    Все числовые операторы и функции, представленные в табл. 2.2
    (стр. 74), могут применяться к числам типа float, включая комбини
    рованные операторы присваивания. Тип данных float может вызы
    ваться как функция – без аргументов возвращается число 0.0, с аргу
    ментом типа float возвращается копия аргумента, а с аргументом лю
    бого другого типа предпринимается попытка выполнить преобразова
    ние указанного объекта в тип float. При преобразовании строки аргумент может содержать либо простую форму записи числа с деся
    тичной точкой, либо экспоненциальное представление числа. При вы
    полнении операций с числами типа float может возникнуть ситуация,
    когда в результате получается значение NaN (not a number – не число)
    или «бесконечность». К сожалению, поведение интерпретатора в та
    ких ситуациях может отличаться в разных реализациях и зависит от математической библиотеки системы.
    Ниже приводится пример простой функции, выполняющей сравнение чисел типа float на равенство в пределах машинной точности:
    def equal_float(a, b):
    return abs(a  b) <= sys.float_info.epsilon
    Чтобы воспользоваться этой функцией, необходимо импортировать модуль sys. Объект sys.float_info имеет множество атрибутов. Так,
    sys.float_info.epsilon хранит минимально возможную разницу между двумя числами с плавающей точкой. На одной из 32разрядных ма
    шин автора книги это число чуть больше 0.000 000 000 000 000 2. (Ep
    silon – это традиционное название чисел такого рода.) Тип float в язы
    ке Python обеспечивает надежную точность до 17 значащих цифр.
    Если ввести sys.float_info в среде IDLE, будут выведены все атрибуты этого объекта, куда входят минимальное и максимальное значения чисел с плавающей точкой, которые могут быть представлены маши
    ной. А если ввести команду help(sys.float_info), будет выведена неко
    торая информация об объекте sys.float_info.
    Числа с плавающей точкой можно преобразовать в целые числа с по
    мощью функции int(), которая возвращает целую часть и отбрасывает дробную часть, или с помощью функции round(), которая учитывает величину дробной части, или с помощью функций math.floor() и math.ceil()
    , которые округляют вверх или вниз до ближайшего целого.
    Метод float.is_integer() возвращает значение True, если дробная часть числа равна 0. Представление дробной части числа можно получить с помощью метода float.as_integer_ratio(). Например, пусть x = 2.75,

    Тип чисел с плавающей точкой
    1   ...   5   6   7   8   9   10   11   12   ...   74


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