mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Coroutine example:  controlling multiple instances of a single function
 | |
| 
 | |
| from Coroutine import *
 | |
| 
 | |
| # fringe visits a nested list in inorder, and detaches for each non-list
 | |
| # element; raises EarlyExit after the list is exhausted
 | |
| def fringe( co, list ):
 | |
|     for x in list:
 | |
|         if type(x) is type([]):
 | |
|             fringe(co, x)
 | |
|         else:
 | |
|             co.detach(x)
 | |
| 
 | |
| def printinorder( list ):
 | |
|     co = Coroutine()
 | |
|     f = co.create(fringe, co, list)
 | |
|     try:
 | |
|         while 1:
 | |
|             print co.tran(f),
 | |
|     except EarlyExit:
 | |
|         pass
 | |
|     print
 | |
| 
 | |
| printinorder([1,2,3])  # 1 2 3
 | |
| printinorder([[[[1,[2]]],3]]) # ditto
 | |
| x = [0, 1, [2, [3]], [4,5], [[[6]]] ]
 | |
| printinorder(x) # 0 1 2 3 4 5 6
 | |
| 
 | |
| # fcmp lexicographically compares the fringes of two nested lists
 | |
| def fcmp( l1, l2 ):
 | |
|     co1 = Coroutine(); f1 = co1.create(fringe, co1, l1)
 | |
|     co2 = Coroutine(); f2 = co2.create(fringe, co2, l2)
 | |
|     while 1:
 | |
|         try:
 | |
|             v1 = co1.tran(f1)
 | |
|         except EarlyExit:
 | |
|             try:
 | |
|                 v2 = co2.tran(f2)
 | |
|             except EarlyExit:
 | |
|                 return 0
 | |
|             co2.kill()
 | |
|             return -1
 | |
|         try:
 | |
|             v2 = co2.tran(f2)
 | |
|         except EarlyExit:
 | |
|             co1.kill()
 | |
|             return 1
 | |
|         if v1 != v2:
 | |
|             co1.kill(); co2.kill()
 | |
|             return cmp(v1,v2)
 | |
| 
 | |
| print fcmp(range(7), x)  #  0; fringes are equal
 | |
| print fcmp(range(6), x)  # -1; 1st list ends early
 | |
| print fcmp(x, range(6))  #  1; 2nd list ends early
 | |
| print fcmp(range(8), x)  #  1; 2nd list ends early
 | |
| print fcmp(x, range(8))  # -1; 1st list ends early
 | |
| print fcmp([1,[[2],8]],
 | |
|            [[[1],2],8])  #  0
 | |
| print fcmp([1,[[3],8]],
 | |
|            [[[1],2],8])  #  1
 | |
| print fcmp([1,[[2],8]],
 | |
|            [[[1],2],9])  # -1
 | |
| 
 | |
| # end of example
 | 
