Тип данных позволяет указать компьютеру, какие действия можно выполнять с этими данными и как это делать.
Наиболее часто использьуемые типы данных приведены в таблице
Тип данных | Применение |
---|---|
int | Целые числа |
float | Действительные числа |
bool | Логические значения |
str | Строки |
list | Списки - упорядоченные последовательности значений (изменяемые) |
tuple | Кортежи - упорядоченные последовательности значений (неизменяемые) |
dict | Словари - коллекции объектов с доступом по ключу |
ndarray | Массивы numpy |
None | Пустое значение |
Тип объекта можно узнать с помощью функции type()
type(3)
type(3.)
type('ноль')
type(False)
Два наиболее часто используемых числовых типа данных - целые (int
) и действительные (float
) числа.
При необходимости, преобразование типов происходит автоматически. Если в выражении содержится хотя бы одно действительное число, то результат будет действительным числом.
2 * 2
2 * 2.
5 / 2 # 2.5 в Python 3, но 2 в Python 2
Логический тип данных представлен двумя константами - True
и False
Результат логического типа часто появляется в операциях сравнения:
5 > 2
2 * 2 == 5
2 * 2 != 5
'Колбаса' > 'Бутерброд'
print(ord('К'), ord('Б')) #Коды символов К и Б
Можно комбинировать несколько логических выражений с помощью логических операторов: and
, or
, not
5 > 2 and 'a' < 'b'
not 5 > 2
not 5 > 2 or 2 * 2 == 4
s = 'Сочи '
s2 = 'Море'
s + s2
y = 2014
s + y #ошибка!
s + str(y) #правильно: приведение типа к строковому типу
Сложные строки при выводе результатов расчета удобно получать с помощью оператора форматированного вывода %
r = 10
from math import pi
print('Площадь круга радиусом %s равна %s' % (r, pi * r**2)) #формат по умолчанию
print('Площадь круга радиусом %.1f равна %.2f' % (r, pi * r**2)) #заданный формат
Количество цифр после запятой можно также задавать с помощью волшебной команды %precision
, но это будет работать не везде.
Чтобы показать, что имя переменной не связано ни с каким объектом, в Python используется специальное значение: None
x = None
print(x)
type(x)
x is None #проверка на пустое значение
l = [1, 2., 'три', False]
Нумерация элементов в Python начинается от нуля.
Диапазон значений можно указать с помощью двоеточия: [a:b]
Обратите внимание, что правая граница (b
) не включается в диапазон!
Извлечение элементов:
print(l)
l[0] #нумерация элементов начинается с нуля
print(l)
l[-1] #последний элемент
print(l)
l[1:3] #элементы с индексами 1 и 2. NB: Элемент 3 не включается!
print(l)
l[2:] #все элементы, начиная с индекса 2 и до конца списка
print(l)
l + l #слияние списков
print(s)
l2 = list(s) #список из строки
print(l2)
Список - изменяемый тип данных (mutable)
print(l)
l[2] = 3
l
Кортеж (tuple) позволяет создать коллекцию объектов любого вида, однако, в отличие от списка, элементы этой коллекции нельзя менять после создания. Кортеж - неизменяемый тип (immutable)
t = (1, 2., 'три', False)
t[1:2]
t[2] = 3 #ошибка!
t + t #новый кортеж, составленный из двух копий t
Словарь (dict) позволяет создавать коллекцию объектов любого вида. Однако для выбора значений (values) из коллекции используются не индексы, а ключи (keys)
Ключом может быть любой неизменяемый объект. Значение может быть любым объектом.
mydict = {'звери': ['собака', 'крот', 'утконос'],
'птицы': ['дятел', 'дрофа']}
mydict['птицы'] #извлечение значения по ключу
mydict['деревья'] = ['дуб', 'баобаб']
mydict
mydict[0] #ошибка - элементы словаря не упорядочены, поэтому нельзя использовать числовые индексы
mydict['грибы'] #ошибка - такого ключа нет
Все типы данных в Python являются объектными. Объекты, помимо самих данных, содержат также и методы, позволяющие эти данные обрабатывать.
x = 5.0
print(x)
type(x)
print(dir(x))
Для доступа к членам класса - вызова методов, или просмотра/изменения атрибутов используется "запись с точкой":
объектная_переменная.метод()
объектная_переменная.имя_атрибута
x.imag # Мнимая часть числа
print(s)
type(s)
print(dir(s))
Если в блокноте сразу после ввода точки нажать клавишу Tab
, то выводится подсказка по методам и атрибутам объекта, на который ссылается переменная
# Попробуйте здесь получить подсказку по методам объекта-строки (переменная s)
s.upper()
s.upper().strip()
print(l)
type(l)
print(dir(l))
l.reverse() #список изменяется "на месте"
print(l)
Чтобы задать, какие атрибуты (данные) и методы (операции) будут у объекта, разработчики создают классы. Объектно-ориентированный подход упрощает разработку программ, потому что классы скрывают детали реализации от пользователя. Чтобы воспользоваться объектом, достаточно знать, какие методы он поддерживает и правила использования этих методов. Во многих случаях (например, при сравнениях, выполнении арифметических операций, при печати) нужные методы вызываются автоматически.
list?
В определение класса может быть включен специальный метод - __init__()
(конструктор). Конструктор автоматически выполняется при создании нового объекта на основе данного класса. Это позволяет сразу при создании получить объект с нужными свойствами. Данные для этого передаются через аргументы конструктора. При использовании инициализации объекта в программе, необходимо указывать эти аргументы в скобках после имени класса.
dict(color = 'red', linestyle = 'dashed', size = 0.5)
Массив (array) - тип данных, предназначенный для обработки табличных данных. Определение этого типа данных и функции для работы с массивами содержатся в пакете numpy
.
import numpy as np
arr1 = np.array([10, 20, 25, 32]) #массив из списка
print(arr1)
type(arr1)
arr1.shape #форма массива
arr1.ndim #число измерений
#двухмерный массив из списка:
arr2 = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr2)
arr2.shape
arr2.ndim
I = np.identity(5) #единичная матрица
print(I)
I.shape
I.ndim
A = np.zeros((3, 4))
print(A)
x = np.arange(-10, 11, 2)
x
y = np.linspace(-10, 10, 11)
y
print(x.dtype, y.dtype)
print(x.nbytes, y.nbytes)
A[1, 1] = 5 #изменение элемента
print(A)
A[1:, 2:] = 10
print(A)
print(A[1]) #извлечение строки
print(A[:, 1]) #извлечение столбца
print(A * 2) #полэлементное умножение
print(A * A)
print(np.sqrt(A * A)) #применение функции к каждому элементу массива
print(A.T) #транспонирование
B = A #переменная B ссылается на тот же массив, что и переменная A
B[0, 0] = 33
print(B)
print(A) #массив изменился, поэтому ссылка A также показывает измененный вариант
C = A.copy() #создается копия массива
C[0, 0] = 55
print(C)
print(A) #оригинал не изменился