ЛЕКЦИЯ 2
.pdf5.2.Методы, специфичные для типа
Списки в языке Python являются аналогом массивов в других языках программирования, но они обладают более широкими возможностями.
Списки не ограничены одним типом элементов. Также не ограничен их размер, благодаря чему они могут увеличиваться и уменьшаться по мере необходимости в результате выполнения операций, характерных для списков:
●L = [123, ‘spam’, 1.23]
●L.append(‘NI’) # Увеличение: в конец списка добавляется новый объект
●L.pop(2) # Уменьшение: удаляется элемент из середины списка
●M = [‘bb’, ‘aa’, ‘cc’]
●M.sort() # Упорядочивает элементы списка по возрастанию
●M.reverse() # Упорядочивает элементы списка по убыванию
5.3.Проверка выхода за границы
Хотя списки не имеют фиксированного размера, язык Python, тем не менее, не допускает возможности обращаться к несуществующим элементам списка:
>>>L=[123, ‘spam’, ‘NI’]
>>> L[99]
... IndexError: list index out of range
>>> L[99] = 1
... IndexError: list assignment index out of range
Списки не ограничены одним типом элементов. Также не ограничен их размер, благодаря чему они могут увеличиваться и уменьшаться по мере необходимости в результате выполнения операций, характерных для списков:
●L = [123, ‘spam’, 1.23]
●L.append(‘NI’) # Увеличение: в конец списка добавляется новый объект
●L.pop(2) # Уменьшение: удаляется элемент из середины списка
●M = [‘bb’, ‘aa’, ‘cc’]
●M.sort() # Упорядочивает элементы списка по возрастанию
●M.reverse() # Упорядочивает элементы списка по убыванию
5.4.Вложенные списки
Одна из замечательных особенностей базовых типов языка Python состоит в том, что они поддерживают возможность создания вложенных конструкций произвольной глубины и в любых комбинациях (например, можно создать список, содержащий словарь, который содержит другой список, и так далее). Одно из очевидных применений этой особенности – представление матриц, или «многомерных массивов» в языке Python. Делается это с помощью списка, содержащего вложенные списки:
>>>M = [[1, 2, 3], # Матрица 3 x 3 в виде вложенных списков [4, 5, 6], # Выражение в квадратных скобках может [7, 8, 9]] # занимать несколько строк
>>>M
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] Обращаться к такой структуре можно разными способами:
>>>M[1] # Получить строку 2 [4, 5, 6]
>>>M[1][2] # Получить строку 2, а затем элемент 3 в этой строке
6
5.5.Генераторы списков
Генераторы списков предназначены для удобной обработки списков, к которой можно отнести и создание новых списков, и модификацию существующих.
res = [x for x in range(1,25,2)] print(res)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23]
______________________________________________
res = [x for x in range(1,25,2)] print(res)
[1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529]
______________________________________________
M = [[1, 2, 3], # Матрица 3 x 3 в виде вложенных списков [4, 5, 6], # Выражение в квадратных скобках может
[7, 8, 9]] print(M)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] col2 = [row[1] for row in M] print(col2)
[2, 5, 8]
6.Словари
Словари в языке Python являются отображениями. Отображения – это коллекции объектов, но доступ к ним осуществляется не по определенным смещениям от начала коллекции, а по ключам. В действительности отображения вообще не подразумевают какого-либо упорядочения элементов по их позиции, они просто отображают ключи на связанные с ними значения. Словари – единственный тип отображения в наборе базовых объектов Python – также относятся к классу изменяемых объектов: они могут изменяться непосредственно и в случае необходимости могут увеличиваться и уменьшаться в размерах подобно спискам.
6.1.Операции над отображениями
>>> D = {‘food’: ‘Spam’, ‘quantity’: 4, ‘color’: ‘pink’} |
|
|
>>> D[‘food’] # Получить значение, связанное с ключом ‘food’ |
>>> D = {} |
|
‘Spam’ |
||
>>> D[‘name’] = ‘Bob’ # В результате присваивания создается ключ |
||
>>> D[‘quantity’] += 1 # Прибавить 1 к значению ключа |
||
>>> D[‘job’] = ‘dev’ |
||
‘quantity’ |
||
>>> D[‘age’] = 40 |
||
>>> D |
||
>>> D{‘age’: 40, ‘job’: ‘dev’, ‘name’: ‘Bob’} |
||
{‘food’: ‘Spam’, ‘color’: ‘pink’, ‘quantity’: 5} |
||
>>> print(D[‘name’]) |
||
|
||
|
Bob |
6.2.Вложенный словарь
>>>rec = {‘name’: {‘first’: ‘Bob’, ‘last’: ‘Smith’}, ‘job’: [‘dev’, ‘mgr’], ‘age’: 40.5}
>>>rec[‘name’] # ‘Name’ – это вложенный словарь
{‘last’: ‘Smith’, ‘first’: ‘Bob’}
>>> rec[‘name’][‘last’] # Обращение к элементу вложенного словаря ‘Smith’
>>>rec[‘job’] # ‘Job’ – это вложенный список [‘dev’, ‘mgr’]
>>>rec[‘job’][-1] # Обращение к элементу вложенного списка ‘mgr’
>>>rec[‘job’].append(‘janitor’) # Расширение списка должностей Боба (Bob)
>>>rec{‘age’: 40.5, ‘job’: [‘dev’, ‘mgr’, ‘janitor’], ‘name’: {‘last’: ‘Smith’, ‘first’: ‘Bob’}}
Возможность вложения позволяет легко воспроизводить достаточно сложные структуры данных. Для создания подобной структуры на языке C потребовалось бы приложить больше усилий и написать больше программного кода: нам пришлось бы описать и объявить структуры и массивы, заполнить их значениями, связать их между собой и так далее. В языке Python все это делается автоматически – запуск выражения приводит к созданию всей структуры вложенных объектов.
7.Кортежи
Объект-кортеж (tuple) в общих чертах напоминает список, который невозможно изменить – кортежи являются последовательностями, как списки, но они являются неизменяемыми, как строки. Синтаксически литерал кортежа заключается в круглые, а не в квадратные скобки. Они также поддерживают включение объектов различных типов, вложение и операции, типичные для последовательностей.
>>>T = (1, 2, 3, 4) # Кортеж из 4 элементов
>>>len(T) # Длина
4
>> T + (5, 6) # Конкатенация (1, 2, 3, 4, 5, 6)
>>>T[0] # Извлечение элемента, среза и так далее
1
>>>T[0] = 2 # Кортежи являются неизменяемыми
...TypeError: ‘tuple’ object does not support item assignment
>>>T.index(4) # Определение индексӑ: значение 4 находится в позиции 3
3
>>>T.count(4) # Значение 4 присутствует в единственном экземпляре 1
8.Файлы
Объекты-файлы – это основной интерфейс между программным кодом на языке Python и внешними файлами на компьютере. Файлы являются одним из базовых типов, но они представляют собой нечто необычное, поскольку для файлов отсутствует возможность создания объектов в виде литералов. Вместо этого, чтобы создать объект файла, необходимо вызвать встроенную функцию open, передав ей имя внешнего файла и строку режима доступа к файлу.
>>>f = open(‘data.txt’, ‘w’) # Создается новый файл для вывода
>>>f.write(‘Hello\n’) # Запись строки байтов в файл
6
>>>f.write(‘world\n’) # В Python 3.0 возвращает количество записанных байтов
6
>>>f.close() # Закрывает файл и выталкивает выходные буферы на диск
>>>f = open('data.txt') # ‘r’ – это режим доступа к файлу по умолчанию
>>>text = f.read() # Файл читается целиком в строку
>>>text
Hello world
>>> text.split() # Содержимое файла всегда является строкой [‘Hello’, ‘world’]
9.Другие базовые типы
Множества – это неупорядоченные коллекции уникальных и неизменяемых объектов.
>>>X = set(‘spam’) # Можно создавать из последовательностей
>>>Y = {‘h’, ‘a’, ‘m’} # Можно определять литералы множеств
>>>X, Y({‘a’, ‘p’, ‘s’, ‘m’}, {‘a’, ‘h’, ‘m’})
>>>X & Y # Пересечение
{‘a’, ‘m’}
>>>X | Y# Объединение {‘a’, ‘p’, ‘s’, ‘h’, ‘m’}
>>>X – Y # Разность
{‘p’, ‘s’}
>>> {x ** 2 for x in [1, 2, 3, 4]} # Генератор множеств в 3.0 {16, 1, 4, 9}
Для решения проблем, связанных с точностью представления простых вещественных чисел введены
вещественные числа с фиксированной точностью и рациональные числа (числа, представленные дробью, то есть парой целых чисел – числителем и знаменателем).
print(1.1/3)
0.66666666666667
from decimal import Decimal from decimal import getcontext getcontext().prec = 2 print(Decimal('1.10') / 3)
0.67
print(7/71) print(7/71*71 == 7) False
from fractions import Fraction print(Fraction(7, 71) * 71 == 7) True