symbian-qemu-0.9.1-12/python-2.6.1/Demo/classes/Rev.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 '''
       
     2 A class which presents the reverse of a sequence without duplicating it.
       
     3 From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
       
     4 
       
     5 It works on mutable or inmutable sequences.
       
     6 
       
     7 >>> chars = list(Rev('Hello World!'))
       
     8 >>> print ''.join(chars)
       
     9 !dlroW olleH
       
    10 
       
    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 ? )
       
    18 
       
    19 >>> nnn = range(3)
       
    20 >>> rnn = Rev(nnn)
       
    21 >>> for n in rnn: print n
       
    22 ...
       
    23 2
       
    24 1
       
    25 0
       
    26 >>> for n in range(4, 6): nnn.append(n)   # update nnn
       
    27 ...
       
    28 >>> for n in rnn: print n     # prints reversed updated values
       
    29 ...
       
    30 5
       
    31 4
       
    32 2
       
    33 1
       
    34 0
       
    35 >>> nnn = nnn[1:-1]
       
    36 >>> nnn
       
    37 [1, 2, 4]
       
    38 >>> for n in rnn: print n     # prints reversed values of old nnn
       
    39 ...
       
    40 5
       
    41 4
       
    42 2
       
    43 1
       
    44 0
       
    45 
       
    46 #
       
    47 >>> WH = Rev('Hello World!')
       
    48 >>> print WH.forw, WH.back
       
    49 Hello World! !dlroW olleH
       
    50 >>> nnn = Rev(range(1, 10))
       
    51 >>> print nnn.forw
       
    52 [1, 2, 3, 4, 5, 6, 7, 8, 9]
       
    53 >>> print nnn.back
       
    54 [9, 8, 7, 6, 5, 4, 3, 2, 1]
       
    55 
       
    56 >>> rrr = Rev(nnn)
       
    57 >>> rrr
       
    58 <1, 2, 3, 4, 5, 6, 7, 8, 9>
       
    59 
       
    60 '''
       
    61 
       
    62 class Rev:
       
    63     def __init__(self, seq):
       
    64         self.forw = seq
       
    65         self.back = self
       
    66 
       
    67     def __len__(self):
       
    68         return len(self.forw)
       
    69 
       
    70     def __getitem__(self, j):
       
    71         return self.forw[-(j + 1)]
       
    72 
       
    73     def __repr__(self):
       
    74         seq = self.forw
       
    75         if isinstance(seq, list):
       
    76             wrap = '[]'
       
    77             sep = ', '
       
    78         elif isinstance(seq, tuple):
       
    79             wrap = '()'
       
    80             sep = ', '
       
    81         elif isinstance(seq, str):
       
    82             wrap = ''
       
    83             sep = ''
       
    84         else:
       
    85             wrap = '<>'
       
    86             sep = ', '
       
    87         outstrs = [str(item) for item in self.back]
       
    88         return wrap[:1] + sep.join(outstrs) + wrap[-1:]
       
    89 
       
    90 def _test():
       
    91     import doctest, Rev
       
    92     return doctest.testmod(Rev)
       
    93 
       
    94 if __name__ == "__main__":
       
    95     _test()