2008-11-23 24 views

Trả lời

2

hãy nhìn vào báo cáo kết quả yield để làm cho máy phát điện.

tôi không nói bất kỳ ruby, nhưng nó có vẻ như bạn đang tìm kiếm này:

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


for i in loop(): 
    print "pass" 

Edit: Tôi nhận ra điều này về cơ bản là một chuyên môn của continuations thực, nhưng nó phải là đủ cho hầu hết mục đích. Sử dụng yield để trả lại sự tiếp tục và thông báo .next() trên máy phát (trả lại bằng cách chỉ gọi loop()) để nhập lại.

+0

Nó không phải là dễ dàng, xem http://stackoverflow.com/questions/312794/#313073 – jfs

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

Sử dụng generator_tools (cài đặt: '$ 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()) 

Output:

1 
2 
3 
4 
('c:', <function <lambda> at 0x00A9AC70>) 
3 
4 
('c():', None) 
3 
4 
('c():', None) 
+0

generator_tools là khá hạn chế về những gì nó có thể sao chép, xem tài liệu của nó. Tôi sẽ không chỉ định generator_tools là một thay thế drop-in cho callcc. – pts

2

Có rất nhiều cách giải quyết yếu mà làm việc trong trường hợp đặc biệt (xem câu trả lời khác để này câu hỏi), nhưng không có cấu trúc ngôn ngữ Python nào tương đương với callcc hoặc có thể được sử dụng để tạo thứ gì đó tương đương với callcc.

Bạn có thể muốn thử Stackless Python hoặc phần mở rộng Python greenlet, cả hai đều cung cấp coroutines, trên cơ sở đó chúng ta có thể xây dựng continutations one-shot, nhưng đó là vẫn yếu hơn so với Ruby callcc (cung cấp continuations đầy đủ).

Các vấn đề liên quan