2 A class which presents the reverse of a sequence without duplicating it.
3 From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
5 It works on mutable or inmutable sequences.
7 >>> chars = list(Rev('Hello World!'))
8 >>> print ''.join(chars)
11 The .forw is so you can use anonymous sequences in __init__, and still
12 keep a reference the forward sequence. )
13 If you give it a non-anonymous mutable sequence, the reverse sequence
14 will track the updated values. ( but not reassignment! - another
15 good reason to use anonymous values in creating the sequence to avoid
16 confusion. Maybe it should be change to copy input sequence to break
17 the connection completely ? )
21 >>> for n in rnn: print n
26 >>> for n in range(4, 6): nnn.append(n) # update nnn
28 >>> for n in rnn: print n # prints reversed updated values
38 >>> for n in rnn: print n # prints reversed values of old nnn
47 >>> WH = Rev('Hello World!')
48 >>> print WH.forw, WH.back
49 Hello World! !dlroW olleH
50 >>> nnn = Rev(range(1, 10))
52 [1, 2, 3, 4, 5, 6, 7, 8, 9]
54 [9, 8, 7, 6, 5, 4, 3, 2, 1]
58 <1, 2, 3, 4, 5, 6, 7, 8, 9>
63 def __init__(self
, seq
):
70 def __getitem__(self
, j
):
71 return self
.forw
[-(j
+ 1)]
75 if isinstance(seq
, list):
78 elif isinstance(seq
, tuple):
81 elif isinstance(seq
, str):
87 outstrs
= [str(item
) for item
in self
.back
]
88 return wrap
[:1] + sep
.join(outstrs
) + wrap
[-1:]
92 return doctest
.testmod(Rev
)
94 if __name__
== "__main__":