Confused with Functions and decorators

Chris Angelico rosuav at gmail.com
Sat Jul 19 07:03:55 EDT 2014


On Sat, Jul 19, 2014 at 8:52 PM, Jerry lu <nicholascannon1 at gmail.com> wrote:
> Ok so i am trying to learn this and i do not understand some of it. I also tried to searched the web but i couldnt find any answers.
>
> 1. I dont understand when i will need to use a function that returns another function.
> eg
>                    def outer():
>                          def inner():
>                                x = 5
>                           return inner
>
>      why not just use inner and forget about the whole outer function?
>
> 2. This is more yes or no question when you pass in a func into another func as a parameter do you need to specify the parameter that the func is being passed into as func?
> eg
>                       def passinto(func)
>                             pass
>
>                        def param():
>                              x = 5
>
>                         p = passinto(param)
>
> also is this above statement correct?????

In Python, a function is a real thing, on par with integers, lists,
modules, files, etc. You can create them, dispose of them, pass them
as parameters, receive them as return values, store them in lists,
everything. When you call outer(), it creates a function (which does
nothing useful, and then returns None) and returns a reference to it.
And yes, in that case, there's no particular value in that setup; but
an inner function can be a "closure" (you can look that up later):

def outer(x):
    def inner(y):
        return x + y
    return inner

The x inside inner() will refer to the x that was in scope when it was
created, so you can call outer() several times with different
arguments and get back different functions that do different things.

Since functions are objects of equal standing to any other (called
"first-class" objects - look that up too), you can pass them as
parameters just the same as you would any other type of object.
There's no reason to call an integer 'i', so there's no reason to call
a function 'func'. You can if you like, but it'll work the same
regardless. There is no magic happening here.

None of this has anything to do with decorators, though.

ChrisA



More information about the Python-list mailing list