Една от най-мощните характеристики на Python е, че всичко е обект, включително функциите. Функциите в Python са първокласни обекти.

Това в общи линии означава, че функционира в Python:

  • има видове
  • могат да бъдат изпратени като аргументи на друга функция
  • може да се използва в израз
  • може да стане част от различни структури от данни като речници

Изпращането на функции като аргументи, съчетано с възможността да ги съхранявате в списъци, може да бъде изключително полезно. Знам, че всичко това може да бъде трудно за храносмилане, така че нека го направим стъпка по стъпка.

Функциите могат да се предават като аргументи

За останалата част от урока ще дефинираме функция 'apply', която ще приеме като вход списък, L и функция, f и приложете функцията към всеки елемент от списъка. Този пример е взет от Edx Course 6.00.1.x.

Нека видим как можем да извикаме тази функция:

L = [1, -2, -5, 6.2]
print apply(L, abs)  # [1, 2, 5, 6.2]
# abs is applied on elements passed in L
print apply(L, int)  # [1, -2, -5, 6]

Можем също да предадем самодефинирана функция. Например:

# Function to return square of a number
def sqr(num):
  return num**2
print apply(L,sqr) # [1, 4, 25, 38.440000000000005]

Възможността за извършване на същата операция върху списък от елементи също се предоставя от функция на Python от по-висок ред, наречена map.

В най-простата си форма той приема „унарна“ функция и колекция от подходящи аргументи и връща „iterable“, който трябва да преминем надолу.

Така че горната функция за прилагане може да стане:

for i in map(abs,[1, -2, -5, 6.2]):
    print(i)
# Output:
1
2
5
6.2

За да прочетете повече за операцията с картата, преминете към: Карта на Python

Функции като елементи на списък

Функциите могат да се съхраняват като елементи на списък или всяка друга структура от данни в Python. Например, ако искаме да извършим множество операции с определено число, дефинираме apply_func(L, x), което взема списък от функции, L и операнд, xи прилага всяка функция в Lна x.

Сега, за да извикате тази функция:

function_list = [abs,exp,int]
print apply_func(function_list,-2.3)  # [2.3, 0.10025884, -2]
# Functions in function_list are applied to -2.3
print apply_func(function_list,-4.6)  # [4.6, 0.01005184, -4]

Странична бележка: И в двата примера по-горе можехме да използваме разбиране на списък. Разбиране на списъци в python предоставя елегантен начин за създаване на списъци въз основа на друг списък или итератор. Например редове 14-16 в apply_func могат да станат:

output = [f(x) for f in L]

Функции могат да бъдат присвоени на други променливи

Интересен момент, който трябва да се отбележи тук е, че можем да присвоим различни променливи за тези функции. Това означава, че можем да кажем:

i = abs
print(i(-2)) # 2

Това е така, защото функциите работят точно като обекти и могат да се предават. Но една идея, която е още по-мощна, е, че всички обекти могат да се държат и като функции.

Обектите като функции

Тази част ще изисква от нас да разберем малко повече за това какво прави един обект функция. Обектите могат да се третират като функции означава, че те могат да бъдат извикани с помощта на кръгла скоба (), точно като функция.

Това може да стане чрез дефиниране на функция __call__ в обекта. Нека дефинираме клас, който при извикване отпечатва всичко, което съхранява.

s1 = Printer('Hello') # Defining object of class Printer
# Calling object s1
s1()   # Hello 

По този начин, под капака „извикване“ на обект означава изпълнение на метода __call__ на обекта.

Ключови изводи

  • Функциите в python са първокласни обекти. Това означава, че те могат да се предават като аргументи на други функции, да се присвояват на променливи или дори да се съхраняват като елементи в различни структури от данни.
  • Възможността за извършване на същата операция върху списък от елементи се предоставя от функция на Python от по-висок ред, наречена map.
  • Обектите могат да бъдат направени извикваеми чрез дефиниране на функция __call__.

Можете да прочетете повече по тази тема на:

Ако това ви е харесало, може да намерите полезни Разбиране на списъци в PythonиВъведение в наборите на Python.