Fun with shifting bytes / Python translation

I’m trying to read what is referred to in this Python code as “weird
Microsoft Format” it is some sort of MicroSoft Real format. Anyway, I’ve no
problem reading in this data with my Ruby code, but I can’t make the math
work. I don’t understand how lamba or reduce work, for instance. I also
have examples of it in Pascal but it is no clearer? Anyone have any ideas?

Thanks

Mark

while (1):
    L=f.read(5)			# Read an entry
    if L=='': return index
    
    L=map(lambda x: ord(x), L[0:4])
    L.reverse()
    n=reduce(lambda x,y: x*256+y, L, 0L)
    # Index values are stored in a weird Microsoft format; the
    # following lines convert to something more reasonable.
    shift=24-((n>>24) & 0x7f)
    n=(n & 0x00ffffffL)  | 0x00800000L
    index.append((n >>shift)-1)
return index

NOTICE: This e-mail and any attachment(s) may contain confidential and
proprietary information of Goss International Corporation and/or its
subsidiaries and may be legally privileged. This e-mail is intended solely
for the addressee. If you are not the addressee, dissemination, copying or
other use of this e-mail or any of its content is strictly prohibited and
may be unlawful. If you are not the intended recipient please inform the
sender immediately and destroy the e-mail and any copies. All liability for
viruses is excluded to the fullest extent permitted by law. Any views
expressed in this message are those of the individual sender. No contract
may be construed by this e-mail.

[…]

I don’t understand how lamba or reduce work, for instance.
[…]
L=map(lambda x: ord(x), L[0:4])
L.reverse()
n=reduce(lambda x,y: x*256+y, L, 0L)

I don’t know about the math, but with regard to the lambdas, I suppose the
first creates an array containing the byte values of the string:

l = l.split(//).map{ |c| c[0] }
l.reverse!

and the second could be something like this:

n = 0
l.each {|i| n = n*256+i }

But I really don’t know Python.

Good luck.