Pythonでは、引用演算子に相当するものは何ですか? 評価を遅らせる必要性を感じています。たとえば、私が持っている次の Lisp 疑似コードを考えてみましょう:
a = '(func, 'g)
g = something
(eval a)
私がやっていることは、の評価をg
後で延期することです。g
これは後で定義したいので必要です。Python でのこの疑似コードの同等のアイデアは何ですか?
Pythonでは、引用演算子に相当するものは何ですか? 評価を遅らせる必要性を感じています。たとえば、私が持っている次の Lisp 疑似コードを考えてみましょう:
a = '(func, 'g)
g = something
(eval a)
私がやっていることは、の評価をg
後で延期することです。g
これは後で定義したいので必要です。Python でのこの疑似コードの同等のアイデアは何ですか?
a = lambda: func(g)
g = something
a()
これは、最も文字通りの翻訳ではありません。最も文字通りの翻訳では、文字列を使用しますeval
が、おそらく最適です。いずれにせよ、クォートはおそらく Lisp で望んでいたものではありません。あなたはおそらくdelay
何かをしたい、または作成したいと思っていましたlambda
。func
とは、シンボルではなく関数g
内のクロージャ変数であるため、またはのバインディングが異なる環境から呼び出した場合でも、 の定義環境の変数が使用されます。lambda
a
func
g
a
eval
Lisp と Python の両方で、評価を遅らせるために使用するのは良くありません。
Python と Lisp では、クロージャを使用して評価を遅らせることができます。
def print_it(x):
def f():
print g(x)
return f
f = print_it(42)
def g(x):
return x * x
f()
クロージャでキャプチャされるのは変数の値ではなく、変数自体であることに注意してください。これは時々驚くべきことです。
fa = []
for x in range(10):
def g():
print x
fa.append(g)
for f in fa:
f() # all of them will print 9
x = 42
fa[0]() # the output will be 42
この問題 (Common Lisp にも存在する可能性があります) を解決するには、次のように表示される場合があります。
for x in range(10):
def g(x = x):
print x
fa.append(g)
または(CLで)次のようなもの
(let ((a a))
(lambda () (print a)))
Python にもlambda
無名関数用の特別な形式がありますが、それらは 1 つの式に制限されており、ステートメントを含めることはできません。代わりに、ローカルでdef
実行される関数は、制限のない通常の関数です。
for x in range(10):
# print is a statement in Python 2.x and cannot be in a lambda
fa.append(lambda x=x: sys.stdout.write(str(x) + "\n"))
最後に、Python 2.x には構文の制限があり、クローズド オーバー変数は読み取り専用です。これは、関数に代入 (または拡張代入) がある場合、2 つの可能性しかないためです。
global x
)特に、代入される変数が外側の関数スコープのローカルである可能性は除外されます。
Python 3.x は、新しい可能な宣言を提供することでこの制限を取り除きnonlocal x
、有名なadder
例を次のように実装できるようになりました。
def adder(x):
def f(y):
nonlocal x
x += y
return x
return f