Confessions of a Python fanboy

Masklinn masklinn at masklinn.net
Fri Jul 31 14:15:09 EDT 2009


On 31 Jul 2009, at 18:24 , Terry Reedy wrote:
> Masklinn wrote:
>
>> #each is simply a method that takes a function (called blocks in  
>> ruby). One could call it a higher-order method I guess.
>> It's an implementation of the concept of internal iteration:  
>> instead of collections yielding iterator objects, and programmers  
>> using those through specially-built iteration constructs (e.g. `for… 
>> in`), collections control iteration over themselves (the iteration  
>> is performed "inside" the collection, thus the "internal" part) and  
>> the programmer provides the operations to perform at each iterative  
>> step through (usually) a function.
>
> Python's iterator protocol was developed in part to avoid the  
> (inside-out) callback style of programming. Writing virtual  
> collections as generator functions instead of iterator or iterable  
> classes saves a lot of boilerplate code. The itertools modules shows  
> how nicely iterators can be composed in a way that is much more  
> awkward with callbacks.
>
>> In Python (assuming we had anonymous defs and an each method on  
>> lists), the following loop:
>>    for item in some_list:
>>        do_something(item)
>>        do_something_else(item)
>>    some_list.each((def (item):
>>        do_something(item)
>>        do_something_else(item)
>>    ))
>
> And how does Ruby do the equivalent of
>
> def double(it):
>  for i in it:
>    yield 2*i
>
> for i,j in zip(double(some_list), some_gen_func(args)):
>  print(do_something(i+j,i-j))


Somethign along the lines of

     some_list.map{|e| 2*e}.zip(some_gen_func(args)).each {|i, j|
         puts(do_something(i+j, i-j))
     }

The `#each` call after `#zip` is not actually necessary, but I find it  
clearer. Oh, and some_gen_func and do_something probably wouldn't work  
that way (as I said above, Ruby isn't big on named functions and  
doesn't actually have them)


More information about the Python-list mailing list