Для того чтобы вывести строку документации некоторой функции, вам следует вызвать функцию help(). Передайте ей имя функции, чтобы получить список всех аргументов и красиво отформатированную строку документации:
>>> help(echo)
Help on function echo in module __main__:
echo(anything)
····echo returns its input argument
Если вы хотите увидеть только строку документации без форматирования:
>>> print(echo.__doc__)
echo returns its input argument
Подозрительно выглядящая строка __doc__ является внутренним именем строки документации как переменной внутри функции. В пункте «Использование _ и __ в именах» в разделе «Пространства имен и область определения» данной главы объясняется причина появления всех этих нижних подчеркиваний.
Функции — это объекты первого класса
Я уже упоминал мантру Python: объектами является все, включая числа, строки, кортежи, списки, словари и даже функции. Функции в Python являются объектами первого класса. Вы можете присвоить их переменным, использовать как аргументы для других функций и возвращать из функций. Это дает вам возможность решать с помощью Python такие задачи, справиться с которыми средствами многих других языков сложно, если не невозможно.
Для того чтобы убедиться в этом, определим простую функцию answer(), которая не имеет аргументов и просто выводит число 42:
>>> def answer():
…·····print(42)
Вы знаете, что получите в качестве результата, если запустите эту функцию:
>>> answer()
42
Теперь определим еще одну функцию с именем run_something. Она имеет один аргумент, который называется func и представляет собой функцию, которую нужно запустить. Эта функция просто вызывает другую функцию:
>>> def run_something(func):
…·····func()
Если мы передадим answer в функцию run_something(), то используем ее как данные, прямо как и другие объекты:
>>> run_something(answer)
42
Обратите внимание: вы передали строку answer, а не answer(). В Python круглые скобки означают «вызови эту функцию». Если скобок нет, Python относится к функции как к любому другому объекту. Это происходит потому, что, как и все остальное в Python, функция является объектом:
>>> type(run_something)
Попробуем запустить функцию с аргументами. Определим функцию add_args(), которая выводит на экран сумму двух числовых аргументов, arg1 и arg2:
>>> def add_args(arg1, arg2):
…·····print(arg1 + arg2)
Чем является add_args()?
>>> type(add_args)
Теперь определим функцию, которая называется run_something_with_args() и принимает три аргумента:
• func — функция, которую нужно запустить;
• arg1 — первый аргумент функции func;
• arg2 — второй аргумент функции func:
>>> def run_something_with_args(func, arg1, arg2):
…·····func(arg1, arg2)
Когда вы вызываете функцию run_something_with_args(), та функция, что передается вызывающей стороной, присваивается параметру func, а переменные arg1 и arg2 получают значения, которые следуют далее в списке аргументов. Вызов func(arg1, arg2) выполняет данную функцию с этими аргументами, потому что круглые скобки указывают Python сделать это.
Проверим функцию run_something_with_args(), передав ей имя функции add_args и аргументы 5 и 9:
>>> run_something_with_args(add_args, 5, 9)
14
Внутри функции run_something_with_args() аргумент add_args, представляющий собой имя функции, был присвоен параметру func, 5 — параметру arg1, а 9 — параметру arg2. В итоге получается следующая конструкция:
add_args(5, 9)
Вы можете объединить этот прием с использованием *args и **kwargs.
Определим тестовую функцию, которая принимает любое количество позиционных аргументов, определяет их сумму с помощью функции sum() и возвращает ее:
>>> def sum_args(*args):
…····return sum(args)
Я не упоминал функцию sum() ранее. Это встроенная в Python функция, которая высчитывает сумму значений итерабельного числового (целочисленного или с плавающей точкой) аргумента.
Мы определим новую функцию run_with_positional_args(), принимающую функцию и произвольное количество позиционных аргументов, которые нужно будет передать в нее:
>>> def run_with_positional_args(func, *args):
…····return func(*args)
Теперь вызовем ее:
>>> run_with_positional_args(sum_args, 1, 2, 3, 4)
10
Вы можете использовать функции как элементы списков, кортежей, множеств и словарей. Функции неизменяемы, поэтому вы можете даже применять их как ключи для словарей.
Внутренние функции