【问题标题】:LISP cons in pythonpython中的LISP缺点
【发布时间】:2011-11-10 01:12:26
【问题描述】:

在 Python 中是否有 cons 的等价物? (2.5以上的任何版本)

如果是,它是内置的吗?还是我需要easy_install 获取模块?

【问题讨论】:

    标签: python lisp cons


    【解决方案1】:

    提前警告:以下材料可能不实用!

    实际上,cons 在 Lisp 中不需要是原始的,你可以用 λ 构建它。 有关详细信息,请参阅Use of lambda for cons/car/cdr definition in 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 递归开始构建列表。您可以在 Python 中将 nil 定义为空对。

    def nil(): return ()
    

    请注意,您必须在 Python 中使用 = 绑定变量。我对吗?由于它可能会改变变量,我宁愿定义常量函数。

    当然,这不是 Pythonic 而是 Lispy,既不实用又优雅。

    练习:用Python实现Scheme的列表库http://srfi.schemers.org/srfi-1/srfi-1.html。开个玩笑:)

    【讨论】:

      【解决方案2】:

      在 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】:

        请注意,Python 的列表是作为向量实现的,而不是作为链表。你可以做lst.insert(0, val),但是这个操作是 O(n)。

        如果您想要一个更像链表的数据结构,请尝试使用Deque

        【讨论】:

          【解决方案4】:

          您可以非常简单地定义一个行为类似于cons 的类:

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

          然而,这将是构建基本数据结构的一种非常“重量级”的方法,Python 并未针对该数据结构进行优化,因此我预计结果会比在 Lisp 中执行类似操作更占用 CPU/内存。

          【讨论】:

            【解决方案5】:

            在 Python 3 中,您可以使用 splat 运算符 * 通过编写 [x, *xs] 来简洁地执行此操作。例如:

            >>> x = 1
            >>> xs = [1, 2, 3]
            >>> [x, *xs]
            [1, 1, 2, 3]
            

            如果您更喜欢将其定义为函数,那也很容易:

            def cons(x, xs):
              return [x, *xs]
            

            【讨论】:

              【解决方案6】:

              没有。 cons 是类 Lisp 语言的实现细节;它在 Python 中没有任何意义。

              【讨论】:

              猜你喜欢
              • 2014-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多