944,175 Members | Top Members by Rank

Ad:
  • Python Discussion Thread
  • Marked Solved
  • Views: 12470
  • Python RSS
Aug 11th, 2006
0

Closure in Python

Expand Post »
What is a closure? I keep reading this word in programming, but never got a good explanation.
Similar Threads
Reputation Points: 625
Solved Threads: 211
Posting Virtuoso
Ene Uran is offline Offline
1,704 posts
since Aug 2005
Aug 12th, 2006
0

Re: Closure in Python

A closure is a block of code that can be passed as an argument to a function call. In languages like Lisp and Ruby closures are easily implemented. In Python you can do it, but it is a bit more code. Lambda is often used for that.

Here would be an example ...
[php]class Employee:
"""sets up an employee structure/record"""
pass

# some employee data
olaf = Employee()
olaf.name = "olaf"
olaf.salary = 55

nathan = Employee()
nathan.name = "nathan"
nathan.salary = 175

def pay(amount):
return lambda emp: emp.salary > amount

# set the pay_scale, any amount above 150 is high
pay_scale = pay(150)

print pay_scale # <function <lambda> at 0x009D70F0>

# now set the employee instance
# feeds the emp data to lambda code returned by function pay()
# this constitutes the block of code of the closure
is_high = pay_scale(nathan)

print "Is nathan paid high? ", is_high # Is nathan high paid? True

# set another employee instance
is_high = pay_scale(olaf)

print "Is olaf paid high? ", is_high # Is olaf high paid? False
[/php]
Just found a somewhat simpler example ...
[php]# define a function within a function and return it to the calling scope
# the inner function can access variables in the calling function, i.e. its closure

def times(n):
def _f(x):
return x * n
return _f

t3 = times(3)
print t3 # <function _f at 0x009D70F0>
print t3(7) # 21
[/php]
Here the inner function _f() is the block of code of the closure, similar to the lambda code in the first example.
Last edited by vegaseat; Aug 12th, 2006 at 1:42 pm.
Moderator
Reputation Points: 1333
Solved Threads: 1404
DaniWeb's Hypocrite
vegaseat is offline Offline
5,792 posts
since Oct 2004
Aug 22nd, 2006
0

Re: Closure in Python

Click to Expand / Collapse  Quote originally posted by Ene Uran ...
What is a closure? I keep reading this word in programming, but never got a good explanation.
People always come up with the generator case, and I think that's the worst way of all to show off closures. Where they really come in handy is introducing lexical scoping.

Lexical scoping just means that the environment is defined by the context in the code, not in runtime. An example in Common Lisp (because I don't really know Python and my predecessor explained it using PHP):

Python Syntax (Toggle Plain Text)
  1. (defun add-to-list (list number)
  2. (map 'list
  3. (lamba (x)
  4. (+ x number))
  5. list)))
  6.  

This is a function called add-to-list that takes a list and adds a number to each of its elements. defun defines a function, map applies a
function to each element of a list, and lambda defines an anonymous function.

Now consider the anonymous function - it references both X, a parameter to the function, and NUMBER, which is a parameter to add-to-list. It must have access to NUMBER regardless of the context in which it's called. So it's placed into a closure, where all the variables in its environment are available. In that way, MAP doesn't have to worry about providing access to variables.

This is the primary advantage closures have over other function-variable patterns, like function pointers or functors.
Anonymous functions declared in-place "just work."
Reputation Points: 11
Solved Threads: 5
Light Poster
azimuth0 is offline Offline
36 posts
since May 2006
Aug 23rd, 2006
0

Re: Closure in Python

Thank you vegaseat and azimuth0. I have to play with that for a while to comprehent it. By the way, vegaseat's code is Python put into a PHP code field to give it some color highlighting (use a [php] tags instead of [code]).
Reputation Points: 625
Solved Threads: 211
Posting Virtuoso
Ene Uran is offline Offline
1,704 posts
since Aug 2005

This thread is solved

Either the thread starter or a moderator has marked this thread as solved. You can most likely trust the responses and answers given. There is most likely no reason for any further responses to be posted here. If you have a related question, please start a new thread in this forum instead.

This thread is more than three months old

No one has posted to this discussion for at least three months. Please let old threads die and do not reply to them unless you feel you have something new and valuable to contribute that absolutely must be added to make the discussion complete. Otherwise, please start a new thread in this forum instead.
Message:
Previous Thread in Python Forum Timeline: Need help with looping, pickling, data file
Next Thread in Python Forum Timeline: Connection of python and mysql





About Us | Contact Us | Advertise | Acceptable Use Policy
Forum Index | Build Custom RSS Feed


Follow us on Twitter


© 2011 DaniWeb® LLC