Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование на языке Python. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •I. ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ
- •1. Начало работы
- •2. Основные понятия
- •Ввод и вывод данных
- •Логические операторы
- •Условные инструкции
- •Инструкции
- •Типы данных
- •Константы и переменные
- •Арифметические операторы
- •Операторы сравнения
- •3. Функции
- •Определение функций
- •Встроенные функции
- •Многократное использование функций
- •Типы параметров функции
- •Область видимости
- •Обработка исключений
- •Строки документации
- •4. Контейнеры
- •Методы
- •Списки
- •Кортежи
- •Словари
- •Контейнеры внутри контейнеров
- •5. Операции со строками
- •6. Циклы
- •Цикл for
- •Цикл while
- •Операторы break и continue
- •Функция Enumerate
- •Вложенные циклы
- •Настройка функции print()
- •7. Модули
- •8. Файлы
- •Запись в файлы
- •Использование конструкции with
- •Чтение из файлов
- •CSV-файлы
- •II. ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП)
- •9. Парадигмы программирования
- •Состояние
- •Процедурное программирование
- •Функциональное программирование
- •Объектно-ориентированное программирование
- •10. Базовые понятия ООП
- •Наследование
- •Полиморфизм
- •Абстракция
- •Инкапсуляция
- •Композиция
- •11. Дополнительные понятия ООП
- •Как работают переменные
- •Ключевое слово is
- •Константа None
- •Классы – это объекты
- •Переменные класса и переменные экземпляра класса
- •Приватные переменные
- •Методы переопределения
- •Функция super
- •Переопределение встроенных методов
- •12. Создание игр
- •Карты
- •Колода
- •Игрок
- •Игра
- •Игра «War»
- •13. Bash
- •Запуск Bash
- •Использование Bash
- •Относительные и абсолютные пути
- •Навигация
- •Флаги
- •Редактор vim
- •Команда touch
- •Просмотр файлов командой less
- •Пользователи
- •Разрешения
- •Программы Bash
- •Скрытые файлы
- •Переменные окружения
- •Переменная окружения $PATH
- •Вертикальная черта (пайп)
- •Команда cat
- •Последние команды
- •Быстрые перемещения
- •Экранирование (escaping)
- •Регулярные выражения в Python
- •15. Менеджеры пакетов
- •Вкладка «Завершение»
- •Функция wildcard (подстановочный знак)
- •Другие инструменты
- •14. Регулярные выражения
- •Настройка
- •Простое совпадение
- •Игнорирование регистра
- •Вывод только конкретных совпадений слов
- •Совпадение в начале и в конце
- •Поиск совпадений с несколькими символами
- •Повторение
- •Диапазон
- •16. Управление версиями
- •Репозитории
- •Помещение и извлечение данных
- •Пример помещения данных
- •Пример извлечения данных
- •Откат версий
- •Команда git diff
- •Другой запрос на включение
- •IV. ВВЕДЕНИЕ В ИНФОРМАТИКУ
- •17. Структуры данных и алгоритмы
- •Что такое алгоритмы и структуры данных?
- •Нотация Big-O
- •Оператор деления по модулю
- •Сортировка методом пузырька
- •Поисковый алгоритм
- •Рекурсия
- •Абстрактные типы данных
- •Узлы
- •Стеки
- •Связанные списки
- •Массивы
- •Бинарные деревья
- •Поиск в ширину и в глубину
- •Хэш-таблицы
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

locations = []
tula = (54.1960, 37.6182)
moscow = (55.7522, 37.6155)
locations.append(tula)
locations.append(moscow)
print(locations)
>> [(54.196, 37.6182), (55.7522, 37.6155)]
eights = ["Эдгар Алан По",
"Чарльз Диккенс"]
nines = ["Хемингуэй",
"Фицджеральд",
"Оруэлл"]
authors = (eights, nines)
print(authors)
>> (['Эдгар Алан По', 'Чарльз Диккенс'], ['Хемингуэй',
'Фицджеральд', 'Оруэлл'])
bday = {"Хемингуэй":
"21.07.1899",
"Фицджеральд":
"24.09.1896"}
my_list = [bday]
print(my_list)
my_tuple = (bday,)
print(my_tuple)
>>
[{'Хемингуэй':'21.07.1899','Фицджеральд':'24.09.1896'}]
>>
({'Хемингуэй':'21.07.1899','Фицджеральд':'24.09.1896'},)
Список, кортеж или словарь могут быть значениями в словаре.
ru = {"расположение":
(55.7522, 37.6155),
"знаменитости":
["Андрей Звягинцев", "Юрий Быков",
41

"Петр Буслов"],
"факты":
{"город":
"Москва",
"страна":
"Россия"}
}
Словарь ru включает три ключа: «расположение», «знаменитости»,
«факты». Первый ключ – кортеж, т.к. географические координаты неизменны.
Второй ключ – список знаменитостей Москвы, это список, т.к. данные могут
измениться. Третий ключ – словарь, т.к. пары ключ-значение – лучший способ
представить факты о Москве.
5. Операции со строками
Для лучшей читаемости кода желательно длинную строку разбить на несколько строк. В этом случае ее нужно поместить в тройные кавычки. Заметим, что использование одинарных или двойных кавычек в данном случае является синтаксической ошибкой.
""" line one
line two
line three
"""
Строки итерируемы. Добраться до любого символа строки можно с помощью
взятия индекса. Отметим, что отсчет символов строки начинается с 0, а не с 1.
my_string = "IBM"
my_string[0]
my_string[1]
my_string[2]
>> 'I'
>> 'B'
>> 'M'
42

Для доступа к каждому символу используют индексы 0, 1, 2. При исполь-
зовании индекса, выходящего за эти пределы, система сгенерирует исключение:
my_string = "IBM"
my_string[3]
>> IndexError: string index out of range
Заметим, что в Python существует возможность использовать отрицатель-
ные индексы. Если в вышеприведенном примере использовать конструкцию
my_string[-1], получим доступ к последнему элементу 'M', при использовании индекса «-2» – к предпоследнему 'B' и т.д.
Строки подобно кортежам неизменяемы, т.е. если нужно изменить симво-
лы в строке, то необходимо создать новую строку.
Можно передать параметры методу, который выполняет код и возвращает результат точно так же, как функция. В отличие от функции, метод вызывается для объекта. Например, если есть строка “Hello”, можно вызвать
“Hello”.[имя_метода]() в этой строке. Помимо вызова объекта можно думать
о методе, как и о функции (на данный момент).
Одним из методов управления строками является изменение регистра.
Можно изменить строку так, чтобы каждая буква была прописной, вызвав для
нее метод upper:
"Per aspera ad astra".upper()
>> 'PER ASPERA AD ASTRA'
Точно так же можно изменить каждую прописную букву в строке на
строчную, использовав метод lower:
"ВСЕ ПРОЙДЕТ И ЭТО ТОЖЕ ПРОЙДЕТ".lower()
>> 'все пройдет и это тоже пройдет'
Если возникает необходимость создать строку с использованием переменных, то это делается с помощью метода format:
year_creation = "1989"
"Python was created in {}.".format(year_creation)
>> 'Python was created in 1989.'
43

Функция format ищет любые вхождения в строке фигурных скобок {}
и заменяет их значениями, которые передаются ей.
Вы не ограничены использованием {} один раз и можете поместить столь-
ко из них в свою строку, сколько захотите:
year_creation = "1989"
creator = "Guido van Rossum"
country = "the Netherlands"
my_string = "Python was created in {} by {} in
{}.".format(year_creation, creator, country)
print(my_string)
>> 'Python was created in 1989 by Guido van Rossum in the
Netherlands.'
У строк есть метод, называемый split, используемый для разделения од-
ной строки на две строки. Можно передать методу split символ или символы,
которые хотите использовать для разделения строки, например, можно передать точку, чтобы разделить строку на две разные строки:
""" Practice doesn’t make perfect. Practice makes mye-
lin, and myelin makes perfect.""".split(".")
>> ["Practice doesn’t make perfect", 'Practice makes
myelin, and myelin makes perfect',"]
Результатом является список с двумя разными строками, разделенными
точкой в исходной строке.
Метод join позволяет добавлять новые символы между каждым симво-
лом в строке:
my_string = 'abc'
join_result = '+'.join(my_string)
join_result
>> 'a+b+c'
44

Можно превратить список строк в одну строку, вызвав метод join для пу-
стой строки ("") и передав список:
the_Fox = ["The",
"fox",
"jumped",
"over",
"the",
"fence", "."]
one_string = "".join(the_Fox)
one_string
>> The fox jumped over the fence.
Если метод join содержит только пробел, то есть " ".join, можно со-
здать новую строку, в которой каждое слово будет отделено пробелом.
Метод replace позволяет заменять каждое вхождение символа(ов) дру-
гим символом (символами). Первый параметр – это символ(ы) для замены,
а второй параметр – это символ(ы) для его замены.
my_string = "The cat jumped over the hat."
my_string = my_string.replace("a", "@")
my_string
>> "The c@t jumped over the h@t."
Можно получить индекс первого вхождения символа в строку с помощью
метода index. Для этого необходимо передать искомый символ и получить
индекс первого вхождения символа в строку:
'cat'.index('a')
>> 1
При отсутствии соответствия Python сгенерирует исключение.
"animals".index("y")
>> ValueError: substring not found
45

Во избежание такой ситуации желательно обработать исключение.
try:
"animals".index("y")
except:
print("Not detected.")
>> Not detected.
Чтобы проверить, находится ли одна строка в другой, используется ключе-
вое слово in. В случае нахождения возвращается значение True, в противном
случае – False:
"Puss" in "Puss in Boots."
>> True
"Mouse" in "Puss in Boots."
>> False
Добавление ключевого слова not перед in позволяет проверить отсут-
ствие одной строки в другой:
"Potter" not in "Harry"
>> True
Управляющие символы. Использование кавычек внутри строки является
синтаксической ошибкой:
"She said "Definitely.""
>> SyntaxError: invalid syntax
Решить эту проблему можно с помощью экранирования, что означает
помещение специального символа перед символом, который имеет особое значение в Python (в данном случае специальный символ – это кавычка), чтобы сообщить Python, что этот конкретный символ является обычным символом. Специальный символ для экранирования – обратный слеш.
"She said \"Definitely.\""
>> 'She said "Definitely."'
'She said \"Definitely.\"'
>> 'She said "Definitely."'
46

Управляющие символы не требуются в следующих случаях: 1) перед оди-
нарными кавычками в строке с двойными кавычками и 2) перед двойными кавычками внутри одинарных.
"She said 'Definitely.'"
>> "She said 'Definitely.'"
'She said "Definitely."'
>> 'She said "Definitely."'
Можно использовать "\n" внутри строки для переноса строки:
print("line1\nline2")
>> 'line1'
>> 'line2'
Можно соединить две или более строк, используя оператор сложения. Ре-
зультатом будет одна строка с символами из первой строки, за которыми следуют символы из следующих строк. Эта операция называется конкатенацией:
"cat" + "in" + "the" + "hat"
>> 'catinthehat'
"cat " + "in " + "the " + "hat "
>> 'cat in the hat'
Возможно умножить строку на число с помощью оператора умножения:
"cat" * 3
>> 'catcatcat'
Извлечение срезов (slices). Часто возникает необходимость извлечь под-
строку из строки. Синтаксис описания срезов:
some_list[START:STOP:STEP],
где some_list – итерируемый объект; START – индекс первого элемента в выборке, откуда срез берёт начало до элемента с индексом STOP (не включая его),
с шагом STEP. По умолчанию START = 0, STOP = длине объекта, STEP = 1 .
Соответственно, какие-нибудь (а возможно, и все) параметры могут быть
опущены.
47

Если интересует срез [4:26:7], то это выборка элементов с индексами 4, 11,
18, 25. При этом любой из трёх параметров среза может быть опущен и вместо
соответствующего параметра будет выбрано некое значение по умолчанию.
Если опущен параметр:
START – будет выбрано некое значение по умолчанию "от начала
списка",
STOP – "до конца списка" (включительно),
STEP – "брать каждый элемент".
Ниже приведены примеры с разными наборами параметров:
[:]/[::] – "весь список",
[::2] – "нечётные по порядку элементы",
[1::2] – "чётные по порядку элементы",
[::-1] – "все элементы в обратном порядке",
[5:] – "все элементы, начиная с шестого",
[:5] – "все элементы, не доходя до шестого",
[-2:1:-1] – "все элементы от предпоследнего до третьего в обратном по-
рядке" (во всех случаях выборки от большего индекса к меньшему нужно указывать шаг!).
Срезы работают в двух режимах: выборки и присваивания.
Срезы-выборки применимы к спискам, кортежам, строкам. Новое значе-
ние соответствует типу, к которому применялась выборка:
'hello'[2:] # 'llo'
(1, "abc", True, None)[2:] # (True, None)
[1, 2, 3, 4, 5][2:] # [3, 4, 5]
Заметим, что:
срезы наименее полезны для кортежей,
копировать список проще всего по срезу [:],
при порождении нового списка или кортежа копируются только ссылки.
Одним из вариантов модификации списка (но не строк и кортежей) яв-
ляется присваивание срезу. Срезу с указанным шагом можно присвоить список,
содержащий соответствующее (то же, что и в срезе) количество новых элементов.
48

Пример:
list = [1, 2, 3, 4, 5, 6]
list[::2] = [0, 0, 0]
print(list) # => [0, 2, 0, 4, 0, 6]
Если попытаться присвоить срезу с шагом не то количество элементов, то
система сгенерирует ошибку:
list = [1, 2, 3, 4]
list[::2] = [5, 6, 7]
>> ValueError: attempt to assign sequence of size 3 to
extended slice of size 2
Если срез непрерывный (шаг не указан и индексы идут подряд), то такому
срезу можно присвоить как больше элементов, тогда список вырастет, так
и меньше, что приведёт к урезанию списка. Примеры:
list = [1, 2, 3]
list[2:] = [4, 5]
print(list) # => [1, 2, 4, 5]
list[1:-1] = [100]
print(list) # => [1, 100, 5]
list [:] = []
print(list) # => []
Сначала список растёт, потом уменьшается, а затем становится пустым.
Срезы можно создавать и использовать сами по себе, как обычные
значения.
Сконструировать срез можно с помощью функции slice:
first_two = slice(2)
each_odd = slice(None, None, 2)
print(each_odd) # => slice(None, None, 2)
list = [1, 2, 3, 4, 5]
49

print(list[first_two]) # => [1, 2]
print(list[each_odd]) # => [1, 3, 5]
Функция slice может иметь от одного до трёх параметров – START,
STOP, STEP. Если нужно "пропустить" один из параметров, то вместо него
можно подставить None.
Заметим, что:
None можно использовать и в записи срезов в квадратных скобках. Там
None также будет означать пропуск значения!
На месте параметров среза могут быть любые выражения, лишь бы они
имели целые значения или None.
Элемент с индексом STOP не попадает в выборку. Какой бы ни выбрали
неотрицательный индекс n для любого списка, даже выходящий за его пределы,
будет соблюдаться равенство
list == list[:n] + list[n:]
Пример:
s = 'Hello!'
print(s[:2] + s[2:]) # => 'Hello!'
print(s[:4] + s[4:]) # => 'Hello!'
print(s[:0] + s[0:] == s) # => True
print(s[:100] + s[100:] == s) # => True
6. Циклы
Основными и решающими преимуществами компьютера перед человеком
являются колоссальное быстродействие, умение принимать решение и обрабатывать циклические структуры.
Циклическими называют такие структуры, когда нужно снова и снова использовать определенный фрагмент/блок кода.
Проще говоря, циклы нужны для того, чтобы пользоваться созданным
фрагментом кода несколько раз.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
