
Григорьев ЛР / 6 / тп6
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
ассистент |
|
|
|
Е.К. Григорьев |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 6 |
ДЕКОРАТОРЫ И ГЕНЕРАТОРНЫЕ ФУНКЦИИ |
по курсу: ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ |
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
|
|
|
|
|
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2023
1 Цель работы
Познакомиться с основными способами использования декораторов и генераторов в Python.
2 Ход работы
Вариант: 16
1.3 Напишите декоратор upcase_result, который будет переводить все символы результирующего значения функции reverse_str в верхний регистр. На вход функции reverse_str подается строка и возвращается ее инвертированное представление.
Код программы:
def uppercase_result(func):
def wrapper(strin: str):
result = func(strin)
return result.upper()
return wrapper
@uppercase_result
def reverse_str(s: str):
s = s[::-1]
return s
assert reverse_str('abcd') == 'DCBA'
assert reverse_str('Qwerty') == 'YTREWQ'
inp = str(input())
print(reverse_str(inp))
inp = input()
while inp.isdigit():
print("Введите строку")
inp = input()
assert recursion_palindrom('abba') == True
assert recursion_palindrom('abbb') == False
print(recursion_palindrom(inp))
1.4 Напишите декоратор check_bit, которая будет добавлять к результирующему значению декорируемой функции 10, если третий бит (справа) установлен в единицу, иначе отнимать 5. Декоратор должен применяться к функции pow3, которая возводит в куб подаваемое на вход значение и возвращающую полученный результат.
Код программы:
def check_bit(func):
def wrapper(x: int):
result = func(x)
print(bin(result))
if str(bin(result))[-3] == '1':
result += 10
else:
result -= 5
return result
return wrapper
@check_bit
def pow3(x: int):
x **= 3
return x
assert pow3(5) == 135
assert pow3(2) == 3
inp = int(input())
print(pow3(inp))
1.7 Напишите декоратор celsius, который будет переводить в градусы Цельсия возвращаемое значение функцией temperature_fahrenheit, на вход которой подается значение температуры в градусах Фаренгейта, и оно же возвращается.
Код программы:
def celsius(func):
def wrapper(f: int):
result = (func(f)-32)*5/9
return result
return wrapper
@celsius
def temperature_fahrenheit(f: int):
return f
assert temperature_fahrenheit(32) == 0
assert temperature_fahrenheit(50) == 10
inp = int(input())
print(temperature_fahrenheit(inp))
2.4 Напишите функцию is_generator, принимающую на вход другую функцию и возвращающую True, если передается генераторная функция, иначе – False.
Код программы:
import inspect
def is_generator(func):
if inspect.isgeneratorfunction(func):
return True
else:
return False
def gen_func():
yield 'generator'
def func():
return 'not a generator'
assert is_generator(gen_func) == True
assert is_generator(func) == False
2.5
Напишите генераторную функцию my_pow, на
вход которой подается целочисленное
значение n. На каждом шаге итерации
генератор должен возвращать
.
Код программы:
def my_pow(n: int):
while True:
yield n
n = pow(n, 2)
powe = my_pow(2)
for i in range(5):
print(next(powe))
a = my_pow(2)
assert next(a) == 2
assert next(a) == 4
2.10 Напишите генераторную функцию list_mod, на вход которой подается список целочисленных значений и значение k. Функция должна возвращать только те элементы списка, значение которых удовлетворяют следующему условию: list_mode[i] mod k == 0.
Код программы:
def list_mod(my_list: list, k: int):
for i in my_list:
if i % k == 0:
yield i
my_list = [1, 2, 3, 4, 5, 6, 7, 8]
k = 2
listmod = list_mod(my_list, k)
for i in listmod:
print(next(listmod))
3 Вывод
Я освоил основные способы объявления и использования декораторов и генераторов в Python.