def d(): for i in range(2): yield i def b(): yield d() print("b") yield "bb" def a(): g_b = b() print(g_b) g_d = next(g_b) print(g_d) v_d = next(g_d) print(v_d) # 0 v_d = next(g_d) print(v_d) # 1 b_next = next(g_b) print(b_next) # bb if __name__ == "__main__": a() #---輸出 # <generator object b at 0x00000000033A3E60> # <generator object d at 0x000000000389F150> # 0 # 1 # b # bb ---------------------- def d(): for i in range(2): yield i def b(): yield d() print("b") def a(): g_b = b() print(g_b) # <generator object b at 0x00000000033A3E60> g_d = next(g_b) print(g_d) # <generator object d at 0x000000000389F150> v_d = next(g_d) print(v_d) # 0 v_d = next(g_d) print(v_d) # 1 b_next = next(g_b) print(b_next) #---輸出 <generator object b at 0x00000000033A3E60> <generator object d at 0x000000000349F150> 0 1 b Traceback (most recent call last): File "E:\eclipse-workspace\demo_python\demo\yield_demo.py", line 49, in <module> a() File "E:\eclipse-workspace\demo_python\demo\yield_demo.py", line 19, in a b_next = next(g_b) StopIteration ---------------------- def d(): for i in range(2): yield i def b(): yield d() print("b") yield def a(): g_b = b() print(g_b) # <generator object b at 0x00000000033A3E60> g_d = next(g_b) print(g_d) # <generator object d at 0x000000000389F150> v_d = next(g_d) print(v_d) # 0 v_d = next(g_d) print(v_d) # 1 b_next = next(g_b) print(b_next) #---輸出 <generator object b at 0x00000000033A3E60> <generator object d at 0x000000000349F150> 0 1 b None -------------- @gen.coroutine def gen_d(): for i in range(10): raise gen.Return(i) @gen.coroutine def gen_b(): v = yield gen_d() print("b") @gen.coroutine def gen_a(): var = yield gen_b() print(var) if __name__ == "__main__": ioloop.IOLoop.current().run_sync(gen_a) --輸出 b None ----------------------------- 說明:方法gen_d的註解gen.coroutine去掉以後, gen_d的返回值再也不是Future類型,gen_b方法在執行以一條語句以後, 不會繼續執行後面的語句 #@gen.coroutine def gen_d(): for i in range(10): raise gen.Return(i) @gen.coroutine def gen_b(): v = yield gen_d() print("b") @gen.coroutine def gen_a(): var = yield gen_b() print(var) if __name__ == "__main__": ioloop.IOLoop.current().run_sync(gen_a) --輸出 0 ----------------------------- yield直接返回 @gen.coroutine def gen_d(): for i in range(10): raise gen.Return(i) @gen.coroutine def gen_b(): yield gen_d() @gen.coroutine def gen_a(): var = yield gen_b() print(var) if __name__ == "__main__": ioloop.IOLoop.current().run_sync(gen_a) --- 輸出:None ---------------------- raise返回: @gen.coroutine def gen_d(): for i in range(10): raise gen.Return(i) @gen.coroutine def gen_b(): raise gen.Return(gen_d()) @gen.coroutine def gen_a(): var = yield gen_b() print(var) if __name__ == "__main__": ioloop.IOLoop.current().run_sync(gen_a) 輸出:<Future finished result=0> -------------------------------- 有異步的狀況下不能直接返回: @gen.coroutine def gen_d(): url = "http://x.x.x.x:8060/api/v1/health" result = yield AsyncHTTPClient(defaults=dict(request_timeout=10)).fetch(url, method="GET") raise gen.Return((result.code, result.body)) @gen.coroutine def gen_b(): raise gen.Return((yield gen_d())) @gen.coroutine def gen_a(): var = yield gen_b() print(var) if __name__ == "__main__": ioloop.IOLoop.current().run_sync(gen_a) 輸出:(200, b'ok')