[Level 2] How to use yield in Python
yield in python just pass the control to the parent.
if a() call b(),
in b and execute yield,
the control would back to a() util a call generator.next()
e.g.
if a() call b(),
in b and execute yield,
the control would back to a() util a call generator.next()
e.g.
#!/bin/env python def foo(): print 'start foo()' ## only pass here when first time call .next() n = 3 for i in range(1,n+1): print 'in for()' print 'yield %s' % i yield i ## return i when call .next() print 'back to for()' ## start from here when call .next() again if __name__ == '__main__': print 'start main' print 'init main vars' f = foo() i = 0 n = 10 print 'f: %s' % f print 'i: %s' % i print 'n: %s' % n for x in range(0,n): print 'f.next()' i = f.next() print 'print i' print i print 'in main' print 'call again f.next()' print f.next() print 'exit'
$ ./t1.py start main init main vars f: <generator object foo at 0xb73e69dc> i: 0 n: 10 f.next() start foo() in for() yield 1 print i 1 in main f.next() back to for() in for() yield 2 print i 2 in main f.next() back to for() in for() yield 3 print i 3 in main f.next() back to for() Traceback (most recent call last): File "./t.py", line 23, ini = f.next() StopIteration
#!/bin/env python def foo(): for i in range(0,5): yield i f = foo() for n in f: print 'n=%s' % n
$ ./t2.py n=0 n=1 n=2 n=3 n=4Wish this helps. regards, Stanley Huang
Comments
Post a Comment