wasm-demo/demo/ermis-f/python_m/cur/0766

76 lines
2.5 KiB
Plaintext

From: akuchlin at cnri.reston.va.us (Andrew M. Kuchling)
Date: Fri, 23 Apr 1999 09:59:20 -0400 (EDT)
Subject: opening more than 1 file
In-Reply-To: <7fpteh$cik$1@news1.xs4all.nl>
References: <371CB255.5FCAFBAF@solair1.inter.NL.net>
<371CCAE0.7DE87F8A@aw.sgi.com>
<7fpteh$cik$1@news1.xs4all.nl>
Message-ID: <14112.31139.164770.168982@amarok.cnri.reston.va.us>
Content-Length: 2095
X-UID: 766
Gornauth writes:
>>files = map(lambda i: open("file%02d"%i, 'w'), range(N))
>
>I'm not completely sure how that one-liner works. To be honest, I have no
>clue whatsoever.
It would be equally workable to just use a for loop:
files = []
for i in range(N):
files.append( open("file%02d"%i, 'w') )
Using map() is tricky, but lets you keep the line count down;
generally one shouldn't care too much about line count. :)
Take it step by step:
* What does range(N) do? It returns a list containing the
numbers 0,1,2, ... that are less than N. range(5) returns [0, 1, 2,
3, 4].
* What does map() do? map(F, L), where F is some function and
L is some list (actually, any sequence type) returns a new list
containing the result of F applied to each element of L.
map(F, range(N)) returns [ F(0), F(1), ... F(N-1) ].
map(string.upper, ["This", "is", "a", "test"] ) returns
['THIS', 'IS', 'A', 'TEST']
* What does lambda do? It defines a function which doesn't
have a name (it's an anonymous function), and can only contain an
expression whose value is returned. It's possible to assign the
anonymous function to a name, and it will act like any other Python
function.
>>>f = lambda x: x+1
>>> f(0)
1
>>> f(3)
4
However, to define a named function it's clearer to just use
def f(x): return x+1 . lambda is therefore usually used with map()
and its cousins filter() and reduce(), where you often need a function
which does something simple. In that case, the function is only
needed for that one map(), so people are reluctant to write:
def opener(i): return open("file%02d"%i, 'w')
files = map(opener, range(N) )
The above two lines are equivalent to the one-liner using lambda; the
only difference is that now there's an opener() function lying around
in the namespace.
--
A.M. Kuchling http://starship.python.net/crew/amk/
... but whenever optimization comes up, people get sucked into debates about
exciting but elaborate schemes not a one of which ever gets implemented;
better to get an easy 2% today than dream about 100% forever.
-- Tim Peters, 22 Mar 1998