Функция – это мини-программа внутри основной программы. Код такой подпрограммы отвечает за решение определенной задачи: например, в игре Тетрис будут отдельные функции для подсчета очков, рисования игрового поля, движения фигурки и так далее. Использование функций позволяет:
- ограничить область видимости переменных функциями, которые их используют;
- исключить дублирование кода;
- разбить большую и сложную программу на небольшие мини-программы, которые можно вызывать в нужный момент;
- выстроить простую и понятную структуру программы – такой код удобнее дебажить и поддерживать.
У функций есть несколько особенностей:
- Функция выполняется только тогда, когда ее вызывает основная программа.
- В функцию можно передавать различные данные. Параметры – это переменные, которые используются при объявлении функции, аргументы – фактические значения, которые передаются переменным при вызове функции.
- Функции могут передавать результаты своей работы в основную программу или в другие функции.
Функции в Python
Python работает со встроенными и пользовательскими функциями. Встроенные функции – это уже знакомые нам print(), input(), map(), zip() и так далее. Пользовательские функции, в свою очередь, делятся на:
- Рекурсивные (вызывают сами себя до тех пор, пока не будет достигнут нужный результат).
- Анонимные, или лямбда-функции (объявляются в любом участке кода и сразу же вызываются).
- Все остальные функции, которые определены пользователем и не относятся ни к рекурсивным, ни к анонимным.
В этой статье мы рассмотрим пользовательские функции с различными типами параметров, а в последующих статьях разберем анонимные и рекурсивные функции.
Объявление и вызов функций в Python
Для создания функции используют ключевое слово def
. Вот пример простейшей функции, которая не получает и не возвращает никаких данных – просто выполняет одну команду по выводу строки с приветствием:
Для вызова такой функции достаточно написать ее название:
Результат вызова:
А это пример простейшей функции с параметром:
При вызове функция получает аргумент:
Результат вызова:
При вызове функция ожидает получить набор значений, соответствующий числу параметров. К примеру, эта функция должна получить при вызове два позиционных аргумента – имя и фамилию:
Если передать в функцию два аргумента – my_function('Егор', 'Куликов')
, результат вызова будет таким:
Но если число аргументов окажется меньше числа параметров – my_function('Алена')
, возникнет ошибка:
Порядок обработки позиционных аргументов
Python обрабатывает позиционные аргументы слева направо:
Вывод:
Аргументы по умолчанию
Функция может использовать аргументы по умолчанию – они указываются после позиционных:
Именованные аргументы
Помимо позиционных, в функцию можно передать именованные аргументы, причем порядок передачи именованных аргументов при вызове функции может не совпадать с порядком параметров:
Вывод:
Произвольное количество позиционных аргументов *args
До сих пор мы передавали в функцию определенное, заранее известное число позиционных аргументов. Если в функцию нужно передать произвольное количество
аргументов, используют *args
:
Результат вызова:
При использовании *args
функция получает кортеж аргументов, и к ним можно обращаться так же, как к элементам кортежа:
Результат вызова:
Название набора параметров, *args, используется по умолчанию. При
желании его можно изменить на любое другое название с *
в начале:
Результат вызова:
Аргументы *args
обрабатываются после позиционных, но до аргументов по умолчанию:
Вывод:
Произвольное количество именованных аргументов **kwargs
Как уже было отмечено выше, именованные аргументы передаются в функцию в виде пар ключ=значение
:
Результат вызова:
В приведенном выше примере количество именованных аргументов известно заранее. Если в функцию нужно передать произвольное количество пар
ключ=значение
, используют параметр **kwargs
. С **kwargs
работают все методы словарей:
Результат вызова:
Как и в случае с *args, название по умолчанию **kwargs при желании можно заменить на любое другое с **
в начале:
Результат вызова:
Аргументы типа **kwargs
обрабатываются после позиционных, *args
и аргументов по умолчанию:
Вывод:
Передача аргументов в виде списка
Помимо кортежей и словарей, в функции можно передавать списки:
Результат вызова:
Заглушка pass
Тело функции не может быть пустым – это приведет к сообщению об ошибке:
Если по какой-то причине нужно оставить тело функции пустым, используют оператор pass
, который выступает в роли заглушки:
Функции с возвратом значений
Как уже было показано выше, функции могут получать и обрабатывать любые типы данных – строки, числа, списки, кортежи, словари. Результат обработки можно получить с помощью оператора return. Эта функция возвращает произведение произвольного количества значений:
Значения передаются в функцию при вызове – print(my_function(5, 6, 3, 11))
. Результат при таком наборе цифр будет равен 990
. Оператор return может возвращать любое количество значений, причем значения возвращаются в виде кортежа:
Пример ввода:
Вывод:
Функция может содержать любое количество return
. Эта функция возвращает различные оценки индекса массы тела:
Пример ввода:
Вывод:
Однако эту функцию можно переписать так, чтобы использовался только один оператор return
:
Практика
Задание 1
Напишите функцию для вывода треугольника. Функция принимает два аргумента – size (размер сторон треугольника) и symb (символ, используемый для заполнения треугольника).
Пример ввода:
Вывод:
Решение:
Задание 2
Напишите функцию, которая принимает произвольное количество
целых чисел, и возвращает среднее арифметическое без использования встроенных
функции sum()
и len()
.
Пример вызова:
Вывод:
Решение:
Задание 3
Напишите функцию, которая:
- принимает строку, состоящую из букв, цифр и специальных символов;
- формирует три списка – 1) из цифр, 2) из букв, 3) из спецсимволов;
- выводит списки на экран.
Пример ввода:
Вывод:
Решение:
Задание 4
Напишите функцию, которая начисляет новогодние премии сотрудникам. Эта функция:
- имеет два аргумента по умолчанию –
salary=120000
иbonus=10
(оклад и премия); - получает два позиционных аргумента
name
иlast_name
– имя и фамилию сотрудника; - учитывает индивидуальные оклад и премию (см. примеры вызова);
- выводит размер новогодней премии для сотрудника и зарплату с учетом премии.
Примеры вызова функции:
Вывод:
Решение:
Задание 5
Напишите программу, которая выводит Есть
, если в полученной от
пользователя строке есть хотя бы одно совершенное
число, равное сумме своих делителей, и Нет
в обратном случае.
Пример ввода:
Вывод:
Решение:
Задание 6
Напишите функцию, которая принимает два позиционных
аргумента – натуральные числа n и k,
и возвращает значение биномиального
коэффициента, не используя math.factorial()
.
Пример ввода:
Вывод:
Решение:
Задание 7
Напишите функцию, которая принимает число от 1 до 99, и возвращает его словесное описание.
Пример ввода:
Вывод:
Решение:
Задание 8
Напишите функцию, которая возвращает True
, если введенная пользователем дата
является магической, и False
в обратном случае. Магической считается дата, в которой
произведение дня и месяца равно двум последним цифрам года: 02.11.2022.
Пример ввода:
Вывод:
Решение:
Задание 9
Напишите функцию, которая принимает произвольное количество именованных аргументов, и формирует из них строку запроса. Аргументы в строке запроса должны быть отсортированы в алфавитном порядке.
Примеры вызова:
Вывод:
Решение:
Задание 10
Напишите функцию, которая принимает целое число n, и выводит на экран спиральную матрицу размера n x n, все элементы которой выровнены по левому краю.
Пример ввода:
Вывод:
Решение:
Подведем итоги
В этой статье мы научились создавать пользовательские
функции и передавать в них определенное число позиционных и именованных
аргументов, а также произвольное количество значений *args
и **kwargs
.
В следующей статье будем разбирать анонимные лямбда-функции.
Содержание самоучителя
- Особенности, сферы применения, установка, онлайн IDE
- Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
- Типы данных: преобразование и базовые операции
- Методы работы со строками
- Методы работы со списками и списковыми включениями
- Методы работы со словарями и генераторами словарей
- Методы работы с кортежами
- Методы работы со множествами
- Особенности цикла for
- Условный цикл while
- Функции с позиционными и именованными аргументами
- Анонимные функции
- Рекурсивные функции
- Функции высшего порядка, замыкания и декораторы
- Методы работы с файлами и файловой системой
- Регулярные выражения
- Основы скрапинга и парсинга
- Основы ООП: инкапсуляция и наследование
- Основы ООП – абстракция и полиморфизм
- Графический интерфейс на Tkinter
- Основы разработки игр на Pygame
- Основы работы с SQLite
- Основы веб-разработки на Flask
- Основы работы с NumPy
- Основы анализа данных с Pandas
Комментарии