Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / отчет прога лаба 8

.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
134.11 Кб
Скачать

ФЕДЕРАЛЬНОЕ АГЕНСТВО ВОЗДУШНОГО ТРАНСПОРТА

(РОСАВИАЦИЯ)

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ ГРАЖДАНСКОЙ АВИАЦИИ» (МГТУ ГА)

Кафедра вычислительных машин, комплексов, сетей и систем.

Лабораторная работа защищена с оценкой ____________________

____________________

(подпись преподавателя, дата)

ЛАБОРАТОРНАЯ РАБОТА №8

по дисциплине «Современные технологии программирования».

Задание 2, вариант 8

Тема: «Области видимости переменных. Замыкания и декораторы функций.»

Выполнила студентка группы ИС2-1

Магальник Екатерина Борисовна

Руководитель: Надейкина Людмила Анатольевна

МОСКВА – 2023

Цель работы:

Научиться использовать замыкание функции в алгоритмическом языке программирования Python.

Теоретические сведения:

Замыкание в Python - это функциональный объект, который запоминает значения во внешних областях, даже если они отсутствуют в памяти. Это запись, в которой хранится функция вместе со средой: отображение, связывающее каждую свободную переменную функции (переменные, которые используются локально, но определены во включающей области) со значением или ссылкой, к которой было привязано имя при создании замыкания.

Рассмотрим замыкание на простом примере. Определим простую функцию:

def say_name(name):

    def say_goodbye():

        print("Don't say me goodbye, " + name + "!")

 

    say_goodbye()

Затем вызовем ее:

say_name("Sergey")

Мы здесь сначала вызываем внешнюю функцию, затем в ней формируется вложенная функция say_goodbye() и вызывается. В результате, в консоли видим сообщение «Don't say me goodbye, Sergey!».

Теперь попробуем вместо вызова внутренней функции возвратить ссылку на нее с помощью оператора return:

def say_name(name):

    def say_goodbye():

        print("Don't say me goodbye, " + name + "!")

 

    return say_goodbye

После в программе вызовем эту функцию, сохранив результат в переменной f:

f = say_name("Sergey")

f()

Мы увидим то же сообщение, что и в первый раз. Мы имеем глобальную ссылку f на внутреннее, локальное окружение функции say_goodbye(), то это окружение продолжает существовать, оно не удаляется автоматически сборщиком мусора, именно из-за этой глобальной ссылки на него. А вместе с ним, продолжают существовать и все внешние локальные окружения, в данном случае – окружение функции say_name(), потому что также существует неявная, скрытая ссылка на него из внутреннего окружения. Такие ссылки формируются автоматически и позволяют, в частности, обращаться к переменным, объявленным в этих внешних окружениях. Именно поэтому функция print() в say_goodbye() имеет доступ к переменной name и эта переменная продолжает существовать, пока существует окружение say_goodbye, а значит и окружение say_name.

Вот такой эффект, когда мы сохраняем внутреннее локальное окружение и имеем возможность продолжать использовать переменные из внешних окружений, в программировании называется замыканием. Замыкание в том смысле, что мы держим внутреннее окружение say_goodbye переменной f из глобального окружения. Получается цепочка ссылок, замыкающаяся на глобальном окружении.

Вариант №8

1. Используя замыкания функций, объявите внутреннюю функцию, которая принимает два параметра a, b, а затем, возвращает строку в формате: «Для значений a, b функция f(a,b) = <число>» где число – это вычисленное значение функции f. Ссылка на f передается как аргумент внешней функции. Вызовите внутреннюю функцию замыкания и отобразите на экране результат ее работы. Функцию f придумайте самостоятельно (она должна что-то делать с двумя параметрами a, b и возвращать результат).

Листинг программы:

def outer_funk(): def inner_funk(a, b): print("Для значений", a, "," ,b, "функция f(a,b) равна") return funk(a, b) return inner_funk def funk(a, b): return a + b + a * b inner = outer_funk() print(inner(3, 4))

Результат работы программы:

2. Объявите функцию, которая вычисляет площадь круга и возвращает вычисленное значение. В качестве аргумента ей передается значение радиуса. Определите декоратор для этой функции, который выводит на экран сообщение: «Площадь круга равна = <число>» В строке выведите числовое значение с точностью до сотых. Примените декоратор к функции и вызовите декорированную функцию.

Листинг программы:

def outer_funk(): def inner_funk(r): print("Площадь круга равна") return funk(r) return inner_funk def funk(r): return 3.14*r**2 inner = outer_funk() print(inner(3))

Результат работы программы:

Соседние файлы в папке лабы