Since I, in retrospect, made the wrong choice when cutting down a Python course to four hours and messed up the decorator exercise, I promised the attendants that I'd make a post about closures and decorators and explain it better - this is my attempt to do so.
Functions are objects, too. In fact, in Python they are First Class Objects - that is, they can be handled like any other object with no special restrictions. This gives us some interesting options, and I'll try to move through them from the bottom up.
A very basic case of using the fact that functions are objects is to use them as you would a function pointer in C; pass it into another function that will use it. To illustrate this, we'll take a look at the implementation of a repeat function - that is, a function that accepts another function as argument together with a number, and then calls the passed function the specified number of times:
>>> def greeter():
... print("Hello")
...
>>> #An implementation of a repeat function
>>> def repeat(fn, times):
... for i in range(times):
... fn()
...
>>> repeat(greeter, 3)
Hello
Hello
Hello
>>>This pattern is used in a large number of ways - passing a comparison function to a sorting algorithm, passing a decoder function to a parser, and in general specializing the behaviour of a function, or passing a specific parts of a job to be done into a function that abstracts the work flow (i.e. sort() knows how to sort lists, compare() knows how to compare elements).
Functions can also be declared in the body of another function, which gives us another important tool. In the most basic case, this can be used to "hide" utility functions in the scope of the function that uses them:
... def is_integer(value):
... try:
... return value == int(value)
... except:
... return False
... for v in values:
... if is_integer(v):
... print(v)
...
>>> print_integers([1,2,3,"4", "parrot", 3.14])
1
2
3
Functions are objects, too. In fact, in Python they are First Class Objects - that is, they can be handled like any other object with no special restrictions. This gives us some interesting options, and I'll try to move through them from the bottom up.
A very basic case of using the fact that functions are objects is to use them as you would a function pointer in C; pass it into another function that will use it. To illustrate this, we'll take a look at the implementation of a repeat function - that is, a function that accepts another function as argument together with a number, and then calls the passed function the specified number of times:
CODE:
>>> #A very simple function>>> def greeter():
... print("Hello")
...
>>> #An implementation of a repeat function
>>> def repeat(fn, times):
... for i in range(times):
... fn()
...
>>> repeat(greeter, 3)
Hello
Hello
Hello
>>>This pattern is used in a large number of ways - passing a comparison function to a sorting algorithm, passing a decoder function to a parser, and in general specializing the behaviour of a function, or passing a specific parts of a job to be done into a function that abstracts the work flow (i.e. sort() knows how to sort lists, compare() knows how to compare elements).
Functions can also be declared in the body of another function, which gives us another important tool. In the most basic case, this can be used to "hide" utility functions in the scope of the function that uses them:
CODE:
>>> def print_integers(values):... def is_integer(value):
... try:
... return value == int(value)
... except:
... return False
... for v in values:
... if is_integer(v):
... print(v)
...
>>> print_integers([1,2,3,"4", "parrot", 3.14])
1
2
3
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/301743/viewspace-734440/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/301743/viewspace-734440/