Иван обнови решението на 13.03.2013 15:10 (преди над 11 години)
+from collections import OrderedDict
+
+
+def groupby(func, seq):
+ res = {}
+ for elem in seq:
+ res.setdefault(func(elem), []).append(elem) # setdefaul returns list
+ return res
+
+
+def zip_with(func, *iterables):
+ return map(func, *iterables) if iterables else []
+
+
+def cache(func, cache_size=0):
+ caches = OrderedDict()
+
+ def func_cached(*args):
+ if args in caches:
+ pass # the value is present, do nothing
+ else:
+ if len(caches) == cache_size:
+ caches.popitem(False) # FIFO
+ caches[args] = func(*args)
+ return caches[args]
+ return func_cached
+
+
+def compose(f, g):
+ return lambda *args, **kwargs: f(g(*args, **kwargs))
+
+
+def iterate(func):
+ composition = lambda x: x
+ while True:
+ yield composition
+ composition = compose(func, composition) # f(id), f(f(id))
Какво значат res
, elem
, seq
, f
и g
?
И махни тези коментари. Ако не е очевидно какво се случва трябва да пренапишеш кода.
Да се напише функция groupby(func, seq)... От тук идва seq. Относно другите, кога е позволено да се ползват не цели думи а само началото от тях (func, elem,...) с цел имената да не са прекалено дълги?
Има някакви общоприети съкращения. func
е едно от тях, поради някаква причина. Други популярни са args
и kwargs
. Такива е ок да ползваш.
Но като цяло избягвай всякакви съкращения. Ако си мислиш за резултат, напиши result
, не res
. Същото и за елемент...