Лутц М. - Изучаем Python (1077325), страница 36
Текст из файла (страница 36)
Хотя этих сведений вполне достаточно для большинства программистов, тем не менее я предлагаю исследовать этот тип немного подробнее. В версии Ру([топ 2.3 появился новый логический тип с именем Ьоо1, доступный в виде двух новых встроенных предопределенных имен Тгзе и га1зе, которые в свою очередь являются всего лишь подклассом (в объектно-ориентированном смысле) встроенного целочисленного типа [лт. Тгсе и га!зе ведут себя точно так же, как и целые числа 1 и О, за исключением того, что для их вывода на экран используется другая логика — они выводятся как слова Тгсе и га1зе, вместо цифр 1 и О (технически, класс Ьоо1 переопределяет функции зт г и герг). В соответствии с интерпретацией этих значений, начиная с версии РуФ[топ 2.3, значения выражений логического типа выводятся как слова Тгсе и Га1зе, а не как числа 1 и О.
Можно считать, что логический тип делает истинные значения более явными. Например, теперь бесконечный цикл можно оформить как ип11е Тгсе:, а не как менее очевидный ипт1е 1:. Точно так же более понятной становится инициализация флагов, например Г1аО = га1зе. Во всех остальных практических применениях значения Тгсе и га1зе можно интерпретировать, как предопределенные переменные с целочисленными значениями 1 и О. В любом случае раньше большинство программистов создавали переменные Тгсе и га1зе, которым присваивали значения 1 и О, таким образом данный новый тип просто следует этому стандартному приему. Его реализация может приводить к неожиданным результатам: так как Тгзе — это всего лишь целое значение 1, которое выводится на экран особым образом, выражение Тгзе э 3 даст в языке Ру1)топ результат 4! Мы еще вернемся к логическому типу в главе 9 (где будет дано определение истины в языке РуФ[топ) и в главе 12 (где познакомимся с такими логическими операторами, как ало и ог).
164 Глава 5. Числа Расширения сторонних разработчиков Помимо встроенных числовых типов собственно языка Руй1оп вы можете встретить различные свободно распространяемые расширения сторонних разработчиков, реализующие еще более экзотические числовые типы. К таким типам можно отнести рациональные числа, векторы и матрицы. Модули, реализующие эти типы, можно загрузить из Сети, там же вы найдете более подробную информацию о них. В заключение В этой главе были рассмотрены типы числовых объектов языка Ру$йоп и операции, применяемые к ним.
Здесь мы познакомились со стандартными целочисленными типами и с числами с плавающей точкой, а также с некоторыми экзотическими, нечасто используемыми типами, такими как комплексные числа и числа с фиксированной точностью. Мы также исследовали синтаксис выражений в языке РуФЬоп, порядок преобразования типов, битовые операции и различные литеральные формы представления чисел в сценариях. Далее, в этой же части книги, мы рассмотрим следующий тип объектов — строки. Однако в следующей главе мы потратим некоторое время на более подробное ознакомление с механизмом операции присваивания значений переменным.
Это, пожалуй, самая фундаментальная идея в языке Рубикон, поэтому вам обязательно нужно прочитать следующую главу. Но перед этим ответьте на контрольные вопросы главы. Закрепление пройденного Контрольные вопросы 1. Каким будет значение выражения 2 * (3+ 4) в языке Ру$йоп7 2. Каким будет значение выражения 2 * 3 + 4 в языке РуФпоп7 3. Каким будет значение выражения 2 + 3 * 4 в языке РуФпоп7 4. Какие функции можно использовать для вычисления квадратного корня числа и квадрата7 б.
Какой тип будет иметь результат следующего выражения: 1 + 2, 0 +3? 6. Каким образом можно выполнить усечение и округление числа с плавающей точкой7 7. Как им образом можно преобразовать целое число в число с плавающей точкой7 8. Каким образом можно вывести целое число в восьмеричном и шестнадцатеричном представлениях7 9.
Каким образом можно преобразовать строковое представление восьмеричного или шестнадцатеричного числа в простое целое число7 165 Закрепление пройденного Ответы 6. 7. 8. 1. 2. 3. 4. б. Результатом выражения будет число 14, то есть результат произведения 2 * 7, потому что круглые скобки предписывают выполнить операцию сложения до операции умножения. В данном случае результат будет равен 10, то есть результат выражения 6 + 4. При отсутствии круглых скобок в языке РуС)соп используются правила старшинства операторов, согласно которым оператор умножения имеет более высокий приоритет, чем оператор сложения (стоящий левее). Данное выражение даст в результате число 14, то есть результат выражения 2 е 12, согласно тем же правилам старшинства, что и в предыдущем вопросе.
Функции вычисления квадратного корня, а также числа ли, тангенса и многие другие доступны в импортируемом модуле вас л. Чтобы найти квадратный корень числа, необходимо импортировать модуль заСЛ и вызвать функцию ааСП.адгС()4). Чтобы найти квадрат числа, можно воспользоваться либо оператором возведения в степень Х ** 2, либо встроенной функцией рон(Х, 2). Результатом будет число с плавающей точкой: целые числа будут преобразованы в числа с плавающей точкой, как к наиболее сложному числовому типу в выражении, и для вычисления результата будет использоваться математика вещественных чисел.
Функция слс(й) выполняет отсечение дробной части, а функция госсе(й, рсдс!а?) выполняетокругление. Функция 1'1оас(й) выполняет преобразование целых чисел в числа с плавающей точкой. Смешивание целых чисел и чисел с плаваю- щей точкой в одном выражении также приводит к выполнению преобразования. Встроенные функции осС(1) и Пех(1) возвращают строковые пред- ставления целых чисел в восьмеричном и в шестнадцатеричном фор- матах, Для этих же целей может использоваться строка формата %. Для преобразования строковых представлений восьмеричных и шестнадцатеричных чисел в обычные целые числа может использоваться функция!лс(8, Ьаае? ). Для этих целей может также использоваться функция еча!(З), но она более медленная и может стать источником проблем, связанных с безопасностью.
Обратите внимание: целые числа в памяти компьютера всегда хранятся в двоичном формате, для вывода которых просто используются разные форматы представления. Интерлюдия о динамической типизации В предыдущей главе мы приступили к детальному исследованию базовых типов объектов в языке Ру$Ьоп, начав с чисел.
Мы продолжим наши исследования типов в следующей главе, но прежде чем продолжить, вам необходимо разобраться в самой фундаментальной, на мой взгляд, идее программирования на языке РуФЬоп, которая составляет основу гибкости языка — динамической типизации и полиморфизме. Как будет показано в этой главе и далее в книге, в сценариях на языке Ру1Ьоп не производится объявление объектов определенных типов.
В действительности нам даже не приходится беспокоиться о конкретных типах; более того, они могут применяться в более широком диапазоне ситуаций, чем можно было предусмотреть заранее. Поскольку динамическая типизация составляет основу этой гибкости, давайте коротко ознакомимся с этой моделью. Отсутствие инструкций объявления Если у вас имеется опыт работы с компилирующими языками или с языками, обладающими статической типизацией, такими как С, С++ или дача, вероятно, эта тема в книге вызывает у вас недоумение. Мы все время использовали переменные, не объявляя ни их самих, ни их типы, и все как-то работало.
Например, когда вводится инструкция а = 3 в интерактивной оболочке интерпретатора или в файле сценария, как интерпретатор РуФЬоп узнает, что речь идет о целом числе7 И вообще, как Ру1Ьоп узнает, что есть чтоу Как только вы начинаете задавать такие вопросы, вы попадаете в сферу действия модели динамической типизации, используемой в языке РуСЬоп. В языке РуФЬоп типы определяются автоматически, во время выполнения, а не в результате объявлений в программном коде. Это Отсутствие инструкций объявления 167 означает, что вам не требуется заранее объявлять переменные (эту концепцию проще понять, если иметь в виду, что все сводится к переменным, объектам и ссылкам между ними). Переменные, обьекты и ссылки Как было видно из примеров, приводившихся до сих пор в книге, когда запускается операция присваивания, такая как а = 3, интерпретатор выполняет ее, хотя перед этим ему нигде не сообщалось, что а — это имя переменной, или что она представляет объект целочисленного типа.
В языке РутЬоп все это решается весьма естественным способом, как описано ниже: Создание переменной Переменная (то есть имя), такая как в, создается автоматически, когда в программном коде ей впервые присваивается некоторое значение. Все последующие операции присваивания просто изменяют значение, ассоциированное с уже созданным именем. Строго говоря, интерпретатор РуФ)топ определяет некоторые имена до запуска программного кода, но вполне допустимо думать, что переменные создаются первой операцией присваивания.