mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Found them using:: find . -name '*.py' | while read i ; do grep 'def[^(]*( ' $i /dev/null ; done find . -name '*.py' | while read i ; do grep ' ):' $i /dev/null ; done (I was doing this all over my own code anyway, because I'd been using spaces in all defs, so I thought I'd make a run on the Python code as well. If you need to do such fixes in your own code, you can use xx-rename or parenregu.el within emacs.)
		
			
				
	
	
		
			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.back(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
 |