http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html
Заметки на полях
пятница, 7 июня 2013 г.
пятница, 29 марта 2013 г.
суббота, 29 декабря 2012 г.
Этюды на питоне: однострочное дерево
Взято из https://gist.github.com/, http://recursive-labs.com/
В недрах интернета есть сотни реализаций дерева на питоне, но сегодня мне хотелось бы рассказать о самой короткой из реализаций, требующей при этом довольно приличного понимания некоторых идей, лежащих в основе python. Вот она:
from containers import defaultdict
def tree(): return dafaultdict(tree)
Это действительно все!
Пользоваться этим тоже элементарно:
>>> a = tree()
>>> a['foo']['bar'] = 'foobar'
>>> a['free']['beer'] = 'free beer'
>>> print a['free']['beer']
free beer
Чтобы лучше увидеть, что получилось, можно преобразовать это в json:
>>> import json
>>> print(json.dumps(a))
{"foo": {"bar": "foobar"}, "free": {"beer": "free beer"}}
Теперь разберемся, как это работает.
В недрах интернета есть сотни реализаций дерева на питоне, но сегодня мне хотелось бы рассказать о самой короткой из реализаций, требующей при этом довольно приличного понимания некоторых идей, лежащих в основе python. Вот она:
from containers import defaultdict
def tree(): return dafaultdict(tree)
Это действительно все!
Пользоваться этим тоже элементарно:
>>> a = tree()
>>> a['foo']['bar'] = 'foobar'
>>> a['free']['beer'] = 'free beer'
>>> print a['free']['beer']
free beer
Чтобы лучше увидеть, что получилось, можно преобразовать это в json:
>>> import json
>>> print(json.dumps(a))
{"foo": {"bar": "foobar"}, "free": {"beer": "free beer"}}
Теперь разберемся, как это работает.
Этюды на питоне: оптимизация хвостовой рекурсии в python
Взято с habrahabr.ru
Хвостовая рекурсия выделяется из общего случая тем, что в качестве последней операции используется сам рекурсивный вызов. Примечательна она возможностью разворачиваться в обычный императивный цикл. Это ее свойство часто используется в функциональных языках для оптимизации производительности.
python хоть и мултипарадигмальный, но функциональные возможности не так сильно развиты, как этого бы многим хотелось. В частности оптимизации хвостовой рекурсии в нем по идеологическим соображениям нет. Но можно написать небольшой trampoline, реализующий эту возможность:
class recursion(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
result = self.func(*args, **kwargs)
while callable(result):
result = result()
return result
def call(self, *args, **kwargs):
return lambda: self.func(*args, **kwargs)
@recursion
def sum(x, result=0):
return (sum.call(x - 1, result + x), result)[x == 0]
print(sum(36))
Данный trampoline использует декоратор. Декоратор заменяет функцию на объект, который хранит в себе саму функцию и имеет специальный метод __call__, который позволяет обращаться с объектом как с функцией.
Подписаться на:
Сообщения (Atom)