consPythonに相当するものはありますか?(2.5以降のすべてのバージョン)
もしそうなら、それは組み込まれていますか?またはeasy_install、モジュールを入手する必要がありますか?
警告:以下の資料は実用的でない場合があります。
実際、consLispでは原始的である必要はなく、λで構築することができます。詳細については、SICPのcons / car/cdr定義でのラムダの使用を参照してください。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もちろん、再帰を使用してリストの作成を開始できます。nilPythonで空のペアになるように定義できます。
def nil(): return ()
=Pythonでを使用して変数をバインドする必要があることに注意してください。私は正しいですか?変数が変化する可能性があるので、定数関数を定義したいと思います。
もちろん、これはPythonicではなくLispyであり、それほど実用的ではありませんがエレガントです。
演習: PythonでSchemeのリストライブラリhttp://srfi.schemers.org/srfi-1/srfi-1.htmlを実装します。冗談だ :)
listPythonでは、 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]
Pythonのリストは、リンクリストとしてではなく、ベクトルとして実装されていることに注意してください。できますlst.insert(0, val)が、その操作はO(n)です。
リンクリストのように動作するデータ構造が必要な場合は、Dequeを使用してみてください。
次のように動作するクラスを非常に簡単に定義できますcons。
class Cons(object):
def __init__(self, car, cdr):
self.car = car
self.cdr = cdr
ただし、これはPythonが最適化されていない基本的なデータ構造を構築するための非常に「重い」方法になるため、Lispで同様のことを行うよりも、CPU/メモリを大量に消費する結果になると思います。
Python 3では、splat演算子*を使用して、これを簡潔に記述でき[x, *xs]ます。例えば:
>>> x = 1
>>> xs = [1, 2, 3]
>>> [x, *xs]
[1, 1, 2, 3]
関数として定義したい場合は、それも簡単です。
def cons(x, xs):
return [x, *xs]
いいえcons。Lispのような言語の実装の詳細です。Pythonには意味のある意味で存在しません。