Ленивые вычисления


def set_surname(surname): surname = ' ' + surname def



бет2/4
Дата21.12.2023
өлшемі29.73 Kb.
#487228
1   2   3   4
ЛЕНИВЫЕ ВЫЧИСЛЕНИЯ. Функторы

def set_surname(surname):
surname = ' ' + surname
def inner(name):
return name + surname
return inner

anderson = set_surname('Anderson')


print(anderson('Helen'))
print(anderson('Joe'))

В переменную anderson была записана такая функция:


surname = ' Anderson'


def func(name):
return name + surname

И в этом кроется корень следующей проблемы- позднее связывание замыканий


Написать замыкание, чтобы оценить, как сочетаются разные имена с фамилией новорожденного.
def set_names(names):
results = []
for name in names:
def inner(surname):
return name + ' ' + surname
results.append(inner)
return results
Получите результат для:
names_lst = ['Roy', 'Jake', 'Colin']
for child_name in set_names(names_lst):
print(child_name('Robinson'))

Позднее связывание. Это означает, что значения свободных переменных будут прочитаны замыканием в момент его вызова, иначе говоря - слишком поздно. Каждое новое значение name перезаписывало старое, а затем каждое наше замыкание обратилось к последнему значению переменной name. Эту проблему можно решить при помощи аргумента по умолчанию для внутренней функции:


def set_names(names):
results = []
for name in names:
def inner(surname, name=name):
return name + ' ' + surname
results.append(inner)
return results
Свободная переменная name становится аргументом, из-за чего ее можно изменить. Можно воспользоваться частичным применением функции.
from functools import partial
def set_names(names):
results = []
for name in names:
def inner(first_name, surname):
return first_name + ' ' + surname
results.append(partial(inner, name))
return results
Функция partial из модуля functools позволила установить first_name равным name в момент своего вызова. Это поможет избежать нежелательных изменений замыкания.

Перепишем пример с использованием функтора:




Достарыңызбен бөлісу:
1   2   3   4




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет