Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #9791 > unrolled thread

Partial Function Application -- Advantages over normal function?

Started byKurian Thayil <kurianmthayil@gmail.com>
First post2011-07-18 15:43 +0530
Last post2011-07-18 16:17 -0400
Articles 4 — 4 participants

Back to article view | Back to comp.lang.python


Contents

  Partial Function Application -- Advantages over normal function? Kurian Thayil <kurianmthayil@gmail.com> - 2011-07-18 15:43 +0530
    Re: Partial Function Application -- Advantages over normal function? Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2011-07-19 01:08 +1000
    Re: Partial Function Application -- Advantages over normal function? woooee <woooee@gmail.com> - 2011-07-18 12:23 -0700
      Re: Partial Function Application -- Advantages over normal function? Terry Reedy <tjreedy@udel.edu> - 2011-07-18 16:17 -0400

#9791 — Partial Function Application -- Advantages over normal function?

FromKurian Thayil <kurianmthayil@gmail.com>
Date2011-07-18 15:43 +0530
SubjectPartial Function Application -- Advantages over normal function?
Message-ID<mailman.1208.1310984052.1164.python-list@python.org>
Hi,

I am a newbie in python and would like to learn GUI programming. I would like 
to know what exactly is Partial Function Applicaton (functool.partial())? Or 
how is it advantageous compared to normal functions? Or is there any 
advantange? Thanks in advance.

Regards,
Kurian Thayil.

[toc] | [next] | [standalone]


#9809

FromSteven D'Aprano <steve+comp.lang.python@pearwood.info>
Date2011-07-19 01:08 +1000
Message-ID<4e244c64$0$29996$c3e8da3$5496439d@news.astraweb.com>
In reply to#9791
Kurian Thayil wrote:

> Hi,
> 
> I am a newbie in python and would like to learn GUI programming. I would
> like to know what exactly is Partial Function Applicaton
> (functool.partial())? Or how is it advantageous compared to normal
> functions? Or is there any advantange? Thanks in advance.

It is mostly for functional programming style.

But one lucky side-effect of the implementation is that partial functions
*may* sometimes be faster than the alternative written in pure Python,
provided the original function is written in C:


from functools import partial
from operator import add

def add_one(x):
    return add(1, x)  # Like 1+x

add_two = partial(add, 2)

from timeit import Timer
setup = "from __main__ import add_one, add_two"
t1 = Timer("add_one(42)", setup)
t2 = Timer("add_two(42)", setup)



And in action:

>>> t1.timeit()
0.7412619590759277
>>> t2.timeit()
0.3557558059692383

So in this example, the partial function is about twice as fast as the one
written in Python.

This does not necessarily apply for all functions, but it sometimes is
useful.


-- 
Steven

[toc] | [prev] | [next] | [standalone]


#9828

Fromwoooee <woooee@gmail.com>
Date2011-07-18 12:23 -0700
Message-ID<adc8083f-bfb4-4929-b267-e8280b13403a@t8g2000prm.googlegroups.com>
In reply to#9791
Partial can be used in a GUI program, like Tkinter, to send arguments
to functions.  There are other ways to do that as well as using
partial.  The following program uses partial to send the color to the
change_buttons function.
from Tkinter import *
from functools import partial

class App:
   def __init__(self, parent):
    self.my_parent = parent
    self.my_parent.geometry("200x100+10+10")

    self.R = list()
    for ctr, color in enumerate(("Red", "Blue", "Green")):
        btn = Radiobutton(self.my_parent, text=color, value=ctr+1,
                          command=partial(self.change_buttons, color))
        btn.grid(row = 2, column = ctr+1)
        btn.deselect()
        self.R.append(btn)
    self.R[0].select()
    self.change_buttons("Red")


   def change_buttons(self, color):
       self.my_parent.configure(bg=color)
       for btn in self.R:
            btn.configure(bg=color)

if __name__ == "__main__":
    root = Tk()
    root.title ("Color Option")
    app = App(root)
    root.mainloop()

[toc] | [prev] | [next] | [standalone]


#9834

FromTerry Reedy <tjreedy@udel.edu>
Date2011-07-18 16:17 -0400
Message-ID<mailman.1231.1311020265.1164.python-list@python.org>
In reply to#9828
On 7/18/2011 3:23 PM, woooee wrote:
> Partial can be used in a GUI program, like Tkinter, to send arguments
> to functions.  There are other ways to do that as well as using
> partial.  The following program uses partial to send the color to the
> change_buttons function.
> from Tkinter import *
> from functools import partial
>
> class App:
>     def __init__(self, parent):
>      self.my_parent = parent
>      self.my_parent.geometry("200x100+10+10")
>
>      self.R = list()
>      for ctr, color in enumerate(("Red", "Blue", "Green")):
>          btn = Radiobutton(self.my_parent, text=color, value=ctr+1,
>                            command=partial(self.change_buttons, color))
>          btn.grid(row = 2, column = ctr+1)

This is a nice illustration. For future reference: enumerate now takes a 
start value as second parameter. Given as 1, you do not need to remember 
to add 1 for each usage.

     for ctr, color in enumerate(("Red", "Blue", "Green"),1):
         btn = Radiobutton(self.my_parent, text=color, value=ctr,
                           command=partial(self.change_buttons, color))
         btn.grid(row = 2, column = ctr)

>          btn.deselect()
>          self.R.append(btn)
>      self.R[0].select()
>      self.change_buttons("Red")
>
>     def change_buttons(self, color):
>         self.my_parent.configure(bg=color)
>         for btn in self.R:
>              btn.configure(bg=color)
>
> if __name__ == "__main__":
>      root = Tk()
>      root.title ("Color Option")
>      app = App(root)
>      root.mainloop()


-- 
Terry Jan Reedy

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web