Виктория обнови решението на 14.03.2013 22:46 (преди над 11 години)
+import collections
+
+
+def identity(x):
+ return x
+
+
+def compose(f, g):
+ return lambda x: f(g(x))
+
+
+def iterate(func):
+ composition = identity
+
+ while True:
+ yield composition
+ composition = compose(func, composition)
+
+
+def groupby(func, seq):
+ groups = {}
+ for element in seq:
+ groups.setdefault(func(element), []).append(element)
+ return groups
+
+
+def zip_with(func, *iterables):
+ return (func(*x) for x in zip(*iterables))
+
+
+def cache(func, cache_size):
+ func_copy = func
+ func_copy.cache = collections.OrderedDict()
+
+ def func_cached(x):
+ if not x in func_copy.cache.keys():
+ if len(func_copy.cache) == cache_size:
+ func_copy.cache.popitem(False)
+ func_copy.cache[x] = func_copy(x)
+ return func_copy.cache[x]
+
+ return func_cached
- Какъв е смисълът от
identity
? -
func_copy
не е копие наfunc
:) - Обърни внимание, че func_cached може да получи повече от един аргумент.
-
pop
има шанс да изгърми, при напълно валидни аргументи.