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

Вывод:
Пример вложенного цикла for:
for i in range(1, 3):
print(i)
for letter in ['a', 'b', 'c']:
print(letter)
>> 1
>> 'a'
>> 'b'
>> 'c'
>> 2
>> 'a'
>> 'b'
>> 'c'
Следующий пример показывает суммирование чисел из разных списков.
list1 = [ 1 , 2 , 3 , 4 ]
list2 = [ 5 , 6 , 7 , 8 ]
added_up = []
for i in list1:
for j in list2:
added_up.append(i + j)
print (added _up)
>> [6, 7, 8, 9, 7, 8, 9, 10, 8, 9, 10, 11, 9, 10, 11, 12]
61

Пример вложенного цикла while. Программа формирует и выводит таб-
лицу умножения:
i = 1 # инициализация параметра внешнего цикла
while i < 10: # условие внешнего цикла
j = 1 # инициализация параметра вложенного цикла
while j < 10: # условие вложенного цикла
print(i, '*', j, '=', i * j, end='\t') # вывод
j += 1 # изменение параметра вложенного цикла
i += 1 # изменение параметра внешнего цикла
print() # переход на новую строку
Пример комбинированного вложения циклов for и while. Не имеет прин-
ципиального значения, какой из циклов является внутренним и внешним. Программа будет печатать цифры 0-4 до тех пор, пока пользователь не введет n.
while input('Continue y or n?') != 'n':
for i in range(1, 5):
print(i)
>> Continue y or n?y
>> 1
>> 2
>> 3
>> 4
>> 5
>> Continue y or n?y
>> 1
>> 2
>> 3
>> 4
>> 5
>> Continue y or n?n
>>>
Подводя итог сказанному, отметим, что хотя while – простой универсальный цикл, он довольно медленный, а вот цикл for несколько сложнее, менее универсальнее, но гораздо быстрее цикла while и в отличие от него не
требует никаких условий.
62

Настройка функции print()
Подробнее рассмотрим различные способы вызова print(), иначе гово-
ря, познакомимся с сигнатурой функции. Сигнатура – формальное описание
типов аргументов и типа возвращаемого значения функции.
По умолчанию в функции print() предусмотрены дополнительные ар-
гументы, которые выводятся через пробел, а затем переводится строка. Но если
использовать параметры sep (разделитель) и end (окончание), то функция
print() будет работать по-другому.
В частности, с помощью параметра sep можно указать отличный от про-
бела разделитель:
print("Mon","Tue","Wed","Thu","Fri","Sat","Sun",sep="-")
>> Mon-Tue-Wed-Thu-Fri-Sat-Sun
print(1, 2, 3, sep="//")
>> 1//2//3
С помощью параметра end можно указать, что делать после вывода стро-
ки. По умолчанию осуществляется перевод строки. Но можно указать любой
другой символ:
print(10, end="")
>> 10
Переход на новую строку обозначается символом '\n'. В этом случае ни-
каких изменений в работе функции print не наблюдается, так как функция по
умолчанию итак осуществляет перевод строки:
print(10, end='\n')
>> 10
>>
Если использовать символ '\n\n', то произойдет пропуск еще одной до-
полнительной строки:
print(10, end='\n\n')
>> 10
>>
63

Полный синтаксис print выглядит так:
print(object1, object2, . .., sep=' ', end='\n', file=sys.stdout, flush=False),
где
o *objects – объект/объекты вывода;
o sep – разделитель между объектами. В качестве своего значения можно
передавать строку или None (по умолчанию пробел " ");
o end – символ в конце строки (по умолчанию перенос строки \n);
o file – file-like объект [поток] (по умолчанию sys.stdout);
o flush – принудительный сброс потока [работает с версии Python 3.3] (по
умолчанию False).
Функция print выводит значения в sys.stdout по умолчанию на экран.
Ниже приводятся примеры использования функции print при выводе па-
раметров разных типов:
print('one', 'two', 'three') # str
>> one two three
print(45) # int
>> 45
print(3.14) # float
>> 3.14
print(True) # bool
>> True
print([1, 2, 3]) # list
>> [1, 2, 3]
print({'red', 'green', 'blue'}) # set
>> {'red', 'green', 'blue'}
print({'name': 'Alex', 'age': 37}) # dict
>> {'name': 'Alex', 'age': 37}
print((1, 2, 3)) # tuple
>> (1, 2, 3)
64

Примеры использования параметра sep:
print('hello', 'world', sep=None)
>> hello world
print('hello', 'world', sep=' ')
>> hello world
print('hello', 'world')
>> hello world
Для того чтобы вывести аргументы в столбик, используют символ экра-
нирования: \ – обратный слэш.
print('hello', 'world', sep='\n')
>> hello
>> world
В приведенном ниже примере экранируют кавычки вокруг No, чтобы ин-
терпретатор распознал их как часть строки, а не начало или конец строки:
print("Alex's mom said \"No\"")
>> Alex's mom said "No"
В этом примере не пришлось экранировать одинарную кавычку (апостроф
's), потому что сама строка заключена в двойные кавычки. Если бы строка была
заключена в одинарные кавычки, то символ экранирования нужен был бы перед
апострофом, но не перед двойными кавычками.
При выводе символа обратного слеша работает то же правило: как и любой
специальный символ, его надо экранировать:
print("\\")
>> \
В связи с приведенным выше примером с использованием различного вида
кавычек ("Alex's mom said \"No\"") необходимо понять, что такое
строка и какую роль играют кавычки.
Строкой считается все, что находится внутри кавычек, включая пробел,
один символ или вообще отсутствие символов.
65

В отношении кавычек действует простое правило: если строка началась
с двойной кавычки, то и закончиться она должна тоже двойной кавычкой,
а одинарные кавычки внутри становятся частью строки.
Верно и обратное: если внутри строки нужно использовать двойные кавычки, то саму строку надо делать в одинарных. Причем количество кавычек
внутри самой строки неважно.
Помимо экранированных символов существуют и экранированные по-
следовательности.
Допустим, надо вывести на экран следующий текст:
– Are you hungry?
– Yes!
Если для этого воспользоваться следующим программным кодом:
print("- Are you hungry?- Yes!")
>> - Are you hungry?- Yes!,
то результат получится не такой, как задумывался.
Чтобы получить желаемый результат, необходимо сделать перевод строки
после вопросительного знака, для чего можно воспользоваться символом \n:
print("- Are you hungry?\n- Yes!")
>> - Are you hungry?
>> - Yes!
Символ \n – это пример экранированной последовательности (escape
sequence). Такие последовательности еще называют управляющими конструкциями.
При работе с символом перевода необходимо руководствоваться следую-
щими правилами.
1. Неважно, что стоит перед или после \n: символ или пустая строка. Пе-
ревод выполнится в любом случае.
2. Строка может содержать только \n:
print('John Kennedy') # Строка с текстом
print("\n") # Строка с невидимыми символами перевода строки
print('Hemingway') # Строка с текстом
66

>> John Kennedy
>> Hemingway
3. В коде последовательность \n выглядит как два символа, но с точки
зрения интерпретатора – это один специальный символ.
4. Если нужно вывести \n как текст (два отдельных печатных символа), то
можно воспользоваться экранированием – добавить еще один \ в начале. Последовательность \\n отобразится как символы \ и n, которые идут друг за
другом:
print("Alex loves using \\n")
>> Alex loves using \n
Рассмотрим вывод значений переменных в функции print посред-
ством метода format, передавая ему значения переменных для вывода. При
этом нужно указывать номера индексов в строке в фигурных скобках {}, которые выступают заполнителями. В этом случае print выступает в качестве
шаблона.
Рассмотрим пример:
a = 7
b = "Python"
print("{0} – целое число, а {1} – строка.".format(a,b))
>> 7 – целое число, а Python – строка.
Вместо аргумента format можно использовать знак процента (%) для вы-
вода значений переменных. Этот способ тоже работает по принципу заполнителей, но здесь не нужно указывать номера индексов, а можно только обозначить
тип данных, которые получит функция.
Рассмотрим пример:
pupil = "Alex"
old = 17
grade = 9.5
print("It's %s, %d. Level: %f" % (pupil, old, grade))
>> It's Alex, 17. Level: 9.500000
67

Здесь вместо трех символов %s, %d, %f подставляются значения переменных pupil, old, grade. Буквы s, d, f обозначают типы данных – строку, целое число, вещественное число.
Хотя в качестве значения переменной grade было указано число 9.5, на
экран оно вывелось с дополнительными нулями. Чтобы указать, сколько требуется знаков после запятой, надо перед f поставить точку, а после нее указать
желаемое количество знаков в дробной части:
pupil = "Alex"
old = 17
grade = 9.5
print("It's %s, %d. Level: %.1f" % (pupil, old, grade))
>> It's Alex, 17. Level: 9.5
Вернемся к первому примеру, где номера индексов в фигурных скобках {}
выступают заполнителями, и перепишем его с использованием символов %s,
%d.
a = 7
b = "Python"
print("%d – целое число, а %s – строка."%s(a,b))
>> 7 – целое число, а Python – строка.
Теперь посмотрим, что произойдет, если для переменной a, являющейся
целым числом, указать %s:
print("%s – целое число, а %s – строка."%(a,b))
>> 7 – целое число, а Python – строка.
Как видно, ошибки не произошло, так как функция print неявно выполняет typecasting (преобразование типа) и конвертирует целое число в строку,
но обратно конвертировать строку в целое число недопустимо и в случае такой
попытки выводится сообщение об ошибке преобразования типов TypeError:
print("%d – целое число, а %d – строка."%(a,b))
>> TypeError: %d format: a number is required, not str
68

7. Модули
Коммерческие приложения, написанные на Python, могут иметь сотни, тысячи и даже миллионы строк кода. Очевидно, что умещать такое количество
строк кода в одном файле практически невозможно и нецелесообразно. Логично разбить такой код на части. В таком случае обычно работают с главным
файлом, а отдельные функции помещают в разные модули. Затем модули импортируют в главный (основной) файл main.py с помощью ключевого слова
import. В итоге команда разработчиков получает удобный читабельный код,
который удобно обслуживать.
Отметим, что любой файл с кодом называется модулем.
Python также поставляется со встроенными модулями, которые обеспе-
чивают дополнительную функциональность. Таким образом, модули или библиотеки расширяют возможности Python и упрощают написание программ.
Модуль можно повторно использовать в других программах.
Описание модулей, входящих в стандартную библиотеку Python, есть на
официальном сайте: https://docs.python.org/3/library/
Итак, чтобы использовать модуль, его надо импортировать, то есть сделать
доступным для программы с помощью оператора import и названия импортируемого модуля. Как правило, модули импортируются первой строкой в верхней части файла. Синтаксис команды имеет вид
import имя_модуля
Проиллюстрируем импортирование математического модуля math:
import math
После того как модуль math импортировали, его можно использовать.
Синтаксис команды использования кода модуля выглядит следующим образом:
имя_модуля.код,
где имя_модуля – имя импортированного модуля, а код – имя требуемой
функции, или переменной, из модуля.
Приведем примеры использования нескольких функций из модуля math:
import math
math.fabs(-7.25)
>> 7.25
69

Заметим, что функция fabs() возвращает абсолютное значение числа.
Она аналогична функции abs(), но между ними имеются вполне определенные различия:
abs() – встроенная функцией, а fabs() включена в модуль math,
поэтому вызов abs() в отличие от вызова fabs() осуществляется следующим образом: print(abs(-7.25));
fabs()оперирует только с вещественными и целыми аргументами,
а abs()– и с комплексными;
abs() возвращает значения разных типов. Это зависит от типа аргумента, а fabs() всегда приводит аргумент к вещественному типу, если же это
невозможно – выбрасывает ошибку.
Приведенные ниже примеры иллюстрируют сказанное.
print(type(abs(1)))
>> <class 'int'>
print(type(abs(1.0)))
>> <class 'float'>
print(type(abs(complex(1.0, 1.0))))
>> <class 'float'>
print(type(math.fabs(complex(2,3))))
>> TypeError: can't convert complex to float
Примеры использования различных модулей:
import math
math.pow(2, 3)
>> 8.0
import math
print(math.cos(1))
>> 0.5403023058681398
Познакомимся еще с одним встроенным модулем Python – random. Если
требуется сгенерировать случайное целое число в определенном интервале, то
нужно использовать функцию randint. Эта функция имеет в качестве пара-
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
