Добавил:
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
- •Оператор деления по модулю
- •Сортировка методом пузырька
- •Поисковый алгоритм
- •Рекурсия
- •Абстрактные типы данных
- •Узлы
- •Стеки
- •Связанные списки
- •Массивы
- •Бинарные деревья
- •Поиск в ширину и в глубину
- •Хэш-таблицы
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

метров два целых числа, которые определяют интервал, в котором будет сгенерировано случайное число.
import random
random.randint(0,100)
>> 52
Примечание.
Заметим, что в этом случае может быть сгенерировано дру-
гое число.
Изменим последнюю программу, используя еще один модуль – time:
import random, time
while True:
print(random.randint(1, 100))
time.sleep(1)
Отличие этой программы от предыдущей заключается в том, что она генерирует случайные целые числа в интервале от 1 до 100 с паузой в одну секунду.
Используемый цикл бесконечен и остановить исполнение кода необходимо, используя комбинацию клавиш Ctrl + C.
Встроенный модуль statistics подсчитает статистические величины:
среднее значение, медиану и моду в итерируемом объекте (списке), состоящем
из чисел.
import statistics
# среднее
nums = [1, 5, 33, 12, 46, 33, 2]
statistics.mean(nums)
# медиана
statistics.median(nums)
# мода
statistics.mode(nums)
>> 18.857142857142858
>> 12
>> 33
Если необходимо проверить, является ли строка ключевым словом в Python,
то применяют встроенный модуль keyword.
71

import keyword
keyword.iskeyword("for")
keyword.iskeyword("football")
>> True
>> False
Довольно часто возникает необходимость в создании собственных модулей.
Для этого достаточно сохранить скрипт (скрипт, или сценарий, – это по-
следовательность команд для выполнения конкретных операций, то есть это
небольшая программа, настроенная на определенное действие) с расширением
*.py. Теперь он доступен в любом другом файле. Например, создайте два файла:
hello.py и project.py и сохраните их в одной созданной директории modimp.
В первом запишите:
def print_hello():
print("Hi!")
А во втором вызовите эту функцию:
import hello
hello.print_hello()
>> Hi!
Создайте новый файл message.py и поместите его в ту же директорию,
в которой находится main.py. Соответственно модуль будет называться
message. Определите в нем следующий код:
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
Вы определили переменную hello и функцию print_message, которая
в качестве параметра получает некоторый текст и выводит его на консоль.
Импортируйте модуль message в главном файле программы – main.py:
import message # подключаем модуль message
# выводим значение переменной hello
print(message.hello) # Hello all
# обращаемся к функии print_message
message.print_message("Hello work") # Message: H ello work
72

Если запустить основной модуль main.py, то программа исполнит свою ра-
боту. Но запуск отдельно модуля message.py не даст никакого результата, так
как модуль message просто определяет функцию и переменную и не выполняет
никаких других действий. Модуль message.py может использоваться как сам по
себе, так и подключаться к другим модулям.
При выполнении модуля среда определяет его имя и присваивает его глобальной переменной __name__ (с обеих сторон по два подчеркивания). Если
модуль является запускаемым, то его имя будет __main__ (также по два подчеркивания с каждой стороны). Если модуль используется в другом модуле, то
в момент выполнения его имя аналогично названию файла без расширения .py.
И можно это использовать. Измените содержимое файла message.py:
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
def main():
print_message(hello)
# вызов функции main
if __name__ == "__main__":
main()
В операторе print(f"Message: {text}")в строку встроены значе-
ния переменных. Для этого внутри строки переменные размещаются в фигурных скобках {}, а перед всей строкой ставится символ f.
В модуль message.py добавлена функция main для тестирования его функциональности. И можно сразу запустить файл message.py отдельно от всех
и протестировать код.
При вызове функции main в последних двух строках переменная __name__
указывает на имя модуля. Для главного модуля, который непосредственно запускается, эта переменная всегда будет иметь значение __main__ вне зависимости от имени файла. Если запустить скрипт message.py отдельно, Python присвоит переменной __name__ значение __main__, а далее в if вызовет функцию
main из этого же файла.
73

Однако если запустить другой скрипт, а message.py подключить в качестве
вспомогательного, то переменная __name__ получит значение message и метод
main в файле message.py не будет работать.
Данный подход с проверкой имени модуля является более рекомендуе-
мым, чем просто вызов метода main.
Получить список всех модулей можно командой
help("modules")
Встроенная функция dir() возвращает отсортированный список строк,
содержащих все имена, определенные в модуле.
В заключение отметим, что для удобства восприятия кода в сообществе
Python-разработчиков принято называть файлы в стиле snake_case, что перево-
дится как «змеиный регистр» и поэтому идеально сочетается с языком Python.
8. Файлы
В Python хорошо организована работа с файлами. Встроенные средства
Python для работы с файлами: открытие / закрытие, чтение и запись. Можно
легко читать данные из файла и записывать в файл. Чтение данных из файла
означает доступ к содержимому файла. Запись данных в файл означает добавление нового содержимого в файл. Это полезно при использовании данных из
файла в программе или выводе данных из программы в файл. Рассмотрим основы работы с файлами.
Запись в файлы
Прежде чем работать с файлом, его надо открыть встроенной функцией
open:
f = open('text.txt', 'r')
У функции open два параметра: первый – это строка, представляющая собой
путь к файлу, а второй – определяет режим, в котором нужно открыть файл.
Путь к файлу определяет локацию файла на компьютере, например:
/Users/calex/my_file.txt – это путь к файлу с именем my_file.txt. Каждое слово,
разделенное косой чертой перед ним, является именем папки. Вместе они ука-
74

зывают путь к файлу. Если путь к файлу содержит только имя файла,
Режим
Что делает?
'r'
Чтение файла (по умолчанию)
'w'
Запись в файл. Если файл не существует, то он будет создан
'x'
Запись в файл. Если файл не существует, то будет вызвано исклю-
'a'
Открытие на дозапись, информация добавляется в конец файла
't'
Открывает как текстовый файл (по умолчанию)
'b'
Открывает как двоичный файл
'+'
Открывает файл на чтение и запись
Python
будет искать файл в папке, из которой запускается программа. Не рекомендуется прописывать путь к файлу самостоятельно. Пути к файлам всегда нужно создавать с помощью встроенного модуля os module.
import os
os.path.join("Users", "calex", "my_file.txt")
>> 'Users/calex/my_file.txt'
Подробную информацию о том, как прописывать пути к файлам, можно
посмотреть на сайте https://www.theselftaughtprogrammer.io/filepaths
.
Второй параметр представляет режим открытия файла, который определяет действия для выполнения с файлом. Вот несколько режимов, в которых
можно открыть файл:
чение
Режимы могут быть объединены, например: комбинируя 'r+' или 'w+',
можно добиться открытия файла в режиме и чтения, и записи одновременно,
но с одним отличием – первый режим вызовет исключение, если файла не существует, а работа во втором режиме в таком случае создаст его в каталоге, где
расположена программа.
После того как передали функции open путь к файлу и режим в качестве
параметров, open создает так называемый файловый объект, который можно
использовать для чтения или записи в файл (или того и другого, в зависимости
от выбранного режима). Вот пример записи в файл:
my_file = open("my_file.txt", "w")
my_file.write("Hello from Python!")
my_file.close()
75

Функция open создает новый файл с именем my_file.txt (потому что
передали 'w' в качестве режима) в каталоге, в котором запускалась программа.
Сохраните файловый объект, возвращенный функцией open, в переменной
my_file.
Теперь вызовите метод write (запись) для файлового объекта, который
принимает строку в качестве параметра и записывает ее в новый созданный
файл. Наконец, закройте файл, вызвав метод close. Это важный шаг. Всякий
раз, когда открывается файл с помощью метода open, нужно закрыть его с помощью метода close, в противном случае это может вызвать проблемы.
Использование конструкции with
Существует более рациональный способ для открытия файлов, заключающийся в использовании конструкции with … as …, которая работает как менеджер создания контекста. Менеджеры контекста позволяют выделять и освобождать ресурсы строго по необходимости.
Перепишите вышеприведенный пример с помощью конструкции with:
with open("my_file.txt", "w") as my_file:
my_file.write("Hello from Python!")
Основное отличие в том, что Python самостоятельно закрывает файл, и разработчику нет необходимости помнить об этом, а кроме того, не будут вызваны
исключения при открытии файла (например, если файл не существует).
Чтение из файлов
Для чтения содержимого файла есть несколько возможностей, но наиболее
практичными являются лишь две.
1. Метод read. Он читает файл целиком, если вызывается без аргумента.
Если же в качестве аргумента используется целое число n, то читается n символов.
f = open('text.txt')
f.read(1)
>> 'H'
f.read()
>> 'ello, world!\nThe end.\n\n'
76

При применении этой функции несколько раз подряд будет считываться
часть за частью этого текста – виртуальный курсор будет сдвигаться на считанную часть текста. Курсор можно сдвинуть на определенную позицию методом
seek().
with open("text.txt", "r") as f: # 'Hello, world!'
first_part = f.read(8) # 'Hello, w'
f.seek(4)
second_part = f.read(8) # 'o, world'
2. Чтение файла заключается в считывании его построчно, с помощью
цикла for:
with open("text.txt", "r") as f:
for line in f:
print(line)
>> 'Hello, world!\n'
>> '\n'
>> 'The end.\n'
>> '\n'
Можно вызвать read только один раз (каждый раз, когда запускаете свою
программу). Если нужно будет в программе снова использовать содержимое
файла позже, следует сохранить его содержимое в переменной или контейнере.
Например, можно изменить следующий пример:
with open("my_file.txt", "r") as my_file:
for line in my_file.read():
print(line)
>> Hello from Python!
чтобы сохранить содержимое файла в виде списка:
my_list = list()
with open("my_file.txt", "r") as my_file:
for line in my_file.read():
my_list.append(line)
print(my_list)
>> Hello from Python!
Метод my_list.append()добавляет элемент в конец списка.
77

CSV-файлы
Python поставляется со встроенным модулем для работы с CSV-файлами.
Этот формат является одним из самых распространенных форматов импорта
и экспорта электронных таблиц и баз данных. CSV-файл имеет расширение .csv
и содержит данные, разделенные с помощью запятых (CSV – Comma Separated
Values – значения, разделенные запятыми). Запятая в файле CSV называется
разделителем (в качестве разделителя может выступать и символ вертикальной
черты). Каждая часть данных, разделенная запятой, представляет собой ячейку
в Excel. Каждая строка файла CSV представляет собой строку в Excel. Вот пример содержимого файла csv:
# my_file.csv
one, two, three
four, five, six
Можно загрузить этот файл в Excel, и one, two и three будут располагаться в отдельных ячейках первой строки, а four, five и six – в ячейках
второй строки электронной таблицы.
Можно использовать оператор with, чтобы открыть CSV-файл, но внутри
оператора with нужно использовать модуль csv для преобразования файлового
объекта в объект csv. Модуль csv имеет метод write, который принимает файловый объект и разделитель и возвращает объект csv с помощью метода
writerow, который используют для записи в CSV-файл:
import csv
with open('my_file.csv', 'w') as csvfile:
spamwriter = csv.writer(csvfile, delimiter = ',')
spamwriter.writerow(['one', 'two', 'three'])
spamwriter.writerow(['four', 'five', 'six'])
Метод writerow принимает список в качестве параметра. Каждый элемент в списке записывается в файл CSV, и каждый элемент отделяется разделителем, который передан методу записи (в данном случае запятой). writerow
записывает только одну строку, поэтому нужно вызвать его дважды, чтобы создать две строки. При запуске программы она создаст новый файл с именем
78

my_file.csv
, и если открыть файл в текстовом редакторе, он будет выгл
я-
деть так:
# my_file.csv
one, two, three
four, five, six
Если загрузить этот файл в Excel (или в Google-таблицы), запятые
исчезнут, one, two и three будут в ячейках первой строки, а four, five и
six –
в ячейках второй строки.
Также можно использовать модуль csv для чтения содержимого файла.
Чтобы открыть файл CSV только для чтения, сначала надо передать в качестве
второго параметра функции open параметр 'r'. Вместо использования метода
записи, как в предыдущем примере, используется метод чтения reader с передачей пути к файлу и запятой в качестве разделителя.
Метод reader возвращает итерируемый объект, который перебирается
для печати каждой строки. Вызываем метод join, чтобы добавить запятую
между каждым значением и распечатать содержимое файла, как оно отобража-
ется в исходном файле:
import csv
with open('my_file.csv', 'r') as csvfile:
spamreader = csv.reader(csvfile, delimiter = ',')
for row in spamreader:
print(','.join(row))
>> one,two,three
>> four,five,six
79

II. ВВЕДЕНИЕ В ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП)
9. Парадигмы программирования
Парадигма программирования – это совокупность идей и понятий,
определяющих стиль написания компьютерных программ. Существует много
различных парадигм программирования. В этой главе будут рассмотрены следующие парадигмы программирования: процедурное (императивное) программирование, функциональное (декларативное) программирование и объектноориентированное программирование, на которое будет сделан акцент в учебном
пособии.
Состояние
Одним из фундаментальных различий между разными парадигмами про-
граммирования является обработка состояния. Состояние – это данные, к которым программа имеет доступ. Программы хранят данные в переменных. Таким
образом, состояние – это значение переменных программы в данный момент
времени выполнения программы.
Процедурное программирование
До сих пор программирование базировалось на парадигме процедурного
программирования, которое можно описать как “сделай это, потом то”, то
есть это последовательность шагов, ведущих к решению, причем каждый шаг
изменяет состояние программы. Примером процедурного программирования
может служить следующая программа:
x = 3
y = 5
z = 7
xyz = x + y + z
>> 15
Каждый шаг программы изменяет ее состояние: переходим к xyz, определяя
сначала x, потом – y, затем – z и, наконец, – xyz.
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
