Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 51
Текст из файла (страница 51)
Поддержку дополнительных возможностейчисленного программирования в языке Python, включая инструменты дляанализа и построения графических изображений, библиотеки реализациистатистических методов и популярный пакет SciPy, вы можете найти на сайтеPyPI����������������������������������������������������������������������или в Сети. Кроме того, обратите внимание, что расширение NumPy�����������������в настоящее время не входит в состав стандартной библиотеки Python и должноустанавливаться отдельно.В заключениеВ этой главе были рассмотрены типы числовых объектов языка Python и операции, применяемые к ним. Здесь мы познакомились со стандартными целочисленными типами и с вещественными числами, а также с некоторыми экзотическими, нечасто используемыми типами, такими как комплексные числа,рациональные числа и множества.
Мы также исследовали синтаксис выражений в языке Python, порядок преобразования типов, битовые операции и различные литеральные формы представления чисел в сценариях.Далее в этой части книги мы рассмотрим следующий тип объектов – строки.Однако в следующей главе мы потратим некоторое время на более подробноеознакомление с механизмом присваивания значений переменным. Это, пожалуй, самая фундаментальная идея в языке Python, поэтому вам обязательно192Глава 5. Числанужно прочитать следующую главу.
Но перед этим ответьте на контрольныевопросы главы.Закрепление пройденногоКонтрольные вопросы1. Каким будет значение выражения 2 * (3 + 4) в языке Python?2. Каким будет значение выражения 2 * 3 + 4 в языке Python?3. Каким будет значение выражения 2 + 3 * 4 в языке Python?4. Какие функции можно использовать для вычисления квадратного корнячисла и квадрата?5. Какой тип будет иметь результат следующего выражения: 1 + 2.0 +3?6. Как можно выполнить усечение и округление вещественного числа?7. Как можно преобразовать целое число в вещественное?8.
Как можно вывести целое число в восьмеричном, шестнадцатеричноми двоичном представлениях?9. Как можно преобразовать строковое представление восьмеричного, шестнадцатеричного или двоичного числа в простое целое число?Ответы1. Результатом выражения будет число 14, то есть результат произведения 2 * 7,потому что круглые скобки предписывают выполнить операцию сложениядо операции умножения.2. В данном случае результат будет равен 10, то есть результату выражения6 + 4. При отсутствии круглых скобок в языке Python используются правиластаршинства операторов, согласно которым оператор умножения имеет более высокий приоритет, чем оператор сложения (стоящий левее).3. Данное выражение даст в результате число 14, то есть результат выражения2 + 12, согласно тем же правилам старшинства, что и в предыдущем вопросе.4.
Функции вычисления квадратного корня, а также числа пи, тангенсаи многие другие доступны в импортируемом модуле math. Чтобы найти квадратный корень числа, необходимо импортировать модуль math и вызватьфункцию math.sqrt(N). Чтобы найти квадрат числа, можно воспользоваться либо оператором возведения в степень X ** 2, либо встроенной функциейpow(X, 2).
Любой из последних двух способов можно также использовать длявычисления квадратного корня, выполнив возведение в степень .5 (например, X ** .5) .5. Результатом будет вещественное число: целые числа будут преобразованыв вещественные числа как к наиболее сложному числовому типу в выражении и для вычисления результата будет использоваться математика вещественных чисел.6. Функции int(N) и math.trunc(N) выполняют отсечение дробной части, а функция round(N, digits) выполняет округление.
Округление вниз можно такжевыполнить с помощью функции math.floor(N), а простое округление при отображении – за счет использования операций форматирования строк.Закрепление пройденного1937. Функция float(I) выполняет преобразование целых чисел в вещественные.Смешивание целых и вещественных чисел в одном выражении также приводит к выполнению преобразования. В некотором смысле операцию деления / в Python 3.0 также можно рассматривать как средство преобразования – она всегда возвращает вещественный результат, включающий дробную часть, даже если оба операнда являются целыми числами.8.
Встроенные функции oct(I) и hex(I) возвращают строковые представленияцелых чисел в восьмеричном и в шестнадцатеричном форматах. В версияхPython 2.6 и 3.0 имеется также функция bin(I), которая возвращает строковое представление целого числа в двоичном формате. Для этих же целеймогут использоваться оператор % форматирования строк и строковый методformat.9. Для преобразования строковых представлений восьмеричных, шестнадцатеричных и двоичных чисел в обычные целые числа может использоватьсяфункция int(S, base) (достаточно передать в аргументе base значение 8, 16или 2, соответственно).
Для этих целей может также использоваться функция eval(S), но она более медленная и может стать источником проблем,связанных с безопасностью. Обратите внимание: целые числа в памятикомпьютера всегда хранятся в двоичном формате, для их вывода просто используются разные форматы представления.Глава6.Интерлюдияо динамической типизацииВ предыдущей главе мы приступили к детальному исследованию базовыхтипов объектов в языке Python, начав с чисел. Мы продолжим наши исследования типов в следующей главе, но прежде чем продолжить, вам необходиморазобраться в самой фундаментальной, на мой взгляд, идее программированияна языке Python, которая составляет основу гибкости языка, – динамическойтипизации и полиморфизме.Как будет показано в этой главе и далее в книге, в сценариях на языке Pythonне производится объявление объектов определенных типов.
В действительности нам даже не приходится беспокоиться о конкретных типах; более того, онимогут применяться в более широком диапазоне ситуаций, чем можно было быпредусмотреть заранее. Поскольку динамическая типизация составляет основу этой гибкости, давайте коротко ознакомимся с этой моделью.Отсутствие инструкций объявленияЕсли у вас имеется опыт работы с компилирующими языками или с языками, обладающими статической типизацией, такими как C, C++ или Java, вероятно, эта тема в книге вызовет у вас недоумение. Мы все время использовалипеременные, не объявляя ни их самих, ни их типы, и все как-то работало.
Например, когда вводится инструкция a = 3 в интерактивной оболочке интерпретатора или в файле сценария, как интерпретатор Python узнает, что речь идето целом числе? И вообще, как Python узнает, что есть что?Как только вы начинаете задавать такие вопросы, вы попадаете в сферу действия модели динамической типизации, используемой в языке Python. Типыданных в языке Python определяются автоматически во время выполнения,а не в результате объявлений в программном коде. Это означает, что вам нетребуется заранее объявлять переменные (эту концепцию проще понять, еслииметь в виду, что все сводится к переменным, объектам и ссылкам междуними).Отсутствие инструкций объявления195Переменные, объекты и ссылкиКак было видно из примеров, приводившихся до сих пор в книге, когда выполняется операция присваивания, такая как a = 3, интерпретатор выполняет ее,хотя перед этим ему нигде не сообщалось, что a – это имя переменной, или чтоона представляет объект целочисленного типа.
В языке ����������������������Python����������������все это решается весьма естественным способом, как описано ниже:Создание переменнойПеременная (то есть имя), такая как a, создается автоматически, когда в программном коде ей впервые присваивается некоторое значение. Все последующие операции присваивания просто изменяют значение, ассоциированноес уже созданным именем. Строго говоря, интерпретатор Python определяетнекоторые имена до запуска программного кода, но вполне допустимо думать, что переменные создаются первой операцией присваивания.Типы переменныхПеременные не имеют никакой информации о типе или ограничениях, связанных с ним.
Понятие типа присуще объектам, а не именам. Переменныеуниверсальны по своей природе – они всегда являются всего лишь ссылками на конкретные объекты в конкретные моменты времени.Использование переменнойКогда переменная участвует в выражении, ее имя замещается объектом, накоторый она в настоящий момент ссылается, независимо от того, что это заобъект. Кроме того, прежде чем переменную можно будет использовать, ейдолжно быть присвоено значение – использование неинициализированнойпеременной приведет к ошибке.В итоге складывается следующая картина: переменные создаются при выполнении операции присваивания, могут ссылаться на объекты любых типов и имдолжны быть присвоены некоторые значения, прежде чем к ним можно будетобратиться. Это означает, что от вас не требуется заранее объявлять переменные в сценарии, но вы должны инициализировать их перед использованием –счетчик, например, должен быть инициализирован нулевым значением, прежде чем его можно будет наращивать.Модель динамической типизации существенно отличается от моделей типовв традиционных языках программирования.
Динамическая типизация обычно проще поддается пониманию начинающих, особенно если они четко осознают разницу между именами и объектами. Например, если ввести такую инструкцию:>>> a = 3интерпретатор Python выполнит эту инструкцию в три этапа, по крайней мере,концептуально. Следующие этапы отражают все операции присваиванияв языке Python:1. Создается объект, представляющий число 3.2.
Создается переменная a, если она еще отсутствует.3. В переменную a записывается ссылка на вновь созданный объект, представляющий число 3.196Глава 6. Интерлюдия о динамической типизацииРезультатом выполнения этих этапов будет структура, которая показана нарис. 6.1. Как показано на схеме, переменные и объекты хранятся в разныхчастях памяти и связаны между собой ссылкой (ссылка на рисунке показана в виде стрелки). Переменные всегда ссылаются на объекты и никогда – надругие переменные, но крупные объекты могут ссылаться на другие объекты(например, объект списка содержит ссылки на объекты, которые включеныв список).ИменаaСсылкиОбъекты3Рис. 6.1. Имена и объекты после выполнения операции присваивания a = 3.Переменная превращается в ссылку на объект 3.