Кратко о Python — 4

Кортежи. Множества. Словари. Что это и как их использовать. А также в чем разница между изменяемыми и неизменяемыми типами данных.
python-title

<< Кратко о Python — 3

Типы данных (продолжение)

Изменяемые и неизменяемые типы данных

Типы данных в 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

Кратко о Python — 5 >>

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