| # A class which presents the reverse of a sequence without duplicating it. | 
 | # From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu> | 
 |  | 
 | # It works on mutable or inmutable sequences. | 
 | # | 
 | # >>> for c in Rev( 'Hello World!' ) : sys.stdout.write( c ) | 
 | # ... else: sys.stdout.write( '\n' ) | 
 | # ...  | 
 | # !dlroW olleH | 
 | # | 
 | # The .forw is so you can use anonymous sequences in __init__, and still | 
 | # keep a reference the forward sequence. )  | 
 | # If you give it a non-anonymous mutable sequence, the reverse sequence | 
 | # will track the updated values. ( but not reassignment! - another  | 
 | # good reason to use anonymous values in creating the sequence to avoid | 
 | # confusion. Maybe it should be change to copy input sequence to break | 
 | # the connection completely ? ) | 
 | # | 
 | # >>> nnn = range( 0, 3 ) | 
 | # >>> rnn = Rev( nnn ) | 
 | # >>> for n in rnn: print n | 
 | # ...  | 
 | # 2 | 
 | # 1 | 
 | # 0 | 
 | # >>> for n in range( 4, 6 ): nnn.append( n )	# update nnn | 
 | # ...  | 
 | # >>> for n in rnn: print n	# prints reversed updated values | 
 | # ...  | 
 | # 5 | 
 | # 4 | 
 | # 2 | 
 | # 1 | 
 | # 0 | 
 | # >>> nnn = nnn[1:-1] | 
 | # >>> nnn | 
 | # [1, 2, 4] | 
 | # >>> for n in rnn: print n	# prints reversed values of old nnn | 
 | # ...  | 
 | # 5 | 
 | # 4 | 
 | # 2 | 
 | # 1 | 
 | # 0 | 
 | # >>>  | 
 | # | 
 | # WH = Rev( 'Hello World!' ) | 
 | # print WH.forw, WH.back | 
 | # nnn = Rev( range( 1, 10 ) ) | 
 | # print nnn.forw | 
 | # print nnn | 
 | #  | 
 | # produces output: | 
 | #  | 
 | # Hello World! !dlroW olleH | 
 | # [1, 2, 3, 4, 5, 6, 7, 8, 9] | 
 | # [9, 8, 7, 6, 5, 4, 3, 2, 1] | 
 | #  | 
 | # >>>rrr = Rev( nnn )  | 
 | # >>>rrr | 
 | # <1, 2, 3, 4, 5, 6, 7, 8, 9>	 | 
 |  | 
 | from string import joinfields | 
 | class Rev: | 
 | 	def __init__( self, seq ): | 
 | 		self.forw = seq | 
 | 		self.back = self | 
 | 	def __len__( self ): | 
 | 		return len( self.forw ) | 
 | 	def __getitem__( self, j ): | 
 | 		return self.forw[ -( j + 1 ) ] | 
 | 	def __repr__( self ): | 
 | 		seq = self.forw | 
 | 		if type(seq) == type( [] ) :  | 
 | 			wrap = '[]' | 
 | 			sep = ', ' | 
 | 		elif type(seq) == type( () ) :  | 
 | 			wrap = '()' | 
 | 			sep = ', ' | 
 | 		elif type(seq) == type( '' ) :  | 
 | 			wrap = '' | 
 | 			sep = '' | 
 | 		else:  | 
 | 			wrap = '<>' | 
 | 			sep = ', '  | 
 | 		outstrs = [] | 
 | 		for item in self.back : | 
 | 			outstrs.append( str( item ) ) | 
 | 		return wrap[:1] + joinfields( outstrs, sep ) + wrap[-1:] |