- •§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. Подсчет букв
§7.9. Модуль string
Модуль string содержит полезные функции, заметно упрощающие работу со строками. Как обычно, необходимо сначала импортировать модуль до его использования:
>» import string
Модуль string включает функцию find(), которая делает то же самое, что и функция, написанная нами. Это распространенная ситуация в области программирования: прежде чем «изобретать велосипед», иногда стоит поискать готовые решения - всегда есть вероятность, что кто-то уже сталкивался с похожей задачей и решил ее лучше нас. К тому же разбираясь в чужом коде можно многому научиться.
Итак, для вызова функции из модуля, мы должны указать имя модуля и имя функции, используя точку в качестве разделителя:
>» fruit |
= "banana" |
|
>» index |
= string.find(fruit, |
"a") |
index |
|
|
1 |
|
|
Такой способ вызова помогает избежать конфликтов (и семантических ошибок, которые могут стать их следствием) между именами встроенных или написанных нами
16 Инкрементировать -увеличивать значение чего-либо на единицу; декрементировать -уменьшать значение на единицу.
81
Ревизия: 170
Строки
функций и именами функций, импортированных из модулей. Используя точку в качестве разделителя, мы можем указать какую версию f ind () хотим использовать.
В подтверждение мысли об «изобретении велосипеда», стоит заметить, что функция string .find () является более общим решением, чем наш вариант. Во-первых, может искать подстроки, не только символы:
>» string . find ( "banana", "na") 2
Также имеется возможность задать дополнительный аргумент, который будет определять индекс с которого надо начинать:
>» string . find ( "banana", "na", 3" 4
Или может потребоваться пара дополнительных аргументов, которые определяют диапазон индексов:
>» string. find("bob", "b", 1, 2 -1
В последнем примере, поиск оказался неудачным, потому что символ b не входит в диапазон индексов от 1 до 2 (не включая 2).
Упражнение. Выведите на экран справку по модулю string и ознакомьтесь со справочной информацией следующих функций: 1.
2. |
capwordsQ |
3. |
countQ |
4. |
find() |
5. |
lowerQ |
6. |
replace 0 |
7. |
splitQ |
8. |
upperQ |
КС |
периментируите с ними. |
§7.10. Классификация символов
Иногда возникает потребность проверить регистр символа или выяснить не является ли он цифрой. Модуль string предоставляет несколько специальных переменных, которые могут быть полезны для этих целей.
Строка string, lowercase содержит все строчные символы. Аналогично в переменной string.uppercase хранятся все заглавные буквы. Попробуйте следущие примеры и посмотрите,какой результат выдаст интерпретатор:
>» print string . lowercase
>» print string .uppercase
>» print string . digits
Мы можем использовать эти переменные и функцию find() для классифицирования символов. Например, если find (lowercase, ch) возвращает результат, отличный от -1, то символ ch должен быть строчным.
82
Ревизия: 170
Строки
def isLower(ch):
return string.find(string.lowercase, ch) != -1
Так же мы можем использовать оператор in, котрый определяет, входит ли символ в строку или нет:
def isLower(ch):
return ch in string.lowercase
Альтернативно мы можем использовать оператор сравнения:
def isLower(ch):
return 'a' <= ch <= 'z'
Если ch между а и z, то это строчной символ.
Упражнение. Какая версия isLower() будет самой быстрой? Какие еще причины, помимо скорости, Вы можете привести для предпочтения одного другому?
Другая определенная в модуле string переменная содержит все пробельные (непечатаемые) символы, включая пробел, табуляцию ("\t") и символы возврата каретки ("\г") и новой строки ("\п") :
>» print string .whitespace
Как мы заметили в §6.6, пробельные символы перемещают курсор без печати чего-либо: они создают пустое пространство между видимыми символами.
§7.11. Строки Unicode
83
Ревизия: 170
Списки
Глава 8. Списки
§8.1. Создание списков
§8.2. Доступ к элементам списка
§8.3. Длина списка
§8.4. Принадлежность списку
§8.5. Списки и цикл for
§8.6. Операции над списками
§8.7. Срезы списков
§8.8. Изменение списков
§8.9. Удаление элементов списка
§8.10. Объекты и значения
§8.11. Ссылки на объекты
§8.12. Копирование списков
§8.13. Списки-параметры
§8.14. Вложенные списки
§8.15. Матрицы
§8.16. Списки и строки
84
Ревизия: 170
Кортежи
Глава 9. Кортежи
85
Ревизия: 170
Словари
Глава 10. Словари
Строки, списки и кортежи используют в качестве индексов целые числа. Если же мы попытаемся использовать использовать в качестве индексов значения изменяемых типов данных, то интерпретатор выведет ошибку.
Словари схожи со списками за исключением того, что в них могут использоваться в качестве индекса значение любого неизменяемого типа (например, str, float, tuple).
§10.1. Создание словаря
Для примера мы создадим англо-испанский словарь, индексами в котором будут служить строковые значения.
Один из способов создать словарь - начать с пустого словаря и добавлять элементы. Пустой словарь обозначается фигурными скобками {}:
>» eng2sp = {} |
|
>» eng2sp [ ' one ' ] = |
'uno' |
>» eng2sp [ ' two ' ] = |
' dos ' |
Первый оператор присваивания создает словарь названный eng2sp; остальные операторы добавляют новые элементы в словарь. Мы можем распечатать текущее значение словаря обычным способом:
>» print eng2sp
{'one': 'uno', 'two': 'dos'}
Элементы словаря выводятся через запятую; каждый элемент содержит индекс и значение, разделенные двоеточием. В словаре индексы называют ключами, а элементы называют парами ключ-значение.
Другой способ создать словарь - предоставить список пар ключ-значение, используя тот же синтаксис что и в предыдущем выводе.
|»> eng2sp = {'one': 'uno', 'two': 'dos', 'three': 'tres'} Если мы снова распечатаем значение eng2sp, мы получим небольшой сюрприз:
>» print eng2sp
{'one': 'uno', 'three': 'tres', 'two': 'dos'}
Пары ключ-значение расположены в другом порядке! К счастью нет повода беспокоиться о расположении, так как элементы словаря никогда не индексируются целыми индексами. Вместо этого для поиска соответствующего значения мы используем ключ:
>» print eng2sp [ ' two ' ]
' dos '
Ключ ' two' выдал значение ' dos ' хотя оно появляется в третьей паре ключ-значение.
