ООП_на_Python_Учебное пособие_var5a. Учебнометодическое пособие по дисциплине Введение в компьютерные технологии Москва Физический факультет мгу имени М. В. Ломоносова 2022
Скачать 59.5 Kb.
|
Задорожный С.С., Фадеев Е. П. Объектно-ориентированное программирование на языке Python Учебно-методическое пособие по дисциплине «Введение в компьютерные технологии» Москва Физический факультет МГУ имени М.В. Ломоносова 2022 2 Задорожный Сергей Сергеевич, Фадеев Егор Павлович Объектно-ориентированное программирование на языке Python М. : Физический факультет МГУ им. М. В. Ломоносова, 2022. – 49 с. В последнее время языки сценариев, такие как Python, набирают популярность. На них написано больше программного обеспечения, чем на традиционных системных языках. Язык Python доступен для всех основных платформ и активно применяется в научных вычислениях, машинном обучении, веб-разработке, создании игр и визуальных эффектов, и ряде других направлений. Язык Python позволяет писать программы в традиционном процедурном стиле, однако крупные проекты имеет смысл разрабатывать, используя парадигму объектно-ориентированного программирования (ООП). В языке Python ООП играет ключевую роль, т.к. практически все сущности языка представляют собой объекты. По сравнению со многими другими языками в Python объектно-ориентированное программирование обладает рядом особых черт, которые следует внимательно рассмотреть при освоении языка. Целью пособия является помощь студентам по освоению этих особенностей. Рассмотрен ряд программ иллюстрирующих создание собственных классов. Приведен обширный список литературы (в том числе и интернет ресурсов), который поможет выбрать наиболее подходящее издание в соответствии с пожеланиями и уровнем подготовки. Пособие поможет студентам более самостоятельно и оперативно решать задачи практикума по программированию. Рассчитано на студентов первого и второго курсов физического факультета, но может быть полезно студентам старших курсов, аспирантам и сотрудникам, занимающимися разработкой программного обеспечения на языке Python. Авторы – сотрудники кафедры математического моделирования и информатики физического факультета МГУ. Рецензенты: доцент кафедры ОФиВП Коновко А.А., ведущий электроник каф. ОФиВП Лукашев А.А. Подписано в печать . Объем 3,5 п.л. Тираж 30 экз. Заказ № . Физический факультет им. М. В. Ломоносова, 119991 Москва, ГСП-1, Ленинские горы, д. 1, стр. 2. Отпечатано в отделе оперативной печати физического факультета МГУ. ©Физический факультет МГУ им. М. В. Ломоносова, 2022 ©Фадеев Е.П., 2022 ©Задорожный С.С., 2022 3 Оглавление 1. Введение ................................................................................................................... 4 2. Типы данных. Переменные. ................................................................................... 5 3. Вывод данных. Функция print().............................................................................. 6 4. Ввод данных. Функция input() ................................................................................ 7 5. Логические выражения и условные операторы .................................................... 7 6. Списки ...................................................................................................................... 9 7. Циклы...................................................................................................................... 10 8. Функции ................................................................................................................. 13 9. Модули ................................................................................................................... 15 10. Объектно-ориентированное программирование ............................................ 17 11. Создание классов и объектов ............................................................................ 18 12. Наследование...................................................................................................... 21 13. Множественное наследование .......................................................................... 23 14. Перегрузка операторов ...................................................................................... 23 15. Абстрактные методы ......................................................................................... 26 Ограничение доступа к атрибутам класса .............................................................. 28 16. ..................................................................................................................................... 28 17. Полиморфизм ..................................................................................................... 28 18. Композиция ........................................................................................................ 29 19. Статические методы .......................................................................................... 30 20. Примеры объектно-ориентированных программ на Python .......................... 31 • Класс рациональных дробей ............................................................................. 32 • Класс «Студент» ................................................................................................ 33 • Виртуальная модель процесса обучения ......................................................... 34 • Игра-стратегиия «Солдаты и герои» ................................................................ 34 • Класс «Битва» ..................................................................................................... 36 • Класс «Колода карт» .......................................................................................... 37 • Класс «Паспорт» ................................................................................................ 38 • Класс «Склад оргтехники» ................................................................................ 39 • Задача трёх тел ................................................................................................... 40 21. Задания для самостоятельного решения .......................................................... 42 22. Литература .......................................................................................................... 49 • Сайты: ................................................................................................................. 49 • Онлайн IDE/VM ................................................................................................. 49 • Ресурсы о популярных дополнениях ............................................................... 49 4 1. Введение Python (в русском программистском сообществе прижилось название «Питон», но правильнее будет «Пайтон») – это язык с динамической типизацией данных, который поддерживает многие парадигмы программирования: процедурное, ООП, функциональное. Достоинства языка: • Удобный синтаксис. • Скорость разработки. • Большое количество "сахара" от разработчиков языка. • Кроссплатформенность (достаточно наличия необходимых библиотек и интерпретатора, чтобы запустить вашу программу на другой ОС). • Большое количество библиотек позволяет не изобретать велосипеды. • Широко используется (компания Google использует Python в своей поисковой системе, компании Intel, Cisco, Hewlett-Packard, Seagate, Qualcomm, IBM используют Python для тестирования аппаратного обеспечения, компании JPMorgan Chase, UBS, Getco и Citadel применяют Python для прогнозирования финансового рынка, , служба коллективного использования видеоматериалов YouTube и популярная программа BitTorrent для обмена файлами в пиринговых сетях тоже написаны на языке Python, NASA, Los Alamos, JPL и Fermilab используют Python для научных вычислений). Циклы, ветвления и функции – все это элементы структурного программирования. Его возможностей вполне хватает для написания небольших, простых программ и сценариев. Однако крупные проекты часто реализуют, используя парадигму объектно- ориентированного программирования (ООП). В языке Python ООП играет ключевую роль. Даже программируя в рамках структурной модели, вы все равно пользуетесь объектами и классами, пусть даже встроенными в язык, а не созданными лично вами. В Python все объекты являются производными классов и наследуют от них атрибуты. При этом каждый объект формирует собственное пространство имен. Python поддерживает такие ключевые особенности объектно-ориентированного программирования как наследование, инкапсуляцию и полиморфизм. Полиморфизм позволяет объектам разных классов иметь схожие интерфейсы. Он реализуется путем объявления в них методов с одинаковыми именами. К проявлению полиморфизма как особенности ООП также можно отнести методы перегрузки операторов. Кроме наследования, инкапсуляции и полиморфизма существуют другие особенности ООП. Таковой является композиция, или агрегирование, когда класс включает в себя вызовы других классов. В результате при создании объекта от класса-агрегата, создаются объекты других классов, являющиеся составными частями первого. Преимущества ООП Особенности объектно-ориентированного программирования наделяют его рядом преимуществ. Так ООП позволяет использовать один и тот же программный код с разными данными. На основе классов создается множество объектов, у каждого из которых могут быть собственные значения полей. Нет необходимости вводить множество переменных, т.к. объекты получают в свое распоряжение индивидуальные пространства имен. В этом смысле объекты похожи на структуры данных. Объект можно представить в виде некой упаковки данных, к которой присоединены инструменты для их обработки – методы. Наследование позволяет не писать новый код, а использовать и настраивать уже существующий за счет добавления и переопределения атрибутов. 5 Недостатки ООП ООП позволяет оптимизировать дальнейшую поддержку разрабатываемого приложения, однако предполагает большую роль предварительного анализа предметной области и проектирования. От правильности решений на этом этапе зависит куда больше, чем от непосредственного написания исходного кода. Следует понимать, что одна и та же задача может быть решена разными объектными моделями, каждая из которых будет иметь свои преимущества и недостатки. Только опытный разработчик может сказать, какую из них будет проще расширять и обслуживать в дальнейшем. Особенности ООП в Python По сравнению со многими другими языками в Python объектно-ориентированное программирования обладает рядом особых черт. Всё является объектом – число, строка, список, функция, экземпляр класса, сам класс, модуль. Так класс – объект, способный порождать другие объекты – экземпляры. В Python нет просто типов данных. Все типы – это классы. Инкапсуляции в Python не уделяется особого внимания. В других языках программирования обычно нельзя получить напрямую доступ к свойству, описанному в классе. Для его изменения может быть предусмотрен специальный метод. В Python же не считается предосудительным непосредственное обращение к свойствам. 2. Типы данных. Переменные. В реальной жизни мы совершаем различные действия над окружающими нас предметами, или объектами. Мы меняем их свойства, наделяем новыми функциями. По аналогии с этим компьютерные программы также управляют объектами, только виртуальными, цифровыми. Будем называть такие объекты данными. Очевидно, данные бывают разными. Часто компьютерной программе приходится работать с числами и строками. Числа в свою очередь также бывают разными: целыми, вещественными, могут иметь огромное значение или очень длинную дробную часть. При знакомстве с языком программирования Python мы столкнемся с тремя типами данных: • целые числа (тип int) – положительные и отрицательные целые числа, а также 0 (например, 4, 687, -45, 0). • числа с плавающей точкой (тип float ) – дробные, они же вещественные, числа (например, 1.45, -3.789654, 0.00453). • строки (тип str) — набор символов, заключенных в кавычки (например, "ball", "What is your name?", 'dkfjUUv', '6589'). Кавычки в Python могут быть одинарными или двойными. Одиночный символ в кавычках также является строкой, отдельного символьного типа в Python нет. Данные хранятся в памяти компьютера. Когда мы вводим число, оно помещается в какую-то ячейку памяти. Но как потом узнать, куда именно? Механизм связи между переменными и данными может различаться в зависимости от языка программирования и типов данных. Для этого данные связываются с каким-либо именем и в дальнейшем обращение к ним возможно по этому имени – переменной. Слово "переменная" обозначает, что сущность может меняться, она непостоянна. Одна и та же переменная может быть связана сначала с одними данными, а потом – с другими. То есть ее значение может меняться, она переменчива. В программе на языке Python, как и на большинстве других языков, связь между данными и переменными устанавливается с помощью знака =. Такая операция называется 6 присваивание. Например, выражение sq = 4 означает, что на объект, представляющий собой число 4, находящееся в определенной области памяти, теперь ссылается переменная sq, и обращаться к этому объекту следует по имени sq. Обратите внимание на эту особенность переменных в Python. Если теперь написать sq=1, то sq будет ссылаться на другой объект, представляющий собой число 1. Т.е. все переменные в Python являются ссылками, переменных закрепленных за фиксированным адресом памяти (как в языке С) нет, соответственно нет и указателей. 3. Вывод данных. Функция print() Для вывода данных на экран используется функция print(). Можно передавать в функцию print() как непосредственно литералы, так и переменные, вместо которых будут выведены их значения. Аргументы функции разделяются между собой запятыми. В выводе вместо запятых значения разделены пробелом. Если в скобках стоит выражение, то сначала оно выполняется, после чего print() уже выводит результат данного выражения: print("hello" + " " + "world") # вывод: hello world print(10 - 2.5/2) # вывод: 8.75 В функции предусмотрены дополнительные параметры. Например, через параметр 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: В функцию print() нередко передаются так называемые форматированные строки, хотя по смыслу их правильнее называть строки-шаблоны. Никакого отношения к самой print()они не имеют. Когда такая строка находится в скобках print(), интерпретатор сначала согласно заданному в ней формату преобразует ее к обычной строке, после чего передает результат в print(). Форматирование может выполняться в так называемом старом стиле или с помощью строкового метода format. Старый стиль также называют Си-стилем, так как он схож с тем, как происходит вывод на экран в языке C: pupil = "Ben" old = 16 grade = 9.2 print("It's %s, %d. Level: %.2f" % (pupil, old, grade)) # вывод: It's Ben, 16. Level: 9.20 Здесь вместо трех комбинаций символов %s, %d, %f подставляются значения переменных pupil, old, grade. Буквы s, d, f обозначают типы данных – строку, целое число, вещественное число. Теперь посмотрим на метод format(): print("This is a {0}. It's {1}.".format("ball", "red")) # вывод: This is a ball. It's red. print("This is a {0}. It's {1}.".format("cat", "white")) # вывод: This is a cat. It's white. print("This is a {0}. It's {1} {2}.".format(1, "a", "number")) # вывод: This is a 1. It's a number. В строке в фигурных скобках указаны номера данных, которые будут сюда подставлены. Далее к строке применяется метод format(). В его скобках указываются сами данные (можно использовать переменные). На нулевое место подставится первый аргумент метода format(), на место с номером 1 – второй и т. д. 7 В новых релизах Питона появился третий способ создания форматированных строк – f-строки. Перед их открывающей кавычкой прописывается буква f. В самой строке внутри фигурных скобок записываются выражения на Python, которые исполняются, когда интерпретатор преобразует строку-шаблон в обычную. a = 10 b = 1.33 c = 'Box' print(f'qty - {a:5}, goods - {c}') # вывод: qty - 10, goods - Box print(f'price - {b + 0.2:.1f}') # вывод: price - 1.5 В примере число 5 после переменной a обозначает количество знакомест, отводимых под вывод значения переменной. В выражении b + 0.2:.1f сначала выполняется сложение, после этого значение округляется до одного знака после запятой. 4. Ввод данных. Функция input() За ввод в программу данных с клавиатуры в Python отвечает функция input() . Когда вызывается эта функция, программа останавливает свое выполнение и ждет, когда пользователь введет текст. После того, как он нажмет клавишу Enter, функция input() заберет введенный текст и передаст его программе. Их можно присвоить переменной. town=input() user=input() print(f'Вас зовут {user}. Ваш город {town}') Чтобы не вводить человека в замешательство, для функции input() предусмотрен специальный параметр-приглашение. Это приглашение выводится на экран при вызове input(): town=input("Ваш город:") user=input("Ваше имя:") print(f'Вас зовут {user}. Ваш город {town}') Обратите внимание, что в программу поступает строка. Даже если ввести число, функция input() все равно вернет его строковое представление. Чтобы получить число, надо использовать функции преобразования типов. qty=int(input("Количество:")) price=float(input("Цена:")) print(f'Заплатите {qty*price} рублей') В данном случае с помощью функций int() и float() строковые значения переменных qty и price преобразуются соответственно в целое число и вещественное число. 5. Логические выражения и условные операторы Ранее мы познакомились с тремя типами данных – целыми и вещественными числами, а также строками. Введем четвертый – логический тип данных (тип bool ). У этого типа всего два возможных значения: True и False. В программировании False обычно приравнивают к нулю, а True – к единице. Здесь также работает правило: всё, что не 0 и не пустота, является правдой. Говоря на естественном языке (например, русском) мы обозначаем сравнения словами "равно", "больше", "меньше". В языках программирования используются специальные знаки, подобные тем, которые используются в математике: > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), == (равно), != (не равно). 8 Не путайте операцию присваивания значения переменной, обозначаемую в языке Python одиночным знаком "равно", и операцию сравнения (два знака "равно"). Присваивание и сравнение – разные операции. a = 10 b = 5 c = a+b > 14 print(c) # вывод: True c = a < 14-b print(c) # вывод: False c = a <= b+5 print(c) # вывод: True c = a != b print(c) # вывод: True c = a == b print(a, b, c) # вывод: 10 5 False Логические выражения типа kByte >= 1023 являются простыми, так как в них выполняется только одна логическая операция. Однако, на практике нередко возникает необходимость в более сложных выражениях. Может понадобиться получить ответа "Да" или "Нет" в зависимости от результата выполнения нескольких простых выражений. В таких случаях используются специальные операторы, объединяющие два и более простых логических выражения. Широко используются два оператора – так называемые логические И(and) и ИЛИ (or). Чтобы получить True при использовании оператора and, необходимо, чтобы результаты обоих простых выражений, которые связывает данный оператор, были истинными. Если хотя бы в одном случае результатом будет False, то и все выражение будет ложным. x = 8 y = 13 print(y < 15 and x > 8) # вывод: False Чтобы получить True при использовании оператора or, необходимо, чтобы результат хотя бы одного простого выражения, входящего в состав сложного, был истинным. В случае оператора or выражение становится ложным лишь тогда, когда ложны оба составляющие его простые выражения. x = 8 y = 13 print(y < 15 or x > 8) # вывод: True В языке Python есть еще унарный логический оператор not , то есть отрицание. Он превращает правду в ложь, а ложь в правду. Унарный он потому, что применяется к одному выражению, стоящему после него. print(not y < 15) # вывод: False При выполнении кода, в зависимости от тех или иных условий, некоторые его участки могут быть опущены, в то время как другие – выполнены. Иными словами, в программе может присутствовать ветвление, которое реализуется условным оператором, который имеет следующий формат: if <Логическое выражение> : <Блок, выполняемый, если условие истинно> [elif <Логическое выражение> : <Блок, выполняемый, если условие истинно> ] [else : <Блок, выполняемый, если все условия ложны> ] Python считается языком с ясным синтаксисом и легко читаемым кодом. Это достигается сведением к минимуму таких вспомогательных элементов как скобок и точек 9 с запятой. Для разделения выражений используется переход на новую строку, а для обозначения вложенных выражений – отступы от начала строки: a = 50 n = 98 if n < 100 : b = n + a #блок выполняемый, если условие истинно else : b=0 #блок выполняемый, если условие ложно print(b) #вывод 148 Последняя строчка кода print(b) уже не относится к условному оператору, что обозначено отсутствием перед ней отступа. В язык Python встроена возможность настоящего множественного ветвления на одном уровне вложенности, которое реализуется с помощью веток elif. Слово "elif" образовано от двух первых букв слова "else", к которым присоединено слово "if". Это можно перевести как "иначе если". В отличие от else , в заголовке elif обязательно должно быть логическое выражение также, как в заголовке if: old = int(input('Ваш возраст: ')) print('Рекомендовано:', end=' ') if old < 6: print('"Заяц в лабиринте"') elif 6 <= old < 12: print('"Марсианин"') elif 12 <= old < 16: print('"Загадочный остров"') else: print('"Поток сознания"') 6. Списки Список в Python – это встроенный тип (класс) данных, представляющий собой одну из разновидностей структур данных. Структуру данных можно представить, как сложную единицу, объединяющую в себе группу более простых. Каждая разновидность структур данных имеет свои особенности. Список – это изменяемая последовательность произвольных элементов. В большинстве других языков программирования есть такой широко используемый тип данных как массив. В Питоне такого встроенного типа нет. Однако списки условно можно считать аналогом массивов за одним исключением. Составляющие массив элементы должны принадлежать одному типу данных, для списков такого ограничения нет. Например, массив может содержать только целые числа или только вещественные числа или только строки. Список также может содержать элементы только одного типа, что делает его внешне неотличимым от массива. Но вполне допустимо, чтобы в одном списке содержались как числа, так и строки, а также что-нибудь еще. Создавать списки можно разными способами. Создадим его простым перечислением элементов: a = [12, 3.85, "black", -4] Итак, у нас имеется список, присвоенный переменной a. В Python список определяется квадратными скобками. Он содержит четыре элемента. Если где-то в программе нам понадобится весь этот список, мы получим доступ к нему, указав всего лишь одну переменную – a. Элементы в списке упорядочены, имеет значение в каком порядке они расположены. Каждый элемент имеет свой индекс, или номер. Индексация начинается с нуля. В данном 10 случае число 12 имеет индекс 0, строка "black" – индекс 2. Чтобы извлечь конкретный элемент, надо после имени переменной указать в квадратных скобках его индекс: print(a[0]) В Python существует также индексация с конца. Она начинается с -1: print(a[-1]) Часто требуется извлечь не один элемент, а так называемый срез – часть списка. В этом случае указывается индекс первого элемента среза и индекс следующего за последним элементом среза: print(a[0:2]) # [12, 3.85] В данном случае извлекаются первые два элемента с индексами 0 и 1. Элемент с индексом 2 в срез уже не входит. В таком случае возникает вопрос, как извлечь срез, включающий в себя последний элемент? Если какой-либо индекс не указан, то считается, что имеется в виду начало или конец: print(a[:3]) # [12, 3.85, 'black'] print(a[2:]) # ['black',-4] print(a[:]) # [12, 3.85, 'black',-4] Списки – изменяемые объекты. Это значит, что в них можно добавлять элементы, удалять их, изменять существующие. Проще всего изменить значение элемента. Для этого надо обратиться к нему по индексу и перезаписать значение в заданной позиции: a[1] = 4 Добавлять и удалять лучше с помощью специальных встроенных методов списка: a.append('wood') a.insert(1, 'circle') a.remove(4) a.pop() a.pop(2) Перечень всех методов списка можно посмотреть в интернете, например, на официальном сайте https://docs.python.org/3/tutorial/datastructures.html Можно изменять списки не используя методы, а с помощью взятия и объединения срезов: b = [1, 2, 3, 4, 5, 6] b = b[:2] + b[3:] Здесь берется срез из первых двух элементов и срез, начиная с четвертого элемента (индекс 3) и до конца. После чего срезы объединяются с помощью оператора "сложения". Можно изменить не один элемент, а целый срез: mylist = ['ab','ra','ka','da','bra'] mylist[0:2] = [10,20] print(mylist) # [10, 20, 'ka', 'da', 'bra'] 7. Циклы Циклы являются такой же важной частью структурного программирования, как условные операторы. С помощью циклов можно организовать повторение выполнения участков кода. Язык Python при помощи циклов позволяет компактно записать многие повторяющиеся действия, например, вывод чисел от 1 до 100: for x in range (1, 101): print(x) Цикл for применяется для перебора элементов последовательности и имеет такой формат: 11 for <Текущий элемент> in <Последовательность> : <Инструкции внутри цикла> [else: <Блок, выполняемый, если не использовался оператор break> ] Здесь присутствуют следующие конструкции: • <Последовательность> – объект, поддерживающий механизм итерации (последовательного перебора): строка, список, кортеж, диапазон, словарь и др. • <Текущий элемент> – на каждой итерации через эту переменную доступен очередной элемент последовательности или ключ словаря. • <Инструкции внутри цикла> – блок, который будет многократно выполняться. • Если внутри цикла не использовался оператор break, то после завершения выполнения цикла будет выполнен блок в инструкции else. Этот блок не является обязательным. Пример перебора букв в слове: for symbol in "string": print(symbol, end=" ") else: print("\nЦикл выполнен") Функцией range () используется для генерации индексов. Она имеет следующий формат: range ([<Начало>, ]<Конец>[, <Шаг>]) Первый параметр задает начальное значение. Если параметр <Начало> не указан, то по умолчанию используется значение 0. Во втором параметре указывается конечное значение. Следует заметить, что оно не входит в возвращаемые значения. Если параметр <Шаг> не указан, то используется значение 1. Функция возвращает диапазон – особый объект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый элемент списка на 2: arr = [1, 2, 3] for i in range (len (arr) ) : arr[i] *= 2 print (arr) # вывод [2,4,6] Цикл while Выполнение инструкций в цикле while продолжается до тех пор, пока логическое выражение истинно. Он имеет следующий формат: while <Условие> : <Инструкции> [else: <Блок, выполняемый, если не использовался оператор break> ] Последовательность работы цикла while следующая. Инструкции внутри цикла выполняются пока условие истинно. При этом истинность условия проверяется перед каждой итерацией цикла. Выход из цикла осуществляется либо если условие не прошло очередную проверку на истинность, что может случиться и на входе в цикл, либо если встречается оператор break. Опционально можно дополнить цикл while, блоком else, инструкции в котором выполнятся по завершении цикла, при условии, что не сработал оператор break. В отличии от цикла for, единственная возможность которого пробежаться по итерируемому объекту, цикл while позволяет писать циклы, выход из которых осуществляется при более сложных обстоятельствах. 12 В качестве примера, рассмотрим поиск наибольшего общего знаменателя методом Эвклида, итерации которого выполняются до тех пор, пока наименьшее из чисел не равно нулю. x, y = 60, 48 while y: x, y = y, x % y print(x) # вывод 12 Нередко цикл while комбинируют с счетчиком. Тогда он принимает следующий формат: <3адание начального значения для переменной - счетчика> while <Условие> : <Инструкции> <Приращение значения в переменной - счетчике> [else: <Блок, выполняемый, если не использовался оператор break> ] Последовательность его работы сводится к: 1. Переменной-счетчику присваивается начальное значение. 2. Проверяется условие, если оно истинно, то выполняются инструкции внутри цикла, иначе выполнение цикла завершается. 3. Переменная-счетчик изменяется на величину, указанную в параметре <приращение>. 4. Переход к пункту 2. 5. Если внутри цикла не использовался оператор break, то после завершения выполнения цикла будет выполнен блок в инструкции else . Этот блок не является обязательным. Создадим пустой список и заполним его в цикле случайными числами: import random # модуль генерации случайных чисел c = [] i = 0 while i < 10: c.append(random.randint(0,100)) i += 1 print(c) Оператор continue позволяет перейти к следующей итерации цикла до завершения выполнения всех инструкций внутри цикла. В качестве примера выведем все числа от 1 до 100, кроме чисел от 5 до 10 включительно: for i in range(1,101): if 4 < i < 11 : continue # Переходим на следующую итерацию цикла print(i) Оператор break позволяет прервать выполнение цикла досрочно. Для примера выведем все числа от 1 до 100 еще одним способом: i = 1 while True: if i > 100: break # Прерываем цикл print(i) i += 1 Цикл while совместно с оператором break удобно использовать для получения неопределенного заранее количества данных от пользователя. В качестве примера просуммируем произвольное количество чисел: 13 print("Введите слово 'stop' для получения результата") summa = 0 while True: x = input("Введите число: ") if x == "stop": break # Выход из цикла x = int(x) # Преобразуем строку в число summa += x print("Сумма чисел равна:", summa) 8. Функции Функция в программировании представляет собой обособленный участок кода, который можно вызывать, обратившись к нему по имени, которым он был назван. При вызове происходит выполнение команд тела функции. Функции можно сравнить с небольшими программками, которые сами по себе, то есть автономно, не исполняются, а встраиваются в обычную программу. Нередко их так и называют – подпрограммы. Других ключевых отличий функций от программ нет. Функции также при необходимости могут получать и возвращать данные. Только обычно они их получают не с ввода (клавиатуры, файла и др.), а из вызывающей программы. Сюда же они возвращают результат своей работы. Существует множество встроенных в язык программирования функций. С некоторыми такими в Python мы уже сталкивались. Это print(), input(), int(), float(), str(), type(). Код их тела нам не виден, он где-то "спрятан внутри языка". Нам же предоставляется только интерфейс – имя функции. С другой стороны, программист всегда может определять свои функции. Их называют пользовательскими. В языке программирования Python функции определяются с помощью оператора def . Рассмотрим код: def count_food(): a = int(input()) b = int(input()) print("Всего", a+b, "шт.") Это пример определения функции. Как и другие сложные инструкции вроде условного оператора и циклов функция состоит из заголовка и тела. Заголовок оканчивается двоеточием и переходом на новую строку. Тело имеет отступ. Ключевое слово def сообщает интерпретатору, что перед ним определение функции. За def следует имя функции. Оно может быть любым, так же, как и всякий идентификатор. В программировании весьма желательно давать всему осмысленные имена. Так в данном случае функция названа "посчитать_еду" в переводе на русский. После имени функции ставятся скобки. В приведенном примере они пустые. Это значит, что функция не принимает никакие данные из вызывающей ее программы. Однако она могла бы их принимать, и тогда в скобках были бы указаны параметры этой функции. После двоеточия следует тело, содержащее инструкции, которые выполняются при вызове функции. Следует различать определение функции и ее вызов. В программном коде они не рядом и не вместе. Можно определить функцию, но ни разу ее не вызвать. Нельзя вызвать функцию, которая не была определена. Определив функцию, но ни разу не вызвав ее, вы никогда не выполните ее тела. 14 def count_food(): a = int(input()) b = int(input()) print("Всего", a+b, "шт.") print("Сколько бананов и ананасов для обезьян?") count_food() print("Сколько жуков и червей для ежей?") count_food() print("Сколько рыб и моллюсков для выдр?") count_food() В языке Python определение функции должно предшествовать ее вызовам. Это связано с тем, что интерпретатор читает код строка за строкой и о том, что находится ниже по течению, ему еще неизвестно. Поэтому если вызов функции предшествует ее определению, то возникает ошибка (выбрасывается исключение NameError ). Польза функций не только в возможности многократного вызова одного и того же кода из разных мест программы. Не менее важно, что благодаря им программа обретает истинную структуру. Функции как бы разделяют ее на обособленные части, каждая из которых выполняет свою конкретную задачу. Функции могут передавать какие-либо данные из своих тел в основную ветку программы. Говорят, что функция возвращает значение. В большинстве языков программирования, в том числе Python, выход из функции и передача данных в то место, откуда она была вызвана, выполняется оператором return . Если интерпретатор Питона, выполняя тело функции, встречает return , то он "забирает" значение, указанное после этой команды, и "уходит" из функции. def cylinder(): r = float(input()) h = float(input()) # площадь боковой поверхности цилиндра: side = 2 * 3.14 * r * h # площадь одного основания цилиндра: circle = 3.14 * r**2 # полная площадь цилиндра: full = side + 2 * circle return full square = cylinder() print(square) В Питоне позволительно возвращать из функции несколько объектов, перечислив их через запятую после команды return: def cylinder(): r = float(input()) h = float(input()) side = 2 * 3.14 * r * h circle = 3.14 * r**2 full = side + 2 * circle return side, full sCyl, fCyl = cylinder() print("Площадь боковой поверхности %.2f" % sCyl) print("Полная площадь %.2f" % fCyl) Из функции cylinder() возвращаются два значения. Первое из них присваивается переменной sCyl, второе – fCyl. Фокус здесь в том, что перечисление значений через запятую (например, 10, 15, 19) создает объект типа tuple. На русский переводится как "кортеж". Когда же кортеж присваивается сразу нескольким переменным, то происходит сопоставление его элементов соответствующим в очереди переменным. Это называется распаковкой. 15 Таким образом, когда из функции возвращается несколько значений, на самом деле из нее возвращается один объект класса tuple. Перед возвратом эти несколько значений упаковываются в кортеж. Если же после оператора return стоит только одна переменная или объект, то ее/его тип сохраняется как есть. Функции могут не только возвращать данные, но также принимать их, что реализуется с помощью так называемых параметров, которые указываются в скобках в заголовке функции. Количество параметров может быть любым. Параметры представляют собой локальные переменные, которым присваиваются значения в момент вызова функции. Конкретные значения, которые передаются в функцию при ее вызове, называются аргументами. Когда функция вызывается, то ей передаются фактические значения аргументов. Т.е. переменным-параметрам присваиваются переданные в функцию значения. Соответственно, изменение значений в теле функции никак не скажется на значениях фактических переменных. Они останутся прежними. В Python такое поведение характерно для неизменяемых типов данных, к которым относятся, например, числа и строки. Существуют изменяемые типы данных. Для Питона, это, например, списки и словари. В этом случае данные передаются по ссылке. В функцию передается ссылка на них, а не сами данные. И эта ссылка связывается с локальной переменной. Изменения таких данных через локальную переменную обнаруживаются при обращении к ним через глобальную. Это есть следствие того, что несколько переменных ссылаются на одни и те же данные, на одну и ту же область памяти. Необходимость передачи по ссылке связана в первую очередь с экономией памяти. Сложные типы данных, по сути представляющие собой структуры данных, обычно копировать не целесообразно. Однако, если надо, всегда можно сделать это принудительно. 9. Модули Встроенные в язык программирования функции доступны сразу. Чтобы их вызвать, не надо выполнять никаких дополнительных действий. Однако за время существования языка на нем было написано столько функций и классов, которые оказались востребованными множеством программистов и в разных областях, что включить весь этот объем кода в сам язык если возможно, то нецелесообразно. Чтобы разрешить проблему доступа к дополнительным возможностям языка, в программировании стало общепринятой практикой использовать так называемые модули, пакеты и библиотеки. Каждый модуль содержит коллекцию функций и классов, предназначенных для решения задач из определенной области. Так в модуле math языка Python содержатся математические функции, модуль random позволяет генерировать псевдослучайные числа, в модуле datetime содержатся классы для работы с датами и временем, модуль sys предоставляет доступ к системным переменным и т. д. Количество модулей для языка Python огромно, что связано с популярностью языка. |