Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 43
Текст из файла (страница 43)
ЧислаНапример, если вы запишете выражение X + Y * Z, интерпретатор Python сначала выполнит умножение (Y * Z), а затем прибавит результат к значению X,потому что оператор * имеет более высокий приоритет (в табл. 5.2 он находитсяниже), чем оператор +. Точно так же в первом примере этого раздела сначалабудут найдены произведения (A * B и C * D), а затем будет выполнено сложение.Группировка подвыражений с помощью круглых скобокВы можете навсегда забыть о старшинстве операторов, если будете группировать части выражений с помощью круглых скобок. Когда часть выражения заключается в круглые скобки, они отменяют правила старшинства операторов –Python всегда в первую очередь вычисляет подвыражения в круглых скобках,а затем использует их результаты в объемлющем выражении.Например, выражение X + Y * Z можно записать одним из следующих способов, чтобы вынудить Python произвести вычисления в требуемом порядке:(X + Y) * ZX + (Y * Z)В первом случае сначала будет выполнено сложение значений X и Y, потому чтоэто подвыражение заключено в круглые скобки.
Во втором случае первой будетвыполнена операция умножения (точно так же, как если бы скобки вообще отсутствовали). Вообще говоря, использование круглых скобок в сложных выражениях можно только приветствовать – они не только определяют порядоквыполнения вычислений, но и повышают удобочитаемость.Смешивание типов и их преобразованиеПомимо смешивания операторов вы можете также смешивать различные числовые типы. Допустим, что требуется найти сумму целого и вещественногочисла:40 + 3.14Но это влечет за собой другой вопрос: какого типа будет результат – целое число или вещественное число? Ответ прост, особенно для тех, кто уже имеет опытработы с любыми другими языками программирования: в выражениях, гдеучаствуют значения различных типов, интерпретатор сначала выполняет преобразование типов операндов к типу самого сложного операнда, а потом применяет математику, специфичную для этого типа.
Если вам уже приходилосьиспользовать язык C, вы найдете, что такое поведение соответствует порядкупреобразования типов в этом языке.Интерпретатор Python ранжирует сложность числовых типов следующим образом: целые числа проще, чем вещественные числа, которые проще комплексных чисел. Поэтому, когда в выражении участвуют целое число и вещественное число, как в предыдущем примере, то целое число сначала будет преобразовано в вещественное число, а затем будет выполнена операция из математикивещественных чисел, что дает в результате вещественное число.
Точно так же,когда один из операндов в выражении является комплексным числом, другойоперанд будет преобразован в комплексное число и выражение вернет в результате также комплексное число. (Кроме того, в Python 2.6 обычные целые числапреобразуются в длинные целые, если значение не может быть представленов виде обычного целого числа; в версии 3.0 все целые числа попадают в категорию длинных целых.)Базовые числовые типы161Существует возможность принудительного преобразования типов с помощьювстроенных функций:>>> int(3.1415) # Усекает дробную часть вещественного числа3>>> float(3)# Преобразует целое число в вещественное3.0Однако в обычных ситуациях делать это не приходится, потому что Python автоматически выполняет преобразование типов и тип результата, как правило,соответствует вашим ожиданиям.Кроме того, имейте в виду, что все эти преобразования производятся толькопри смешивании числовых типов (то есть целых и вещественных чисел) в выражении, включая выражения, выполняющие математические операциии операции сравнения.
Вообще, �����������������������������������������Python�����������������������������������не выполняет автоматическое преобразование других типов. Например, попытка выполнить операцию сложениястроки и числа приведет к появлению ошибки, если вы вручную не выполнитепреобразование типа одного из операндов, – примеры таких преобразованийвстретятся вам в главе 7, когда мы будем обсуждать строки.В Python 2.6 допускается сравнивание разнотипных нечисловых значений, но при этом преобразование типов операндов невыполняется (сравнивание разнотипных значений выполняетсяв соответствии с фиксированным, но достаточно произвольнымправилом).
В версии 3.0 сравнивание разнотипных нечисловыхзначений не допускается и приводит к исключению.Обзор: перегрузка операторов и полиморфизмНесмотря на то, что сейчас в центре нашего внимания находятся встроенныечисла, вы должны знать, что в языке Python существует возможность выполнить (то есть реализовать) перегрузку любого оператора с помощью классовPython или расширений на языке C для работы с создаваемыми объектами.Например, как будет показано позже, объекты, реализованные в виде классов,могут участвовать в операции сложения, индексироваться с помощью выражения [i] и так далее.Кроме того, Python сам автоматически перегружает некоторые операторы, чтобы с их помощью можно было выполнять различные действия, в зависимостиот типа встроенных объектов.
Например, оператор + выполняет операцию сложения, когда применяется к числам, но когда он применяется к последовательностям, таким как строки или списки, он выполняет операцию конкатенации.В действительности оператор + может выполнять любые действия, когда применяется к объектам, которые вы определяете с помощью классов.Как было показано в предыдущей главе, эта особенность обычно называетсяполиморфизмом – этот термин означает, что выполняемая операция зависит оттипов объектов-операндов, над которыми она выполняется.
Мы еще вернемсяк этому понятию в главе 16, когда будем рассматривать функции, потому чтов этом контексте суть полиморфизма становится более очевидной.162Глава 5. ЧислаЧисла в действииПриступим к программированию! Самый лучший способ понять числа и выражения состоит в том, чтобы увидеть их в действии, поэтому давайте запустим интерактивный сеанс работы с интерпретатором и попробуем выполнитьнекоторые простые, но весьма показательные операции (если вы забыли, какзапускается интерактивный сеанс, обращайтесь к главе 3).Переменные и простые выраженияПрежде всего, рассмотрим основные арифметические операции.
Для началаприсвоим двум переменным (a и b) целочисленные значения, чтобы потом использовать их в более сложных выражениях. Переменные – это всего лишьимена, создаваемые в языке Python, которые используются для обозначенияинформации в программах. Об этом мы будем говорить более подробно в следующей главе, а пока вы должны знать, что в языке Python:•• Переменные создаются с помощью операции присваивания.•• При вычислении выражений имена переменных замещаются их значениями.•• Прежде чем переменная сможет участвовать в выражениях, ей должнобыть присвоено значение.•• Переменные являются ссылками на объекты и никогда не объявляются заранее.Другими словами, следующие операции присваивания автоматически приводят к созданию переменных a и b:% python>>> a = 3>>> b = 4# Создается имяЗдесь я также использовал комментарий. Вспомните, что в программном кодена языке Python текст, следующий за символом #, считается комментариеми игнорируется интерпретатором.
Комментарии – это один из способов описатьпрограммный код на удобном для восприятия языке. Поскольку программныйкод, который пишется в ходе интерактивного сеанса, является временным,вам не требуется писать комментарии, я же буду добавлять их в примеры, чтобы объяснять работу программного кода.1 В следующей части книги мы познакомимся с еще одной похожей особенностью – со строками документирования,которые включают текст комментариев в объекты.А теперь попробуем использовать наши первые целочисленные объекты в выражениях.
В настоящий момент переменные a и b все еще имеют значения 3 и 4соответственно. Когда переменные, подобные этим, участвуют в выражении,они замещаются их значениями, а при работе в интерактивном режиме результат вычисления выражения тут же выводится на экран:1Если вы пробуете примеры на практике, вам не нужно вводить текст, начинающийсяс символа # и продолжающийся до конца строки; комментарии просто игнорируютсяинтерпретатором и не являются необходимой частью инструкций, которые мы выполняем.163Числа в действии>>> a + 1, a(4, 2)>>> b * 3, b(12, 2.0)>>> a % 2, b(1, 16)>>> 2 + 4.0,(6.0, 16.0)- 1# Сложение (3 + 1), вычитание (3 - 1)/ 2# Умножение (4 * 3), деление (4 / 2)** 2# Деление по модулю (остаток), возведение в степень2.0 ** b # Смешивание типов, выполняется преобразованиеС технической точки зрения результатами этих инструкций являются кортежи,состоящие из двух значений, потому что вводимые строки содержат по два выражения, разделенные запятыми.
Именно по этой причине результаты отображаются в круглых скобках (подробнее о кортежах будет рассказываться позднее).Следует заметить, что эти выражения выполняются без ошибок потому, что ранее переменным a и b были присвоены значения. Если использовать переменную,которой еще не было присвоено значение, Python выведет сообщение об ошибке:>>> c * 2Traceback (most recent call last):File “<stdin>”, line 1, in ?NameError: name ‘c’ is not definedВ языке Python от вас не требуется заранее объявлять переменные, но преждечем их можно будет использовать, им должны быть присвоены некоторые значения. На практике это означает, что перед тем как к счетчикам можно будетприбавлять некоторые значения, их необходимо инициализировать нулевымзначением; прежде чем к спискам можно будет добавлять новые элементы, ихнеобходимо инициализировать пустыми списками, и так далее.Ниже приводятся два более сложных выражения, чтобы проиллюстрироватьпорядок выполнения операторов и производимые преобразования:>>> b / 2 + a# То же, что и ((4 / 2) + 3)5.0>>> print(b / (2.0 + a)) # То же, что и (4 / (2.0 + 3))0.8В первом выражении отсутствуют круглые скобки, поэтому интерпретаторPython автоматически группирует компоненты выражения в соответствиис правилами определения старшинства – оператор / находится ниже в табл. 5.2,чем оператор +, поэтому его приоритет считается выше и он выполняется первым.