- •§0.1. Базовые знания
- •§0.2. Где достать интерпретатор языка Питон?
- •§0.3. Установка интерпретатора языка Питон в unix
- •§0.3.1. Установка/обновление Питона из грт-пакета
- •§0.3.2. Установка Питона из исходного кода
- •§0.4. Установка Питона в ос Windows
- •§0.5. Запуск программ, написанных на Питоне
- •§0.6. Среда разработки
- •§1.1. Алгоритмы и программы
- •§1.2. Языки программирования и уровни абстракции
- •Глава 1. Базовые понятия
- •§1.3. Формальные и естественные языки
- •§1.4. Интерпретаторы и компиляторы
- •§1.5. Первая программа
- •§1.6. Что такое отладка?
- •§1.6.1. Синтаксические ошибки (syntax errors)
- •§1.6.2. Ошибки выполнения (runtime errors)
- •§1.6.3. Семантические ошибки (semantic errors)
- •§1.6.4. Процесс отладки
- •Глава 2. Переменные, операции и выражения
- •§2.1. Значения и типы
- •§2.2. Преобразование типов
- •§2.3. Переменные
- •§2.4. Имена переменных и ключевые слова
- •§2.5. Выражения
- •§2.6. Выполнение выражений
- •§2.7. Операторы и операнды
- •§2.8. Порядок операций
- •§2.9. Простейшие операции над строками
- •§2.10. Композиция
- •Глава 3. Функции §3.1. Подпрограммы
- •§3.2. Вызовы функций
- •§3.3. Справочная система
- •§3.4. Импорт модулей и математические функции
- •§3.5. Композиция
- •§3.6. Создание функций
- •§3.7. Параметры и аргументы
- •§3.8. Локальные переменные
- •§3.9. Поток выполнения
- •§3.10. Стековые диаграммы
- •§3.11. Функции, возвращающие результат
- •Глава 4. Компьютерная графика
- •Глава 5. Логические выражения, условия и рекурсия §5.1. Комментарии в программах
- •§5.2. Простые логические выражения и логический тип данных
- •§5.3. Логические операторы
- •§5.4. Выполнение по условию и «пустота»
- •§5.5. Ввод данных с клавиатуры
- •§5.6. Альтернативные ветки программы (Chained conditionals)
- •§5.7. Пустые блоки
- •§5.8. Вложенные условные операторы (Nested conditionals)
- •§5.9. Рекурсия
- •§5.10. Стековые диаграммы рекурсивных вызовов
- •§5.11. Максимальная глубина рекурсии
- •§5.12. Числа Фибоначчи
- •Глава 6. Циклы
- •§6.1. Оператор цикла while
- •§6.2. Счетчики
- •§6.3. Бесконечные циклы
- •§6.4. Альтернативная ветка цикла while
- •§6.5. Табулирование функций
- •§6.6. Специальные и экранируемые символы
- •§6.7. Числа Фибоначчи и оператор цикла while
- •§6.8. Вложенные операторы цикла и двумерные таблицы
- •§6.9. Классификация операторов цикла
- •§6.10. Управляющие структуры
- •Глава 7. Строки
- •§7.1. Оператор индексирования
- •§7.2. Длина строки и отрицательные индексы
- •§7.3. Перебор и цикл for
- •§7.4. Срезы строк
- •§7.5. Сравнение строк
- •§7.6. Строки нельзя изменить
- •§7.7. Функция find
- •§7.8. Циклы и счётчики
- •§7.9. Модуль string
- •§7.10. Классификация символов
- •§10.2. Операции над словарями
- •§10.3. Методы словарей
- •§10.4. Использование псевдонимов и копирование
- •§10.5. Разряженные матрицы
- •§10.6. Подсказки
- •§10.7. Тип «длинное целое число»
- •§10.8. Подсчет букв
§10.4. Использование псевдонимов и копирование
Так как словари могут быть изменены, необходимо знать о псевдонимах. Всякий раз, когда две переменные ссылаются на один и тот же объект, изменения одной воздействуют на другую.
[TODO: стековая диаграмма]
Если вы хотите изменить словарь и сохраняете копию оригинала, используйте метод сору (). Например, opposites - словарь, который содержит пары антонимов:
>» |
opposites = {'up': 'down', |
'right': |
'wrong', |
'true': |
'false |
} |
>» |
alias = opposites |
|
|
|
|
|
>» |
copy = opposites.copy() |
|
|
|
|
|
Переменные alias и opposites ссылаются на один и тот же объект; переменная сору () ссылается на только что созданную копию того же словаря. Если мы изменим псевдонимы, opposites так же изменится.
>» alias [ 'right' ] = 'left'
>» opposites ['right' ]
'left'
Если мы изменим copy, то словарь, opposites останется прежним.
>» |
сору[' |
right |
'] = |
privi |
lege' |
>» |
opposn |
.tes [ ' |
right |
] |
|
Че |
ft' |
|
|
|
|
§10.5. Разряженные матрицы
В разделе 8.14 для представления матрицы мы использовали список списков. Это хороший выбор для матрицы содержащей в основном не нулевые значения, но рассмотрим разряженную матрицу подобную этой:
88
Ревизия: 170
Словари
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
3 |
0 |
Представление в виде списка содержит множество нулей:
>» matrixl = |
= [ [0,0,0,1,0], |
|
[0,0,0,0,0], |
|
[0,2,0,0,0], |
|
[0,0,0,0,0], |
|
[0,0,0,3,0] ] |
Но есть и другой способ хранения матриц - мы можем использовать словарь: ключами будут кортежи, хранящие номер строки и номер столбца. Вот представление той же матрицы в виде словаря:
>» matrix2 = { (0,3) : 1, (2, 1) : 2, (4, 3) : 3}
Нам необходимо только три пары ключ-значение, одной для каждого ненулевого элемента матрицы. Каждый ключ - кортеж и каждое значение целое число.
Для доступа к элементу матрицы мы могли использовать оператор индексирования:
>» |
matrixl[0][3] |
|
1 |
|
|
>» |
matrix2[0, |
3] |
1 |
|
|
Обратите внимание синтаксис для представления в виде словаря не такой как для представления в виде вложенных списков. Вместо двух целочисленных индексов мы используем один индекс - кортеж целых чисел.
Но в таком подходе есть одна сложность. Если мы укажем на нулевой элемент, мы получим ошибку, так как в словаре нет элемента с таким ключом:
>» matrix2 [1,3] KeyError: (l, 3)
Данную проблему решает метод get () :
>» matrix, get ( (0, 3) , 0)
1
Первый аргумент- ключ, второй аргумент- значение, которое get() должен возвратить, если такого ключа в словаре нет:
>» matrix, get ( (1, 3) , 0)
0
get definitely improves the semantics of accessing a sparse matrix. Shame about the syntax. Метод get определенно улучшает семантику доступа к разряженной матрице.
89
Ревизия: 170
Словари
