5 Година

Основні типи даних; числові

Вивчаючи матеріал попередніх чотирьох глав, ми підготували грунт для подальшого вивчення Python - познайомилися з базовими концепціями об'єктно-орієнтованого програмування і дізналися про змінних. Але що ми знаємо про те, що може зберігатися в цих змінних? Ви, ймовірно, вже зрозуміли, що змінні можуть містити найрізноманітнішу корисну інформацію, включаючи значення дат і часу, рядки символів і навіть цілі функції. Але при цьому потрібно слідувати певним правилам збереження даних та їх інтерпретації в Python. Щоб розібратися в цих правилах, слід мати уявлення про типи даних, підтримуваних в Python. Цій темі якраз і присвячені справжня і наступна глави. Тут ми обговоримо типи даних, що представляють числові значення:

  • ціле (integer);
  • довге ціле (long integer);
  • число з плаваючою комою (floating point);
  • комплексне число (complex).

У цій та наступній главах ми будемо оперувати тільки з основними типами даних, до яких відносяться числовий, послідовність і словник. Функції будуть розглянуті в главі 7, інші призначені для користувача типи, або об'єкти, висвітлюються в частині II. А зараз займемося числовими типами даних.

Комп'ютери не наділені власним інтелектом, тому програмістам в більшості мов програмування необхідно явно вказувати, до якого різновиду чисел відноситься те чи інше значення. Більш того, компільовані мов цю інформацію треба повідомляти заздалегідь, тобто тип змінної повинен бути оголошений до ініціалізації змінної. (Ініціалізація - це привласнення змінної першого значення.) Спроба привласнити змінної значення, яке не відповідає оголошеному для неї типу, закінчиться помилкою в роботі компілятора (чим він Вас неодмінно "порадує"). Наприклад, припустимо, що в С Ви оголошуєте змінну наступним чином:

Цей рядок має на увазі, що змінна n буде містити позитивні або негативні цілі числа. Припустимо, що десь в коді своєї програми Ви спробуєте виконати таке привласнення: n = 3.14159;

*Прим. В. Шипкова: остання порада, по суті, досить корисний. Мало того, що результат може виявитися помилковим в плані точності обчислень, ще й самі по собі перетворення з одного типу в інший це досить витратна операція для процесора. Не варто про це забувати.

Робота Python базується на припущенні, що програміст знає, що робить. Статичність типів змінних в інших мовах - це результат реалізації протилежної концепції, що полягає в тому, що програміст потребує захисту безпосередньо від самого себе. Динамічне визначення типів, якщо їм не зловживати, дозволить істотно скоротити і спростити код програми. Наприклад, припустимо, що Ви зчитуєте рядки символів, що вводяться користувачем. Ви хочете перетворити ці строкові дані в числа і використовувати їх в якості вхідних даних своєї програми. Якщо користувачеві дозволяється вводити цілі числа, довгі цілі і числа з плаваючою комою, то на звичайній мові програмування Вам довелося б для цього передбачити принаймні три змінні трьох різних типів. А в Python Вам вистачить всього лише однієї змінної, яка може містити будь-яке значення з трьох допустимих типів. І це стає можливим завдяки динамічному визначення типів даних в Python.

Ми почнемо докладне обговорення теми з уже знайомого Вам типу - цілі числа.

Лістинг 5.1. Операції з maxint

[MSC 32 bit (Intel)] on Win32

>>> from sys import *

print "128-bit machine:"

print "maxint:", z, "-maxint:", -z

На рис. 5.1 показаний результат виконання програми inttest.py.

Зверніть увагу, що на 32-розрядної машині найбільшим цілим числом, яке можна використовувати, є значення (2 ** 31L) -1. Це пояснюється тим, що один біт використовується для вказівки знака числа - позитивного або негативного. У більшості систем він називається старшим двійковим бітом, або просто знаковим бітом. Причина того, що Ви не можете використовувати число, яке точно дорівнює значенню 2 ** 31L (тобто 21474836 ^ 8), досить складна і заплутана, щоб пояснювати її в даний момент. Вона пов'язана зі способом представлення чисел в двійковій системі.

Зацікавленим Новомосковсктелям рекомендую звернутися до розділу "Приклади і вправи" цієї глави, де вміщено посилання на додаткові матеріали. У їх числі Ви знайдете сервери, присвячені дослідженням позиційних числових систем, де паралельно висвітлюються і питання комп'ютерного представлення чисел. Інші комп'ютерні мови дозволяють зберігати цілі числа без знака, і такі числа, що очевидно, називаються беззнаковими (unsigned). Беззнакові числа дозволяють використовувати всі 32 біта, але тільки для подання позитивних цілих чисел.

Рис.5.1. Результат виконання програми inttest.py

Аналогічно, для 64-розрядної машини найбільшим цілим числом, яке допускається використовувати, є значення (2 ** 63) - 1, а для 128-розрядної машини воно становить (2 ** 127) - 1. У своїй роботі Ви, як правило, не будете досягати граничного значення maxint навіть на 32-розрядних машинах. Максимальні значення цілих чисел в 64- і 128-розрядному уявленнях - це дуже великі числа, які можуть знадобитися тільки для космічних досліджень або підрахунків числа молекул.

Але якщо проблема з максимально (мінімально) допустимими значеннями у Вас все ж виникне, не впадайте у відчай. Довгі цілі числа - ось спосіб, що дозволяє обійти ці обмеження в Python, і ми обговоримо їх у наступному розділі.

Довгі цілі числа типу long integer, які іноді зустрічаються також під назвами longs або bigints, присутні в Python з самого початку. По суті, вони ведуть себе точно так само, як і звичайні цілі числа, але тільки не обмежені ніякими межами. Перетворення цілих чисел в довгі цілі числа і навпаки, на жаль, не є достатньо прозорою процедурою для програмістів. Але є надія, що Гуїдо усуне ці відмінності в майбутніх версіях Python. Втім, можна спробувати самостійно скласти алгоритм, який буде автоматично виконувати ці перетворення, якщо Вам це потрібно.

Що мається на увазі під словами не обмежені ніякими межами? Насправді це зовсім не означає, що Ви можете використовувати числа, що йдуть в нескінченність. Мається на увазі тільки те, що звичайні обмеження істотно розширюються. До чого це зводиться на практиці? До того, що розмір будь-якого заданого довгого цілого числа підпорядковується тільки фактичним обмеженням, що випливають з характеристик вашої машини. Наприклад, Ви не можете використовувати в своїй програмі таке число, для зберігання якого буде потрібно більший обсяг пам'яті, ніж її є фактично. Так, на моїй домашній машині з системою Server Windows NT 4.0 встановлено 256 Мбайт оперативної пам'яті. В ідеалі, якщо знехтувати обов'язковим витрачанням пам'яті на функціонування операційної системи і самого інтерпретатора Python, а також ряду обов'язкових утиліт, найбільше довге ціле число, яке я міг би теоретично використовувати, має вміститися в ці 256 Мбайт. В результаті вийшло б число довжиною щось близько 2 `013` 265 `920 цифр. Це досить пристойне значення, але, тим не менш, кінцеве. У внутрішньому комп'ютерному поданні довгі цілі зберігаються як 16-розрядний числа з максимальним значенням 32 768. Оскільки 32 768 - це 2 в 15-й ступеня, стає очевидним, що 16-й розряд використовується для чогось ще. Цей 16-й біт застосовується для реалізації "прапора переповнення" (тобто виходу за межі), який використовується для організації операцій з перенесення, запозичення і т.п. що багато в чому нагадує те, як Ви робите, коли вирішуєте розрахункові завдання на папері. Щоб краще усвідомити то, як влаштовані великі цілі числа, спробуйте виконати вправи, наведені в кінці цієї глави.

Під час роботи з довгими числами увагу слід звертати не тільки на можливості Вашого комп'ютера, але і на терпіння користувачів вашої програми. Наприклад, якщо у вашій програмі передбачається висновок на друк числа гуголплекс, то користувачеві доведеться посидіти біля свого комп'ютера років 5, а то і більше.

nibailes / P140 / lecture22 / index.htm.) У лістингу 5.3 приведена проста процедура визначення довжини космічного світлового року в кілометрах.

spy = 60 * 60 * 24 * 365.2422

n = long (spy) * long (p)