Введение в язык Питон


Замыкание - часть 5


      incomeClosure = lambda income,taxdue: closure(taxdue)

      deductClosure = lambda deduct,taxdue: closure(taxdue)

      rateClosure   = lambda rate,taxdue: closure(taxdue)


      taxFP = taxdue

      taxFP = incomeClosure(50000,taxFP)

      taxFP = rateClosure(0.30,taxFP)

      taxFP = deductClosure(10000,taxFP)

      print "Functional taxes due =",taxFP()


      print "Lisp-style taxes due =", \

            incomeClosure(50000,

                rateClosure(0.30,

                    deductClosure(10000, taxdue)))()

Каждая описанная нами функция замыкания берет любые значения, определенные в ее области видимости, и привязывает эти величины к глобальной области видимости функционального объекта. Однако то, что кажется глобальной областью данной функции, необязательно совпадает как с "настоящей" глобальной областью действия модуля, так и с глобальной областью другого замыкания. Замыкание просто "несет данные с собой".

В нашем примере, чтобы поместить определенные значения в область действия замыкания, мы используем несколько частных функций (income, deduct, rate). Было бы достаточно просто изменить дизайн так, чтобы было можно присваивать произвольные значения. Кроме того, ради развлечения, мы используем в этом примере два слегка различных функциональных стиля. Первый последовательно привязывает дополнительные значения к области замыкания; сделав taxFP изменяемой, мы позволяем строкам добавить в замыкание появляться в любом порядке. Однако, если бы мы использовали неизменяемые имена наподобие tax_with_Income, нам пришлось бы  расположить связывания в определенном порядке и передавать более ранние последующим.


Начало  Назад  Вперед



Книжный магазин