
ТП6
.docxГУАП
КАФЕДРА 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
Ассистент |
|
|
|
Е.К. Григорьев |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6 |
ДЕКОРАТОРЫ И ГЕНЕРАТОРНЫЕ ФУНКЦИИ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4116 |
|
|
|
. |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
Цель работы: познакомиться с основными способами использования декораторов и генераторов в Python.
Вариант 4:
Часть 1. Задания на декораторы (1,6,9):
Задание 1. Напишите декоратор pow_list_result, который будет возводить в квадрат результирующее значение (элементы списка) функции sum_list, на вход которой подается целочисленный список и возвращается сумма его элементов.
Код программы 1 с тестами:
def sum_list(func):
def wrapper(my_list):
return sum(func(my_list))
return wrapper
@sum_list
def pow_list_result(my_list):
return [x ** 2 for x in my_list]
assert pow_list_result([1,2])==5
assert pow_list_result([1,2,4])==21
my_list = [1, 2, 3, 4]
print(pow_list_result(my_list))
Рисунок 1- результат работы программы 1
Задание 6. Напишите декоратор fahrenheit, который будет переводить в градусы Фаренгейта возвращаемое значение функцией temperature_celsius, на вход которой подается значение температуры в градусах Цельсия, и оно же возвращается.
Код программы 2 с тестами:
def fahrenheit(func):
def wrapper(c):
c = 1.8 * func(c) + 32
return c
return wrapper
@fahrenheit
def temperature_celsius(c):
return c
assert temperature_celsius(40)== 104.0
assert temperature_celsius(32.5)== 90.5
c= float(input("Введите градусы: "))
print (temperature_celsius(c))
Рисунок 2- результат работы программы 2
Задание 9. Напишите декоратор time_run, вычисляющий время выполнения декорируемой функции и возвращающий время выполнения вместо результата декорируемой функции. В качестве декорируемой напишите функцию algebraic_sum, на вход которой подается два значения N и k (по умолчанию равно 2). Функция должна возвращать результат следующего выражения: 1^k + 2^k + 3^k + … + N^k .
Код программы 3:
import time
def time_run(func):
def wrapper (n,k):
start_time =time.perf_counter()
func(n, k)
end_time= time.perf_counter()
return (end_time - start_time)/0.001
return wrapper
@time_run
def algebraic_sum(n, k=2):
k=0
for i in range(1,n+1):
k+= i**k
return k
print (f'{algebraic_sum(3,2):.11f}')
Рисунок 3- результат работы программы 3
Часть 2. Задания на генераторы (6, 10, 11)
Задание 6. Напишите генераторную функцию alphabet, возвращающую по запросу буквы английского алфавита (в строгой последовательности) в нижнем регистре.
Код программы 4:
def alphabet():
for letter in range(ord('a'),ord('z')+1):
yield chr(letter)
for letter in alphabet():
print(letter,end = " ")
Рисунок 4- результат работы программы 4
Задание 10. Напишите генераторную функцию list_mod, на вход которой подается список целочисленных значений и значение k. Функция должна возвращать только те элементы списка, значение которых удовлетворяют следующему условию: list_mode[i] mod k == 0.
Код программы 5 с тестами:
def list_mod (my_list:list, k):
for i in my_list:
if i % k==0:
yield i
assert list(list_mod([1, 2, 4, 7], 3)) == []
assert list(list_mod([-10, -7, -6, 0, 3, 5, 9, 13], 3)) == [-6, 0, 3, 9]
my_list=[1,2,3,-4,5,6,7,8,9,10]
k=int (input("Введите k: "))
for i in list_mod(my_list,k):
print(i)
Рисунок 5- результат работы программы 5
Задание 11. Напишите генераторную функцию list_odd, на вход которой подается список целочисленных значений. Функция должна возвращать только те четные значения из поданного на ее вход списка
Код программы 6 с тестами:
def list_mod (my_list:list, k):
for i in my_list:
if i % k==0:
yield i
assert list(list_mod([1, 2, 4, 7], 3)) == []
assert list(list_mod([-10, -7, -6, 0, 3, 5, 9, 13], 3)) == [-6, 0, 3, 9]
my_list=[1,2,3,-4,5,6,7,8,9,10]
k=int (input("Введите k: "))
for i in list_mod(my_list,k):
print(i,end = " ")
Рисунок 6- результат работы программы 6
Вывод: изучены основные способы использования декораторов и генераторов в Python.