Some "pythonic" suggestions for Python
Diez B. Roggisch
deets at nospam.web.de
Thu Nov 8 16:15:00 EST 2007
Frank Samuelson schrieb:
> I love Python, and it is one of my 2 favorite
> languages. I would suggest that Python steal some
> aspects of the S language.
>
> -------------------------------------------------------
> 1. Currently in Python
> def foo(x,y): ...
> assigns the name foo to a function object. Is this pythonic?
>
> Why not use the = operator like most other assignments?
> Define function objects as "function"s, let users put them where
> they want to. Get rid of lambda, get rid of def, only use =
> for assignments.
>
> foo = function(x,y) x+y*2 # Example S language code
> bar = foo
> bar(3,4)
> m = lapply( s, foo )
> bb = lapply(s, function(t) t[3]*4 )
>
> foo = func(x,y): x+y*2 # Possible python code
> bar = foo
> bar(3,4)
> m = barf( s, foo )
> bb = barf(s, func(t): t[3]*4 )
The whole purpose being that you have statements in lambdas - something
that has been proposed and rejected about a bazillion times. Read the
archives.
> -------------------------------------------------------
> 2. Allow sequences to be indices:
> >>> s=["hello", 6, 33, "none"]
> >>> x= [1,3]
> >>> [ s[y] for y in x] # Current verbose version
> [6, 'none']
> >>> s[x] # Simpler, clearer, more productive
>
> To quote a poster at http://www.thescripts.com/forum/thread22741.html,
> "While we are at it, I also don't understand why sequences can't be
> used as indices. Why not, say, l[[2,3]] or l[(2, 3)]? Why a special
> slice concept? " Isn't that unpythonic?
What has the one to do with the other? Slices are use- and powerful.
I'm not against this, but then what you call "verbose" is very concise
in my book - and concise enough to be used when the need arises, which
is seldom enough.
> --------------------------------------------------------
> 3. When I first started using python, I frequently used
> map, because I didn't want to have to learn the
> additional syntax of list comprehensions, which
> appeared very nonstructured.
>
> # Is this readable?
> b= [x+y for x in vec1 if x>0 for y in vec2 if y>x ]
Yes, I think it is readable. You could ask the same for the
parenthesis-overload in lisp - after all, it's just what you are
accustomed to.
> Perhaps a list comprehension syntax more like the rest
> of python. "for" could return a list given by continue
> arguments:
>
> b= for x in vec1 :
> if (x>0): continue # "returns" nothing
> continue for y in vec2:
> if (x>y): continue(x+y)
>
> Note that my code would actually return a list of lists
> rather than a single list like the list comprehension.
> More structured syntax opens the door to having much
> more complicated, yet still comprehensible (thus more
> pythonic), list comprehensions.
So it is _not_ a list comprehension, but all it does is to create
implicit lists?
I prefer list-comps. They allow for nested as well as flattened structures:
b= [x+y for x in vec1 if x>0 for y in vec2 if y>x ]
b= [[x+y for y in vec2 if y>x ] for x in vec1 if x>0]
Overall, I'd say you don't stand a chance that your proposals will be
adopted. They are minor variations of things that have been proposed &
rejected too often to count - and to be honest: it get's tiresome
beating the same old horses again and again...
Diez
More information about the Python-list
mailing list