# A class which presents the reverse of a sequence without duplicating it. # From: "Steven D. Majewski" # 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:]

AltStyle によって変換されたページ (->オリジナル) /