Live data from Hacker News

Charming Python: Functional programming in Python

ibm.com

11–20 of 26 posts

Re: Charming Python: Functional programming in Python

#11
post #9
post #2

Ever since I've dabbled a bit with Lisp my Python (and javascript) code has become much more functional-y. Still not sure whether this is a good or bad thing.

I think it's a double-edged sword. I've both written and read code in non-functional languages where the "easy" way of doing it is thrown aside for the "cool functional" way of doing it. Leading to code which was more fun to write, looks cooler, but is also hard to read and written in a different idiom to the actual programming language. Bad. I'm 100% guilty of this, although I try to stay vigilant. The other day I r…

Usually list comprehensions are a much cleaner way to write a map. This I love.

Personally what I love most about using more functional code aren't the clever lambda's and stuff, I actually try to avoid that because it looks weird in Python. What's really awesome is enclosing named functions inside bigger functions and using closures.

The result is code where:

1. nobody can, by accident or intentionally, use inner functions of your algorithm,

2. self-documented code (function name says what the code block does)

3. you aren't passing a gazillion parameters around

4. or making everything messy with a bunch of unneeded OOP code. [I don't like useless OOP code. Objects-just-for-the-sake-of-encapsulation are silly.]

edited for wall-of-text

Re: Charming Python: Functional programming in Python

#14
This article was written in 2001, and python now includes first-class constructs for many of these.

Map:

  >>> [ord(char) for char in "Hello"]
  [72, 101, 108, 108, 111]
Filter:

  >>> [x for x in xrange(10) if x % 2]
  [1, 3, 5, 7, 9]
For laziness, use parenthesis to turn the above list comprehensions into a generator comprehension. Though I don't demonstrate it, you can work over infinite sequences of objects this way with constant memory usage (without allocating all of them upfront).

  >>> gen = (x for x in range(10) if x % 2)
  >>> gen
   at 0xb729f6bc>
  >>> for element in gen:
  ...    print element
  ... 
  1
  3
  5
  7
  9

Alice, the rabbit hole begins here --> http://docs.python.org/library/itertools.html

Re: Charming Python: Functional programming in Python

#16
post #11
post #9

Earlier quoted context omitted.

I think it's a double-edged sword. I've both written and read code in non-functional languages where the "easy" way of doing it is thrown aside for the "cool functional" way of doing it. Leading to code which was more fun to write, looks cooler, but is also hard to read and written in a different idiom to the actual programming language. Bad. I'm 100% guilty of this, although I try to stay vigilant. The other day I r…

Usually list comprehensions are a much cleaner way to write a map. This I love. Personally what I love most about using more functional code aren't the clever lambda's and stuff, I actually try to avoid that because it looks weird in Python. What's really awesome is enclosing named functions inside bigger functions and using closures. The result is code where: 1. nobody can, by accident or intentionally, use inner fu…

> Usually list comprehensions are a much cleaner way to write a map.

But the first makes my intent clearer than the second:

    map(f, xs)

    [f(x) for x in xs]
In Python, where creating anonymous functions is syntactically expensive, list-comprehension syntax may be cheaper in many cases, but it's not clearer. When I want to map or filter something, I want to _say_ that I'm mapping or filtering, not explain to Python how to map or filter that thing in terms of list-comprehension syntax. Nor do I want to burden the reader with interpreting that syntax to figure out that it's a mapping or filtering operation.

I want my code to say what I mean, not just evaluate to what I mean.

Re: Charming Python: Functional programming in Python

#18
post #11

Earlier quoted context omitted.

Usually list comprehensions are a much cleaner way to write a map. This I love. Personally what I love most about using more functional code aren't the clever lambda's and stuff, I actually try to avoid that because it looks weird in Python. What's really awesome is enclosing named functions inside bigger functions and using closures. The result is code where: 1. nobody can, by accident or intentionally, use inner fu…

> Usually list comprehensions are a much cleaner way to write a map. But the first makes my intent clearer than the second: map(f, xs) [f(x) for x in xs] In Python, where creating anonymous functions is syntactically expensive, list-comprehension syntax may be cheaper in many cases, but it's not clearer. When I want to map or filter something, I want to _say_ that I'm mapping or filtering, not explain to Python how t…

> I want my code to say what I mean, not just evaluate to what I mean.

This is an awesome rule of thumb. A more succinct version of Knuth's "Programs are meant to be read by humans and only incidentally for computers to execute"

> the first makes my intent clearer than the second:

I really think the beauty of list comprehensions may be in the eye of the beholder.

I personally find the list comprehension syntax easier to read than equivalent map syntax most of the time, especially (as you point out) for cases where you want an anonymous function (ie quite often), but even for simple ones like your example.

Doubly so when you start chaining map & filter functionality to do one thing. Statements like [ f(x) for x in xs if g(x) > 3 ] seem to read quite nicely for me. You only need to change two words and you have a pseudocode description: "f(x) for all x in xs where g(x) > 3".

This is obviously subjective, though, and maybe I'm in the minority. I knew list comprehensions before I knew Python, so I'll accept that makes me suspect.

(Edited for clarity)

Re: Charming Python: Functional programming in Python

#19

I think more people would read more ibm dev articles if they changed the css a little bit

Readability does a really really good job of cleaning it up.

Is there a way to link to a readability version of a document? Like http://readability.org/?url=example.com

Re: Charming Python: Functional programming in Python

#20
post #11

Earlier quoted context omitted.

Usually list comprehensions are a much cleaner way to write a map. This I love. Personally what I love most about using more functional code aren't the clever lambda's and stuff, I actually try to avoid that because it looks weird in Python. What's really awesome is enclosing named functions inside bigger functions and using closures. The result is code where: 1. nobody can, by accident or intentionally, use inner fu…

> Usually list comprehensions are a much cleaner way to write a map. But the first makes my intent clearer than the second: map(f, xs) [f(x) for x in xs] In Python, where creating anonymous functions is syntactically expensive, list-comprehension syntax may be cheaper in many cases, but it's not clearer. When I want to map or filter something, I want to _say_ that I'm mapping or filtering, not explain to Python how t…

>But the first makes my intent clearer than the second

That is entirely a matter of opinion. I would say python programmers with no functional background would find the list comprehension clearer, because that is the idiomatic python way.

May would have no idea what map even does without looking it up on the net.

Post reply on HN