Proposed new collection methods

Robert Kern rkern at ucsd.edu
Sun Aug 7 06:20:54 CEST 2005


Jeff Schwab wrote:
> Robert Kern wrote:
> 
>>Robert Kern wrote:
>>
>>>Christopher Subich wrote:
>>>
>>>>Dear Zeus no.  Find can be defined as:
>>>>def find(self, test=lambda x:1):
>>>>   try:
>>>>      item = (s for s in iter(self) if test(s)).next()
>>>>   except StopIteration:
>>>>      raise ValueError('No matching items in list')
>>>
>>>I would prefer that a find() operation return as soon as it locates an 
>>>item that passes the test. This generator version tests every item.
>>
>>Pardon me, I am retarded.
> 
> Why are you retarded?  Isn't the above code O(n)?
> 
> Forgive me for not understanding, I'm still awfully new to Python 
> (having come from Perl & C++), and I didn't see an explanation in the FAQ.

(s for s in iter(self) is test(s)) is a generator expression. It is 
roughly equivalent to

   def g(self, test=lambda x: True):
     for s in iter(self):
       if test(s):
         yield s

Now, if I were to do

   item = g(self, test).next()

the generator would execute the code until it reached the yield 
statement which happens when it finds the first item that passes the 
test. That item will get returned, and execution does not return to the 
generator again.

That implementation does indeed return as soon as it locates the first 
item, so yes, I was being retarded.

-- 
Robert Kern
rkern at ucsd.edu

"In the fields of hell where the grass grows high
  Are the graves of dreams allowed to die."
   -- Richard Harter




More information about the Python-list mailing list