2008-11-23 106 views

回答

2

看看在yield語句來使發電機。

我不會說任何紅寶石,但好像你正在尋找這樣的:

def loop(): 
    for i in xrange(1,5): 
     print i 
     if i == 2: 
      yield 


for i in loop(): 
    print "pass" 

編輯:我意識到這是基本真實的延續的一個特例,但它應該是足以滿足大多數目的。使用yield將生成器上的繼續和.next()消息返回(僅通過調用loop()返回)以重新輸入消息。

+0

這不是那麼容易,請參閱http://stackoverflow.com/questions/312794/#313073 – jfs 2008-11-23 23:08:41

0
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() 
2

使用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) 
+0

generator_tools在它可以複製的內容上相當有限,請參閱其文檔。我不會提名generator_tools作爲callcc的替代品。 – pts 2010-12-01 19:56:43

2

有很多薄弱的解決方法,其工作在特殊情況下(看其他的答案,這樣問題),但是沒有Python語言結構,它相當於callcc或者可以用於構建等同於的東西。

你可能想嘗試Stackless Pythongreenlet Python擴展,兩者都提供協同程序,在此基礎上,可以建立一次性continutations,但是這仍然比Ruby的callcc(它提供了完整的延續)弱。