Типы данных (продолжение)
Изменяемые и неизменяемые типы данных
Типы данных в Python делятся на изменяемые (mutable) и неизменяемые (immutable). Тут важно сразу понять, что неизменяемый тип — это не аналог константы в других языках программирования. В переменной неизменяемого типа нельзя изменить значение отдельного элемента, а вот присвоить новое значение всей переменной вполне можно. Например, к неизменяемым в Python относятся (сюрприз!) строки. То есть просто так поменять в строке одну букву не получится. Попытка запустить такую программу
a = 'кот'
a[1] = 'и'
print(a)
приведет к ошибке TypeError.
Но можно «собрать» новую строку:
a = 'кот'
a = a[0] + 'и' + a[2]
print(a)
(или воспользоваться методом replace, который, тем не менее, также не меняет символ внутри исходной строки, а возвращает новую)
a = 'кот'
a = a.replace('о','и')
print(a)
Список, в отличие от строки, — изменяемый тип. Поэтому такая программа будет совершенно правильной:
a = ['к', 'о', 'т']
a[1] = 'и'
print(a)
Кортежи в Python
Кортеж (tuple) — тип данных, очень похожий на список, но этот тип — неизменяемый. Запись же его отличается тем, что используются не квадратные, а круглые скобки.
Вот пример кортежа:
exam_register_numbers = ('15001147' , '15001148' )
Получить значение элемента кортежа можно точно так же, как и элемента списка — по его индексу. Например,
print( exam_register-number[0] )
На экран при этом будет выведено число ‘15001147’.
Но вот если попытаться поменять значение отдельного элемента кортежа, мы получим ошибку TypeError — тип-то неизменяемый.
Как и списки, кортежи могут быть вложенными.
Зачем может понадобиться использовать кортеж, если есть более универсальный тип список? Дело в том, что с кортежами Python работает быстрее.
Множества в Python
Множество (set) — это неупорядоченный набор элементов. Каждый его элемент должен быть уникальным и относиться к неизменяемому типу. А вот сам тип множество, тем не менее, — изменяемый. Мы можем добавлять к нему элементы и удалять их отуда.
Синтаксически множество похоже на список и кортеж, но его элементы записываются через запятую в фигурных скобках. Можно также создать множество, используя встроенную функцию set.
Например:
groceries = { 'яблоко', 'молоко', 'курица'}
Так же как в списке и кортеже, во множестве может содержаться любое число элементов, в том числе, нулевое. И точно так же элементы множества могут быть разных (неизменяемых!) типов. Однако мы не сможем добраться до этих элементов, используя индекс или срез.
Внимание! Создать пустое множество с помощью литерала {} нельзя. При его использовании создается пустой словарь.
Мы можем добавить к множеству отдельный элемент с помощью метода add(). Если нужно включить все элементы другого множества, потребуется метод update(). Для удаления элемента служат discard() и remove(). Разница между этими методами в том, что для discard() не важно, был ли такой элемент в исходном множестве, а remove() при отсутствии элемента вызовет исключение KeyError.
Если нужно удалить все элементы множества, используем метод clear().
s = set()
print(s)
s.add('$')
print(s)
s1 = {'€', '£', '¥'}
s.update(s1)
print(s)
s.discard('¥')
print(s)
s.clear()
print(s)
В результате будет выведено
set() {'$'} {'¥', '£', '€', '$'} {'£', '€', '$'} set()
Благодаря тому, что множество — набор уникальных элементов, его можно использовать, чтобы убрать из списка дублирующиеся элементы. Например, у нас есть список:
l = ['€', '£', '¥', '£', '¥', '¥']
Преобразуем его в множество – там будут только уникальные элементы:
s = set(l)
print(s)
{'£', '¥', '€'}
Теперь выполняем обратное преобразование.
l = list(s)
print(l)
Voi là, готов список, из которого исключены все дубли.
['£', '¥', '€']
Есть в Python и методы, реализующие математические операции над множествами (union(), intersection(), difference() и symmetric_difference)… Хотя их мы можем записать и как операции:
A = {2, 3}
B = {1, 2}
print(A | B) # объединение множеств
print(A & B) # пересечение множеств
print(A - B) # множество элементов A, не содержащихся в B
print(A ^ B) # множество элементов, содержащихся только
# в каком-либо одном исходном множестве
Результат работы этого фрагмента :
{1, 2, 3} {2} {3} {1, 3}
Словари в Python
Словарь (dict) — это такая структура данных, которая хранит пары «ключ – значение». Представьте, что вы открыли англо-русский словарь. Вы находите слово «book» и напротив него видите перевод — «книга». В данном случае «book» является ключом, а «книга» — значением. Примерно также и Python поступает со своими словарями.
Синтаксис словаря:
{ ключ1: значение1, ключ2 : значение2,.... }
Например, создадим записную книжку с телефонами, описав вот такой словарь:
phone_book = {
'Вася' : '+79998887766',
'Петя' : '+79997776655',
'Маша' : '+79996665544'
}
Теперь можно увидеть любой из записанных в него телефонов, написав примерно так:
print(phone_book['Маша'])
В данном случае напечатано будет «+79996665544
».
В качестве значения можно указать не только строку, а, к примеру, список. Например,
phone_book = {
'Вася' : ['+79998887766', 'Зеленая ул., 1'],
'Петя' : ['+79997776655', 'Рябиновый пер., 2'],
'Маша' : ['+79996665544', 'Светлый просп., 3']
}
Если нам нужно будет получить не весь список, а только один из его элементов, потребуется указать дополнительно его индекс.
Например, оператор
print(phone_book['Маша'][1])
выведет на экран «Светлый просп., 3
»
Изменение словаря
Что делать, если мы захотим записать в нашу книжку еще одного знакомого? Очень просто. Достаточно присвоить значение элементу словаря с ранее не существовавшим ключом. Например:
phone_book['Боря'] = ['+7999111223', 'Зеленая ул., 5']
А если нужно изменить значение? Просто присвоим новое значение. Пусть, например, изменился телефон у Маши:
phone_book['Маша'][0] = '+79995554433'
Заметьте: в этом примере меняется не все значение (список), а только нулевой элемент этого списка.
Для удаления ключа из словаря служит метод (причем этот метод возвращает значение удаляемого ключа)
словарь.pop( ключ, по_умолчанию)
Например,
phone_book.pop('Петя')
просто удалит из словаря ключ ‘Петя’ и его значение. А команда
print(phone_book.pop('Петя'))
еще и выведет значение на экран.
Если ключа в словаре нет, будет сгенерировано исключение. Чтобы избежать такой ситуации, нужно указать второй параметр («по_умолчанию»). Например,
phone_book.pop('Боря', 'ключ отсутствует')
Перебор элементов словаря
Перебрать все пары ключ-значение, содержащиеся в словаре, можно используя цикл for и метод словарь.items()
. Выглядеть это будет примерно так:
for k, v in phone_book.items():
print(k, ":", v[0])
При выполнении этого фрагмента мы увидим на экране
Вася : +79998887766
Петя : +79997776655
Маша : +79995554433
Assert. Проверка утверждений при отладке
В языке Python есть специальная инструкция, помогающая отладке программ — assert («утверждение»). Если указаное в инструкции выражение истинно, программа продолжает выполнение, как ни в чем не бывало. Если же оно ложно, генерируется исключение AssertionError. Например, запустим следующую программу:
print(1)
assert 2 + 2 == 4
print(2)
assert 1 + 1 == 3
print(3)
В результате получим:
1 2 AssertionError
На практике assert часто используют либо для проверки корректности исходных данных написанной функции, либо — ее результата. Например,
def divide(x, y):
assert y != 0
return round(x/y, 3)
Если хочется не просто получить исключение, но еще и сообщение о его причине, можем использовать в конструкции assert второй параметр:
def divide(x, y):
assert y != 0 , 'Нельзя делить на 0'
return round(x/y, 3)
Тогда при запуске с некорректными параметрами:
print (divide(5, 0))
получим вот такое сообщение:
AssertionError: Нельзя делить на 0