Функция в Python как и в большинстве других языков программирования представляет собой объединение операторов (или может содержать вообще один оператор), выполняющих какую-то общую задачу. Функция в Python задаётся с помощью ключевого слова def, после которого идёт имя функции и опционально список её входных параметров. Параметры функции задают какие-то входные данные, необходимые для работы операторов функции, и управляют логикой её выполнения.
Посмотрим на небольшой пример скрипта Python, в котором определим функцию с именем get_argument_description:
def get_argument_description(param=None):
if isinstance(param, int) or isinstance(param, str):
if isinstance(param, str):
if param.isnumeric():
param = int(param)
else:
return "Вы ввели не число, а что-то другое"
if param > 0:
return "Вы ввели положительное число"
elif param == 0:
return "Вы ввели ноль"
elif param < 0:
return "Вы ввели отрицательное число"
else:
return "Вы ввели не число, а что-то другое"
if __name__ == '__main__':
x = input("Введите значение для x: ")
print(get_argument_description(x))
print(f'Программа завершилась!')
Всё, что делает наша функция get_argument_description, - это возвращает текстовое описание для входного параметра param. Причём в этом примере мы не задаём строго тип входного параметра param. Он неявно равен типу данных Any, т.е. может быть числом, строкой или каким-то другим типом данных. Обратите внимание на конструкцию param=None. Она задаёт так называемое значение по умолчанию для входного параметра param. Ключевое слово None используется в Python для обозначения отсутствия значения. Это позволяет вызывать нашу функцию как с передачей значения параметра, так и без параметра. Попробуйте позапускать этот скрипт несколько раз и вводить разные значения - положительные числа, ноль или отрицательные числа. Попробуйте также ввести вообще не число, а какую-то строку текста. Во всех случаях на экран будет выведено соответствующее описание того, что именно было введено с клавиатуры, т.е. параметра param, который использует функция.
В данном примере в строке print(get_argument_description(x)) мы выводим на экран описание для того значения, которое было введено с клавиатуры. Чтобы убедиться в том, что входной параметр функции является в данном случае опциональным, попробуйте вызвать функцию, не передавая ей никакого значения вообще и тоже вывести результат функции на экран:
if __name__ == '__main__':
print(get_argument_description())
print(f'Программа завершилась!')
Если def определяет саму функцию и её тело (т.е. входящие в функцию операторы), то вызовами функции являются как раз строки print(get_argument_description(x)) и print(get_argument_description()) из второго примера. Вызывая функцию, мы по сути передаём управление этой функции, в результате чего выполняются все входящие в неё операторы.
Обратите внимание ещё и на операторы isinstance, которые указаны в операторе if в самом начале нашей функции. Этот оператор позволяет проверить тип данных для переданного ему аргумента. В нашем случае мы сначала проверяем, что param является числом (тип int) или строкой (тип str). Если это окажется не так, то мы сразу уйдем в блок else, в котором вернём в качестве результата функции строку "Вы ввели не число, а что-то другое". Если входной параметр - это строка или число, то мы дополнительно проверяем, что если это строка, то она должна содержать только цифры - это достигается за счёт вызова функции isnumeric(), доступной для всех строк. Если строка точно содержит только цифры, мы дополнительно явным образом преобразуем входной параметр к типу int (это необходимо, чтобы далее проверить число и определить, что оно больше, меньше или равно нулю):
# ...
if param.isnumeric():
param = int(param)
else:
return "Вы ввели не число, а что-то другое"
# ...
Возврат значения из функции, как вы уже поняли, производится с помощью ключевого слова и оператора return, который расставляется в тех участках кода функции, где нам требуется вернуть обратно управление в ту часть программы, откуда происходил вызов функции.
Если вы ничего не хотите возвращать из функции, а просто желаете исполнить какой-то набор операторов, то указывать оператор return не обязательно. Ниже показан пример простейшей функции, которая ничего не возвращает, а просто выводит сообщение на экран консоли:
def simple_func_without_return_type():
print(f'Сегодня прекрасный день, не так ли?')
if __name__ == '__main__':
simple_func_without_return_type()
При отсутствии явно указанного оператора return для функции, она возвращает значение None. Попробуйте сами убедиться в этом, выведя результат работы simple_func_without_return_type() на экран консоли.
Если вы не укажете для входных параметров функции значений по умолчанию, то эти параметры будут считаться обязательными для вызова функции. Давайте перепишем нашу изначальную функцию и сделаем её входной параметр param обязательным:
def get_argument_description(param):
if isinstance(param, int) or isinstance(param, str):
if isinstance(param, str):
if param.isnumeric():
param = int(param)
else:
return "Вы ввели не число, а что-то другое"
if param > 0:
return "Вы ввели положительное число"
elif param == 0:
return "Вы ввели ноль"
elif param < 0:
return "Вы ввели отрицательное число"
else:
return "Вы ввели не число, а что-то другое"
Здесь мы убрали часть =None для параметра param, в результате чего он становится обязательным. Теперь такой вариант вызова без передачи значения параметра приведёт к ошибке:
if __name__ == '__main__':
print(get_argument_description())
print(f'Программа завершилась!')
При запуске скрипта вы увидите на экране консоли нечто подобное:
Traceback (most recent call last):
File "C:/Users/компьютер/PycharmProjects/allineed_samples/main.py", line 159, in <module>
print(get_argument_description())
TypeError: get_argument_description() missing 1 required positional argument: 'param'
Process finished with exit code 1
Именованные аргументы функций
Функции в Python могут быть вызваны с использованием именованных аргументов. Например, мы можем вызвать нашу функцию get_argument_description следующим образом:
if __name__ == '__main__':
x = input("Введите значение для x: ")
print(get_argument_description(param=x))
Обратите здесь внимание, что мы добавили часть param=, таким образом явно присваивая аргументу функции param значение переменной x, где хранится наш ввод с клавиатуры.
Передача произвольного количества аргументов в функцию
Язык Python также поддерживает отличную возможность передавать в функцию произвольное количество аргументов. В этом случае аргументы функции будут упакованы в кортеж (англ. tuple). Рассмотрим, как это работает на примере:
def my_vararg_function(*args):
"""Это пример функции, принимающей произвольное количество параметров"""
if args is ():
print('Вы не передали никаких параметров')
elif len(args) > 0:
print(f'Количество параметров, переданных в функцию: {len(args)}')
for p in args:
print(f'Параметр: {p}')
if __name__ == '__main__':
my_vararg_function(1, 2, 3, 4, "one", "two")
my_vararg_function()
Здесь мы определили функцию с именем my_vararg_function, в списке её параметров указали *args с помощью символа звёздочки ( * ). Эта форма записи как раз говорит о том, что функция может принимать произвольное количество аргументов. Как видим в первом вызове функции мы передаём в качестве аргументов четыре числа и две строки. Во втором вызове вызываем функцию без каких-либо аргументов. Результат работы такого скрипта на консоли:
Количество параметров, переданных в функцию: 6
Параметр: 1
Параметр: 2
Параметр: 3
Параметр: 4
Параметр: one
Параметр: two
Вы не передали никаких параметров
Мы с вами рассмотрели понятие функций и основные возможности функций в языке Python. Попробуйте в качестве практики написать свою функцию my_avg_arithmetic, которая принимает произвольное количество аргументов, вычисляет их среднее арифметическое и выводит его на экран консоли. Также делитесь своим опытом работы с функциями в Python в комментариях к статье и задавайте вопросы.
Примеры из этой статьи: https://github.com/AllineedRu/PythonExamples/blob/main/ain_functions/__init__.py