Скачиваний:
1
Добавлен:
03.06.2024
Размер:
22.62 Кб
Скачать

ГУАП

КАФЕДРА № 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.

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