diff options
author | Guido van Rossum <guido@python.org> | 1993-10-30 12:38:16 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1993-10-30 12:38:16 (GMT) |
commit | 102ababef924ced3a495dda4bda6548ad898070d (patch) | |
tree | 50512cd140b10c55ef7670e0888d81770054126c /Demo/classes/Rev.py | |
parent | becec31f170e656bc49163f7a50b30238218876a (diff) | |
download | cpython-102ababef924ced3a495dda4bda6548ad898070d.zip cpython-102ababef924ced3a495dda4bda6548ad898070d.tar.gz cpython-102ababef924ced3a495dda4bda6548ad898070d.tar.bz2 |
Initial revision
Diffstat (limited to 'Demo/classes/Rev.py')
-rwxr-xr-x | Demo/classes/Rev.py | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/Demo/classes/Rev.py b/Demo/classes/Rev.py new file mode 100755 index 0000000..5cf4602 --- /dev/null +++ b/Demo/classes/Rev.py @@ -0,0 +1,89 @@ +# 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:] |