Функции в Python

User Rating: 0 / 5

Функция в 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 в комментариях к статье и задавайте вопросы.

Яндекс.Метрика