Ruby の次のコードに相当する Python は何ですか?
def loop
cont=nil
for i in 1..4
puts i
callcc {|continuation| cont=continuation} if i==2
end
return cont
end
> c=loop
1
2
3
4
> c.call
3
4
Ruby の次のコードに相当する Python は何ですか?
def loop
cont=nil
for i in 1..4
puts i
callcc {|continuation| cont=continuation} if i==2
end
return cont
end
> c=loop
1
2
3
4
> c.call
3
4
あなたが引用した記事には、Python 言語での継続について説明している「参考文献」セクションにあるContinuations Made Simple And Illustratedへのリンクが含まれています。
ジェネレーターを作成するためにyieldステートメントを見てください。
私はルビーを話せませんが、あなたはこれを探しているようです:
def loop():
for i in xrange(1,5):
print i
if i == 2:
yield
for i in loop():
print "pass"
編集:これは基本的に実際の継続の特殊化であることは理解していますが、ほとんどの目的には十分なはずです。yield
ジェネレーターの継続と.next()
メッセージ ( を呼び出すだけで返されるloop()
) を返し、再入力するために使用します。
特別な場合に機能する弱い回避策はたくさんありますが (この質問に対する他の回答を参照してください)、 に相当する、callcc
または に相当するものを構築するために使用できるPython 言語構造はありませんcallcc
。
Stackless Pythonまたはgreenlet Python 拡張機能を試してみてください。どちらもコルーチンを提供し、それに基づいてワンショットの継続を構築できますが、Ruby のcallcc
もの (完全な継続を提供する) よりもまだ弱いです。
使用generator_tools
(インストール: ' $ easy_install generator_tools
'):
from generator_tools import copy_generator
def _callg(generator, generator_copy=None):
for _ in generator: # run to the end
pass
if generator_copy is not None:
return lambda: _callg(copy_generator(generator_copy))
def loop(c):
c.next() # advance to yield's expression
return _callg(c, copy_generator(c))
if __name__ == '__main__':
def loop_gen():
i = 1
while i <= 4:
print i
if i == 2:
yield
i += 1
c = loop(loop_gen())
print("c:", c)
for _ in range(2):
print("c():", c())
出力:
1
2
3
4
('c:', <function <lambda> at 0x00A9AC70>)
3
4
('c():', None)
3
4
('c():', None)
def loop():
def f(i, cont=[None]):
for i in range(i, 5):
print i
if i == 2:
cont[0] = lambda i=i+1: f(i)
return cont[0]
return f(1)
if __name__ == '__main__':
c = loop()
c()