Silos
Авг. 2, 2021 22:39:56
Создать декоратор для функции, которая принимает неограниченное количество позиционных ХЕШИРУЕМЫХ элементов.
Декоратор добавляет следующий функционал:
Если функция уже вызвалась с такими аргументами - ваша функция должна вернуть результат выполнения этой функции из памяти, а не вычислять его заного.
Если не вызывалась - вычислить результат, положить его в память, и вернуть.
py.user.next
Авг. 3, 2021 00:02:44
1. Сначала сделай декоратор для простой какой-то функции.
2. Потом этот декоратор для простой какой-то функции переделай в декоратор для функции с аргументами.
3. Потом этот декоратор для функции с аргументами переделай в декоратор для функции с неограниченным количеством аргументов.
4. Потом этот декоратор для функции с неограниченным количеством аргументов переделай в декоратор для функции с неограниченным количеством позиционных аргументов.
5. Потом этот декоратор для функции с неограниченным количеством позиционных аргументов переделай в декоратор для функции с неограниченным количеством позиционных хешируемых аргументов.
6. Потом этот декоратор для функции с неограниченным количеством позиционных хешируемых аргументов переделай в декоратор для функции с неограниченным количеством позиционных хешируемых аргументов и с памятью.
Комментарии:
1. 3-й и 4-й пункты сливаются в один.
2. В 5-м пункте используется функция hash(), чтобы определить хешируемость переданного аргумента.
3. В 6-м пункте для памяти используется словарь dict() внутри декоратора ещё до вызова декорируемой функции.
Смысл в том, чтобы разрабатывать программу итеративно - как бы послойно. Это общий принцип разработки, которого нужно придерживаться. Тогда программы будут получаться сами собой и в них не будет каких-то тёмных углов или перекосов.
tags: development iterative
Silos
Авг. 8, 2021 08:47:10
import collections.abc
cache = {}
def dec(func):
def wrapper(*args):
if not cache.get(args):
a = func(*args)
cache[args] = a
return a
else:
return cache[args]
return wrapper
def check_hash(*args):
if not all(isinstance(i, collections.abc.Hashable) for i in args):
check = False
else:
check = args
return check
@dec
def fu(*args):
result = args * 2
return result
fu(4)
doza_and
Авг. 8, 2021 09:39:53
Silos???
Будь я преподаватель то не принял бы ваш код.
У вас половина кода не используется. Считай она просто мусор.
Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.
Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
Silos
Авг. 8, 2021 15:01:12
doza_and
Silos???Будь я преподаватель то не принял бы ваш код.У вас половина кода не используется. Считай она просто мусор.Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
Так а как его сделать правильно?
Silos
Авг. 8, 2021 15:12:01
doza_and
Silos???Будь я преподаватель то не принял бы ваш код.У вас половина кода не используется. Считай она просто мусор.Вы не понимаете назначение функции get. Она нужна для для задания значений по умолчанию.Если для каких-то аргументов функция вернет None,0,tuple(),…. То хеширования не произойдет. Это прямое нарушение требований задания. Следовательно ваш код неверен.
метод get() возвращает значение для данного ключа, если ключ недоступен, возвращается значение по умолчанию None
dict.get(key, default=None)