§4 Переменные. Числовые типы данных

Переменные

Чтобы использовать данные различных типов необходимо использовать переменные. Переменная (variable) в python – это ссылка на объект определенного типа. Данные на которые ссылается переменная называются значением переменной. Python определяет тип переменной во время выполнения программы. Такой способ работы с данными называется динамической типизацией.
Переменная имеет имя (идентификатор), правила записей которых мы обсудили на предыдущем уроке. Говорят, что значение некоторого типа, хранящееся в памяти, связывается с эти именем. Это имя можно затем связать с другими данными того же или иного типа. Иными словами, одна и та же переменная может ссылаться, во время работы программы, на данные различного типа (как следствие динамической типизации). Если в программе данные не связаны с каким-либо именем — они утрачиваются (т.е удаляются из памяти). Приведем пример программы демонстрирующей работу с данными разных типов в python.

>>> А = 4
>>> Б = 5
>>> А * Б
20
>>> А = "Четыре";
>>> А * Б
'ЧетыреЧетыреЧетыреЧетыреЧетыре'
>>> А + Б
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    А + Б
TypeError: Can't convert 'int' object to str implicitly
>>> А + str(Б)
'Четыре5'

Схема1
В первых двух строках мы связали объекты целочисленного типа с именами А и Б (примечание: кириллические символы здесь используются только для иллюстрации возможности использования в python, в качестве идентификатора – не латинского символа Unicode, а вовсе не для того, чтобы это вошло в практику!). В стр. 5 с А связан теперь объект строкового типа и операция в стр. 6 вернет нам уже не число (20), а новую строку. Здесь операция "*" применяется к строке: строка увеличивается в 5 раз, путем добавления одного и того же набора символов. Однако, операция "+" не разрешена для строкового и целого типа. В сообщении об ошибке указывается, что тип int (целое число) не приведен к типу str (строка). В стр. 13 эта ошибка исправлена с помощью функции str(), которая преобразует число в строку. В результате операция проходит без ошибок, т. к. операция "+" применима к строкам (конкатенация, т. е. присоединение строки).
В python используются три фундаментальных типа: int – целочисленный тип, float – вещественный (действительный) тип и str – строковый тип. Узнать какого типа данный объект можно с помощью функции type()

a = 25
b = 3.14
c = 'Вася'
print(type(a), type(b), type(c))
<class 'int'> <class 'float'> <class 'str'>

Целочисленный тип данных. int

В Python можно работать с целым числом произвольной точности. Например, легко получить 100!

>>> import math
>>> print(math.factorial(100))
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Примечание. Скорость работы с большими целыми числами будет существенно медленнее, чем с числами, которые соответствует машинному представлению (машинному слову). Размер машинного слова зависит от системы и соответствует типу int в С++. Если размер машинного слова равен 32 битам (4 байта), то диапазон беззнакового целого типа содержит значения от 0 до 4294967295.

Действительный тип данных. float

В python значения с плавающей точкой представлены тремя типами float, complex и библиотечным типом decimal.Decimal. Тип float, с которым мы будем работать, представляет действительные числа двойной точности, это означает, что точность таких чисел будет достигать 17 десятичных разрядов. Если нужно соблюдать точность при вычислениях, то необходимо применять целый тип, поскольку при вычислениях с типом float точность будет теряться. Причины этого заключаются в методе представления вещественных чисел в памяти компьютера и являются общим явлением для всех языков программирования. (Повторение §29). Библиотечный тип decimal.Decimal может обеспечить произвольную точность (по умолчанию, до 28 знаков в мантиссе).

Функции и операции. Функции модуля math

Для работы с целыми и вещественными типами определены следующие стандартные арифметические операции и функции:

Арифметические операции и стандартные функции
Операция Функция Описание
a + b add(a, b) Сложение
a / b truediv(a, b) Деление, результат float
a // b floordiv(a, b) Деление, результат int
a & b and_(a, b) Побитовое “И”
a ^ b xor(a, b) Побитовое “исключающее ИЛИ”
~ a invert(a) Побитовое “НЕ”
a | b or_(a, b) Побитовое “ИЛИ”
a ** b pow(a, b[, c]) a в степени b или (a ** b) % c
a << b lshift(a, b) Побитовый сдвиг влево
a % b mod(a, b) Остаток от деления a на b
a * b mul(a, b) Умножение
a @ b matmul(a, b) Умножение матриц
– a neg(a) Унарный минус
+ a pos(a) Унарный плюс
a >> b rshift(a, b) Побитовый сдвиг вправо
a – b sub(a, b) Вычитание
abs(a) Абсолютное значение (целый тип)
divmod(a, b) Возвращает частное и остаток как кортеж
round(x[, n]) Округление до ближайшего целого (int) или
с точностью до n знаков (float)

После импорта модуля math:

import math

станут доступными многочисленные функции математического модуля. Наиболее часто используемые функции приведены в таблице ниже. Обратите внимание, что некоторые функции можно представить и с помощью стандартных операций. Например, извлечения корня:

import math
print(2**0.5)
print(math.sqrt(2))
print(math.pow(2, 0.5))

Результат будет одинаков.

Функции модуля math
Функция Описание
math.sqrt(x) квадратный корень x
math.pow(a, b) возведение в степень, ab
math.hypot(a, b) гипотенуза
math.pi число π
math.e число e
math.exp(x) экспонента, ex
math.log(x), math.log10(x), math.log(x[, base]) логарифмические, ln, lg и logbase
math.sin(x), math.cos(x), math.tan(x) тригонометрические, x в радианах
math.asin(x), math.acos(x), math.atan(x) тригонометрические, возвращают радианы
math.degrees(x) радианы → градусы
math.radians(x) градусы → радианы
math.fabs(x) модуль вещественного x

Импорт модулей

Python позволяет поместить классы, функции или данные в отдельные файлы и использовать их в других программах. Такой файл называется модулем. Все имена внутри модуля называются атрибутами — такими, например, как функции и переменные. Помимо модулей, создаваемых разработчиками, Python распространяется с собственной библиотекой стандартных модулей. Эта библиотека включает в себя более 200 модулей, которые выполняют платформо-зависимую поддержку разнообразных задач. Полный список модулей можно посмотреть на странице документации Python: https://docs.python.org/3.5/py-modindex.html.
Для того, чтобы модуль стал доступен в программе необходимо в начале программы (или перед вызовом компоненты) обратиться к служебному слову import, например:

import math # Будет импортирован модуль с известными 
# математическими функциями
import turtle # Графический модуль "Черепашка"

Если модуль импортирован, то мы получаем доступ ко всем функциям, которые определены в этом модуле. Например:

>>> import math
>>> print(math.pi) # Вывести число pi
3.141592653589793
>>> 2 * math.sqrt(3) # вычислить 2 корня из 3
3.4641016151377544
import calendar
cal = calendar.month(2013, 9)
>>> print(cal)
   September 2013
Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Варианты импорта:
Взятие непосредственно имени функции без упоминания имени модуля:

>>> from math import sqrt, sin, exp
>>> sqrt(2)
1.4142135623730951

Ещё один вариант импорта — включение всех имен, определенных в модуле:

>>> from turtle import *
>>> reset()

Само по себе это не является хорошей идеей, так как возможен конфликт имен разных модулей. Для предотвращения конфликта имен можно использовать создание алиаса (подмена имени):

>>>import turtle as t
>>> t.reset()

Примечание. Для того, чтобы узнать список имён, определённых в модуле, воспользуйтесь встроенной функцией dir(). Она возвращает отсортированный список строк:

>>> dir(math)
['__doc__', '__file__', '__loader__', '__name__', '__package__', 'acos', 
'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 
'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 
'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 
'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 
'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 
'trunc']

Вопросы и задания

  1. В чем недостатки динамической типизации?
  2. Каким будет тип данных, с которыми связывается переменная a, после выполнения следующих инструкций:
  3. a = 'k' * 10
    a = 10 / 2
    a = 10 // 2
    a = 20 * 2.5
    a = 20 // 2.5
    

Учебник

§55 вопросы 6, 7, 8, 9

Print Friendly, PDF & Email

Добавить комментарий