Interesting talk on Python vs. Ruby and how he would like Python to have just a bit more syntactic flexibility.
Steve Howell
showell30 at yahoo.com
Thu Feb 18 22:57:35 EST 2010
On Feb 18, 3:04 pm, "sjdevn... at yahoo.com" <sjdevn... at yahoo.com> wrote:
> On Feb 18, 11:15 am, Steve Howell <showel... at yahoo.com> wrote:
>
> > def print_numbers()
> > [1, 2, 3, 4, 5, 6].map { |n|
> > [n * n, n * n * n]
> > }.reject { |square, cube|
> > square == 25 || cube == 64
> > }.map { |square, cube|
> > cube
> > }.each { |n|
> > puts n
> > }
> > end
>
> > IMHO there is no reason that I should have to name the content of each
> > of those four blocks of code, nor should I have to introduce the
> > "lambda" keyword.
>
> You could do it without intermediate names or lambdas in Python as:
> def print_numbers():
> for i in [ cube for (square, cube) in
> [(n*n, n*n*n) for n in [1,2,3,4,5,6]]
> if square!=25 and cube!=64 ]:
> print i
The problem with list comprehensions is that they read kind of out of
order. On line 2 you are doing the first operation, then on line 3
you are filtering, then on line 1 your are selecting, then on line 4
you are printing.
For such a small example, your code is still quite readable.
> But frankly, although there's no reason that you _have_ to name the
> content at each step, I find it a lot more readable if you do:
>
> def print_numbers():
> tuples = [(n*n, n*n*n) for n in (1,2,3,4,5,6)]
> filtered = [ cube for (square, cube) in tuples if square!=25 and
> cube!=64 ]
> for f in filtered:
> print f
The names you give to the intermediate results here are
terse--"tuples" and "filtered"--so your code reads nicely.
In a more real world example, the intermediate results would be
something like this:
departments
departments_in_new_york
departments_in_new_york_not_on_bonus_cycle
employees_in_departments_in_new_york_not_on_bonus_cycle
names_of_employee_in_departments_in_new_york_not_on_bonus_cycle
More information about the Python-list
mailing list