День 5 конспект. Это фрагмент программного кода, который решает какуюлибо задачу
Скачать 310.75 Kb.
|
Функция — это фрагмент программного кода, который решает какую-либо задачу. Его можно вызывать в любом месте основной программы. Функции помогают избегать дублирования кода при многократном его использовании. Функции полезны при написании простых программ, а при создании программ более сложных, таких как компьютерные игры, функции просто необходимы — конечно, если вы планируете закончить программу быстрее, чем за сто лет. Для определения функции нужно всего лишь написать ключевое слово def перед ее именем, а после — поставить двоеточие. Следом идет блок инструкций. Имя этой функции — testfunc. У нее есть единственный аргумент — myname, а ее тело — это блок кода, идущий сразу после строки, которая начинается с def (сокращение от defi ne — определить). Аргумент — это специальная переменная, которая существует, только пока функция выполняется. Функцию testfunc можно запустить (или, как говорят программисты, вызвать), указав ее имя, а после него, в скобках, значение аргумента: Также можно создать функцию, которая принимает не один, а два, три или иное количество аргументов (либо, напротив, не принимает аргументы). Например, вот функция testfunc с двумя аргументами: В качестве аргументов можно указывать переменные (которые перед этим нужно создать): Зачастую из функции полезно вернуть какое-то значение. Это делается с помощью команды return. Например, представьте такую функцию для расчета сбережений: Эта функция принимает три аргумента. Вычисляя результат, она складывает первые два аргумента — pocket_money и paper_route, — а затем вычитает из полученного значения третий аргумент — spending. Команда return возвращает результат вычислений в ту часть кода, откуда функция была вызвана, и его можно сохранить в переменной (обычным способом, с помощью знака "=") либо вывести на экран: Переменные, созданные в теле функции, нельзя использовать после того, как эта функция завершит работу, поскольку они существуют только во время ее выполнения. В таких случаях программисты говорят, что область видимости переменных ограничена функцией. Рассмотрим простую функцию, которая использует внутренние переменные, но не принимает аргументы: Здесь в строке 1 мы создали функцию с именем variable_test, которая в строке 2 перемножает переменные first_variable и second_variable и возвращает результат. Вызвав эту функцию с помощью print, мы получили результат: 200. Однако, если попытаться за пределами функции вывести на экран значение first_variable (или second_variable), Python выдаст сообщение об ошибке. У переменных, созданных вне тела функции, область видимости дру- гая. Например, давайте создадим перед определением нашей функции переменную, а затем используем ее в теле функции: Хотя переменные first_variable и second_variable вне тела функции недоступны, переменную another_variable (созданную за пределами функции — в строке 1) можно использовать и в теле функции — в строке 2. Вот что получится при вызове этой функции: Функции были созданы ради возможности их многократного применения. Код без функций превратился бы в огромное нечитаемое полотно, на порядки превышающее по длине аналогичную программу с их использованием. Разбитие больших и сложных процессов на простые составляющие — важная часть, как кодинга, так и реальной жизни. В повседневности мы занимаемся этим неосознанно. Когда убираемся в квартире, мы пылесосим, моем полы и окна, очищаем поверхности от пыли и наводим блеск на всё блестящее. Всё это — составляющие одного большого процесса под названием "уборка", но каждую из них также можно разбить на более простые подпроцессы. В программировании модульность строится на использовании функций. Для каждой подзадачи — своя функция. Такая компоновка в разы улучшает читабельность кода и уменьшает сложность его дальнейшей поддержки. Допустим, мы работаем с базой данных. Нам нужна программа, которая считывает значения из базы, обрабатывает их, выводит результат на экран, а затем записывает его обратно в базу. Без применения модульности получится сплошная последовательность инструкций: Но если вынести каждую операцию в отдельную функцию, то текст главной программы получится маленьким и аккуратным., Практика Простой пример: Вы торгуете мёдом, и после каждой продажи вам нужно печатать чек. В нём должно быть указано: название фирмы, дата продажи, список наименований проданных товаров, их количество, цены, общая сумма, а также сакраментальная фраза "Спасибо за покупку!". Если не пользоваться функциями, всё придётся прописывать вручную. В простейшем случае программа будет выглядеть так: А теперь представьте, что произойдёт, когда вы раскрутитесь, и покупатели станут приходить один за другим. В таком случае, чеки надо будет выдавать очень быстро. Но что делать, если вдруг нагрянет ваш любимый клиент и купит 10 сортов мёда в разных количествах? Далеко не все в очереди согласятся ждать, пока вы посчитаете общую сумму и внесёте её в чек. Хорошо, что данный процесс можно легко оптимизировать с использованием функций. Встаёт резонный вопрос: где же обещанное упрощение и куда подевались товары? Как раз для этого, мы и будем описывать состав покупки не напрямую в функции, а в отдельном списке кортежей. Каждый кортеж состоит из трёх элементов: название товара, количество и цена. Теперь этот список передадим в функцию как аргумент, и самостоятельно считать больше не придётся. print_check(honey_positions) Да, код стал более массивным. Однако теперь для печати чека вам не придётся самостоятельно вычислять итог. Достаточно лишь изменить количество и цену товаров в списке. Существенная экономия времени! Слава функциям! Теперь представьте, что вы строите звездолет из экономичных материалов, например банок из-под газировки. Вы планируете сооружать его постепенно, расплющивая по 2 банки в неделю, а всего потребуется около 500 банок. Мы можем написать функцию для расчета времени, которое понадобится, чтобы расплющить 500 банок, если считать, что в неделю вы справляетесь с двумя. Пусть наша функция выводит общее количество расплющенных банок для каждой недели от начала строительства звездолета в течение года. Количество банок в неделю мы будем передавать в аргументе: В первой строке этой функции мы создаем переменную total_cans, присваивая ей значение 0. Затем мы делаем цикл по неделям в году, на каждом шаге прибавляя к total_cans количество банок, расплющенных за неделю. Весь этот блок кода и есть тело нашей функции. При этом в функции есть еще один блок, находящийся внутри первого: это две последние строки кода, составляющие тело цикла for. Введем код этой функции в окне оболочки и попробуем вызывать ее с разными значениями аргумента (для разного количества расплющенных банок в неделю): |