Функции как объекты
Все данные в программе Python представлены объектами или отношениями между объектами. Такие вещи, как строки, списки, модули и функции, являются объектами. В Python нет ничего особенного в функциях.
Так как функция в Python является объектом, ее можно присвоить другой переменной, как и любому другому объекту:
def hello(name): return f'Hello name>.' >>> say = hello
Строка say = hello не вызывает функцию. Он принимает объект функции, на который ссылается hello и создает второе имя say указывающее на нее. Теперь можно выполнить объект базовой функции hello , вызвав say :
>>> say('World') # 'Hello World.'
Функциональные объекты и их имена являются двумя разными вещами. Вот еще одно доказательство: можно удалить исходное имя функции hello . Другое имя say по-прежнему указывает на базовую функцию hello и ее можно вызвать через функцию say :
>>> del hello >>> hello('World') # Traceback (most recent call last): # File "", line 1, in # NameError: name 'hello' is not defined >>> say('World') # 'Hello World.'
Python присоединяет строковый идентификатор к каждой функции во время создания для целей отладки. Можете получить доступ к этому внутреннему идентификатору с помощью атрибута __name__ или __qualname__ :
>>> say.__name__ 'hello' >>> say.__qualname__ 'hello'
Хотя атрибут __name__ функции say() все еще hello , это не повлияет на то, как можно получить к ней доступ из кода. Этот атрибут является просто средством отладки. Переменная, указывающая на функцию и имя самой функции две разные вещи.
Также можно вызывать несколько функций внутри однострочника if/else .
def add(a, b): return a + b def subtract(a, b): return a - b >>> a, b = 4, 5 >>> (subtract if a > b else add)(a, b) # 9
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Функции это объекты
- Функции могут иметь атрибуты
- Функции могут храниться в структурах данных
- Функции могут быть вложенными
- Передача функции в качестве аргумента другой функции
- Область видимости переменных функции
- Операторы global и nonlocal
- Параметры (аргументы) функции
- Ключевые аргументы в определении функции Python
- Значение аргумента по умолчанию в функциях Python
- Варианты передачи аргументов в функцию Python
- Переменные аргументов *args и **kwargs в функции Python
- Распаковка аргументов для передачи в функцию Python
- Как оцениваются аргументы при вызове функции?
- Строгие правила передачи аргументов в функцию Python
- Инструкция return
- Анонимные функции (lambda-выражения)
- Строки документации в функциях Python
- Рекурсия
- Замыкания в функциях Python
- Перегрузка функций
Функции и их аргументы

В этой статье я планирую рассказать о функциях, именных и анонимных, инструкциях def, return и lambda, обязательных и необязательных аргументах функции, функциях с произвольным числом аргументов.
Именные функции, инструкция def
Функция в python — объект, принимающий аргументы и возвращающий значение. Обычно функция определяется с помощью инструкции def.
Определим простейшую функцию:
Инструкция return говорит, что нужно вернуть значение. В нашем случае функция возвращает сумму x и y.
Теперь мы ее можем вызвать:
Функция может и не заканчиваться инструкцией return, при этом функция вернет значение None:Функция может принимать произвольное количество аргументов или не принимать их вовсе. Также распространены функции с произвольным числом аргументов, функции с позиционными и именованными аргументами, обязательными и необязательными.
Функция также может принимать переменное количество позиционных аргументов, тогда перед именем ставится *:
Как видно из примера, args - это кортеж из всех переданных аргументов функции, и с переменной можно работать также, как и с кортежем.Функция может принимать и произвольное число именованных аргументов, тогда перед именем ставится **:
В переменной kwargs у нас хранится словарь, с которым мы, опять-таки, можем делать все, что нам заблагорассудится.
Анонимные функции, инструкция lambda
Анонимные функции могут содержать лишь одно выражение, но и выполняются они быстрее. Анонимные функции создаются с помощью инструкции lambda. Кроме этого, их не обязательно присваивать переменной, как делали мы инструкцией def func():
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Функции высшего порядка — Python: Функции
Функции высшего порядка — это важная концепция в Python. В Python все является объектом, включая функции. Это означает, что функции можно передавать в качестве аргументов другим функциям как и любой другой объект.
Функции, которые можно передавать в качестве аргументов или возвращать из других функций, известны как объекты первого класса или граждане первого класса.
В этом уроке мы научимся работать с объектами первого класса, функциями высшего порядка и лямбда-функциями.
Объекты первого класса
В Python функции являются объектами первого класса. Это означает, что их можно передавать в качестве аргументов другим функциям, возвращать как значения из других функций и хранить в переменных или структурах данных как любой другой объект. Это позволяет использовать функции как строительные блоки для более сложных программ.
Напишем пример, чтобы посмотреть, как функции используются в качестве объекта первого класса:
hello(name): print(f"Hello, name>!") greeting_function = hello greeting_function("Hexlet") # "Hello, Hexlet!"defВ этом примере мы определяем функцию hello , которая принимает один аргумент и печатает приветствие. Затем мы присваиваем функцию переменной greeting_function и вызываем ее с аргументом.
Рассмотрим другой пример с передачей функции в качестве аргумента другой функции:
apply_function(numbers, function): results = [] for number in numbers: result = function(number) results.append(result) return results def square(number): return number ** 2 numbers = [1, 2, 3, 4, 5] squared_numbers = apply_function(numbers, square) print(squared_numbers) # [1, 4, 9, 16, 25]def
В этом примере функция apply_function принимает в качестве аргументов список чисел и функцию. Функция apply_function применяет переданную функцию к каждому числу в списке и возвращает новый измененный список. Функция square возводит число в квадрат, и используется в качестве аргумента функции apply_function .
Объекты первого класса также позволяют возвращать функции из другой функции:
def make_multiplier(n): def multiplier(x): return x * n return multiplier times_2 = make_multiplier(2) times_3 = make_multiplier(3) print(times_2(5)) # 10 print(times_3(5)) # 15
В этом примере функция make_multiplier принимает число n и возвращает новую функцию, которая умножает свой аргумент на n . Затем эта функция применяется, чтобы создать две новые функции times_2 и times_3 , которые умножают свой аргумент на 2 и 3 соответственно. В итоге вызывается функция с аргументом 5, чтобы увидеть их результаты.
Функции высшего порядка
Функции, которые принимают другие функции в качестве аргументов и/или возвращают функции в качестве результатов, называются функциями высшего порядка или ФВП. Их можно использовать для инкапсуляции многократно используемого поведения и создания более абстрактного кода, о котором легче рассуждать.
Например, встроенные функции map и filter в Python являются функциями высшего порядка, которые работают с итерируемыми объектами и применяют функцию к каждому элементу итерируемого объекта.
Рассмотрим следующий пример функции высшего порядка:
def repeat(func, n): for i in range(n): func() def hello(): print("Hello, world!") repeat(hello, 3)
Вывод будет следующим:
Этот код использует функцию repeat() для многократного вызова функции hello() .
Рассмотрим другой пример с возвратом функции:
def double(function): def inner(argument): return function(function(argument)) return inner def multiply_by_five(x): return x * 5 double(multiply_by_five)(3) # 75
В этом примере в теле функции double создается функция inner и возвращается в роли результата. Так как вызов double возвращает функцию, мы можем сразу сделать второй вызов ( (3) ). Он уже даст результат двойного применения исходной функции к аргументу.
Имя inner довольно часто используется, чтобы называть функции, которые создаются на лету внутри внешней функции.
Но мы могли бы и не вызвать функцию-значение сразу, а вместо этого сохранить в переменную:
multiply_by_25 = double(multiply_by_five) multiply_by_25 # .inner at 0x7fd1975c58c8> multiply_by_25(1) # 25 multiply_by_625 = double(multiply_by_25) multiply_by_625 # .inner at 0x7fd1968f41e0> multiply_by_625(1) # 625
При выводе значения ссылки multiply_by_25 отображается double..inner — та самая созданная на лету функция inner . И в случае multiply_by_625 функция называется inner , но адрес в памяти другой — большое шестнадцатеричное число после "at".
Одним из полезных применений функций высшего порядка является использование их для определения анонимных функций — лямбда-функций.
Лямбда-функции
В Python лямбда функция — это небольшая анонимная функция, которая может быть определена без имени. Лямбда-функции часто используются там, где требуется небольшая, одноразовая функция. Синтаксис для определения лямбда-функции в Python следующий:
lambda arguments: expression
Здесь arguments — это список входных аргументов функции, который разделен запятыми. А expression — это тело функции, значение которой возвращает лямбда-функция.
Например, лямбда-функция, которая принимает два аргумента и возвращает их сумму, может быть определена следующим образом:
sum = lambda x, y: x + y
Это создает лямбда-функцию, которая принимает два аргумента x и y и возвращает их сумму. Затем лямбда-функцию можно вызывать как любую другую функцию:
result = sum(2, 3) print(result) # 5
Лямбда-функции также можно использовать в сочетании с другими функциями, такими как map , filter и reduce . С их помощью можно создать краткий и выразительный код. Например, следующий код использует лямбда-функцию с функцией map для возведения в квадрат каждого элемента списка:
numbers = [1, 2, 3, 4, 5] squares = map(lambda x: x**2, numbers) print(list(squares)) # [1, 4, 9, 16, 25]
В этом коде лямбда-функция lambda x: x**2 передается в качестве первого аргумента функции map . Это создает новый объект-итератор, который применяет лямбда-функцию к каждому элементу списка numbers . В результате получается новый список квадратных чисел.
Лямбда-функции — мощный инструмент в Python для создания небольших анонимных функций, которые можно использовать в самых разных контекстах. Однако их следует использовать с осторожностью, поскольку их лаконичный синтаксис иногда может затруднить чтение и понимание кода.
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Python: Объекты
У данных, которыми мы оперируем в программах, есть важные атрибуты. В Python они встроены прямо в язык. Еще у данных есть методы — функции внутри свойств. Свойства и методы — такие же выражения, как переменные или вызовы функции. Все это можно по-разному комбинировать. В этом уроке изучим их основы.
В программировании мы оперируем данными, создаем числа и строки, выполняем над ними различные операции и используем полученный результат. Чтобы выполнить операцию, мы применяем либо операторы, либо функции:
# Сложение с помощью оператора + 1 + 3 # 4 # Подсчет длины с помощью функции len() name = 'Hexlet' len(name) # 6
В примере выше есть четкое разделение: данные отдельно, функции отдельно. Но это не единственный способ организации кода. В Python наравне с таким разделением, используется и другой подход — объектно-ориентированный (ОО).
Объектно-ориентированный код строится на объединении данных и функций в одну сущность — объект. Данные в таком случае называются атрибутами, а функции — методами.
Так это выглядит:
name = 'Hexlet' # Метод upper() upper_name = name.upper() print(upper_name) # => 'HEXLET'
Строки в Python — это объекты. В примере выше мы вызываем метод, то есть функцию, которая связана со строкой. Вызов происходит через точку, которая идет сразу за именем переменной. В остальном методы работают как обычные функции.
Также вызов можно делать и напрямую:
'Hexlet'.upper() # 'HEXLET'
В строки встроено много методов, которые постоянно нужны разработчику. Посмотреть их список можно в документации. Вот несколько полезных примеров:
name = 'Python' # Возвращает индекс первого вхождения буквы в строку name.find('t') # 2 # Переводит в нижний регистр name.lower() # 'python' # Заменяет одну подстроку другой name.replace('on', 'off') # 'Pythoff'
То же самое касается чисел и остальных типов данных, которые мы пока не изучали. Можно сказать, что в Python почти все — объекты:
x = -5 # Возвращает модуль числа # Имя выглядит странно, но это действительно имя метода x.__abs__()
В примере выше есть имя метода с двумя подчеркиваниями в начале и в конце. В Python так называют методы, которые не предназначены для прямого вызова. Для них создали функции, которые внутри себя уже сами вызывают методы:
x = -5 abs(x) # вызывает x.__abs__() # -5 в 3 степени pow(x, 3) # вызывает x.__pow__(3)
Создатель Python решил, что будет нагляднее, если математические или похожие на математические операции выразить функциями. Он хотел, чтобы такие функции воспринимались как операции, типа сложения или вычитания. Так привычнее для тех, кто изучал математику.
Так же работает и функция len() :
len('Hexlet') # Вызывает 'Hexlet'.__len__()
Кроме методов у объектов есть атрибуты, но у встроенных в Python объектов их мало. Например, атрибут __doc__ , который возвращает документацию функции. Поэтому функции тоже считаются объектами:
len.__doc__ # 'Return the number of items in a container.'
Атрибуты работают и выглядят как переменные, только указываются через точку после объекта.
Задание
Приведите строку text к нижнему регистру и напечатайте её на экран. Пример метода, выполняющего эту задачу приведен в теории.
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.