LISP минусы в питоне - PullRequest
       58

LISP минусы в питоне

8 голосов
/ 10 ноября 2011

Есть ли эквивалент cons в Python? (любая версия выше 2.5)

Если так, он встроен? Или мне нужно easy_install получить модуль?

Ответы [ 5 ]

7 голосов
/ 30 августа 2015

ПРЕДУПРЕЖДЕНИЕ ВПЕРЕД: Материал, представленный ниже, может быть непрактичным!

На самом деле, cons не обязательно должен быть примитивным в Лиспе, вы можете построить его с помощью λ.Подробнее см. Использование лямбды для определения cons / car / cdr в SICP .В Python это переводится как:

def cons(x, y):
    return lambda pair: pair(x, y)

def car(pair):
    return pair(lambda p, q: p)

def cdr(pair):
    return pair(lambda p, q: q)

Теперь car(cons("a", "b")) должно дать вам 'a'.

Как это?Схема префикса:)

Очевидно, вы можете начать построение списка, используя cdr рекурсию.Вы можете определить nil как пустую пару в Python.

def nil(): return ()

Обратите внимание, что вы должны связать переменную, используя = в Python.Я прав?Поскольку он может изменять переменную, я бы лучше определил постоянную функцию.

Конечно, это не Pythonic, а Lispy, не такой практичный, но элегантный.

Упражнение: реализовать библиотеку списков http://srfi.schemers.org/srfi-1/srfi-1.html Схемы в Python.Шучу:)

7 голосов
/ 10 ноября 2011

В Python более типично использовать основанный на массиве класс list, чем связанные списки в стиле Lisp. Но между ними нетрудно перейти:

def cons(seq):
    result = None
    for item in reversed(seq):
        result = (item, result)
    return result

def iter_cons(seq):
    while seq is not None:
        car, cdr = seq
        yield car
        seq = cdr

>>> cons([1, 2, 3, 4, 5, 6])
(1, (2, (3, (4, (5, (6, None))))))
>>> iter_cons(_)
<generator object uncons at 0x00000000024D7090>
>>> list(_)
[1, 2, 3, 4, 5, 6]
3 голосов
/ 10 ноября 2011

Обратите внимание, что списки Python реализованы как векторы, а не как связанные списки.Вы можете сделать lst.insert(0, val), но эта операция O (n).

Если вам нужна структура данных, которая ведет себя больше как связанный список, попробуйте использовать Deque .

2 голосов
/ 10 ноября 2011

Вы можете довольно просто определить класс, который ведет себя так же, как cons:

class Cons(object):
    def __init__(self, car, cdr):
        self.car = car
        self.cdr = cdr

Однако это будет очень «тяжелый» способ построения базовых структур данных, для которых Python не оптимизирован,поэтому я ожидал бы, что результаты будут намного более интенсивно использовать процессор / память, чем делать что-то подобное в Лиспе.

1 голос
/ 10 ноября 2011

Нет. cons - это деталь реализации Lisp-подобных языков; в Python он не существует ни в каком значимом смысле.

...