As a programming language feature , Closures are supported by many programming languages ,Python No exception . So called closure , stay Python A function that carries one or more free quantities . The free quantity of a closure function is not a parameter of the function , It's the environment variable when the function is generated . Once the closure is generated , Free variables are bound to functions , Even if you leave the environment that created it , The amount of freedom is still valid . To sum up , The concept of closure has three main points .
There is a good example to help beginners understand closures . We know , Almost all the computing modules , such as Python Built in standard math module math, The logarithmic function provided can only be calculated with 2 Bottom 、 With e At the bottom and with 10 Three logarithms at the base .
>>> import math
>>> math.log(math.e) # Return to e Bottom e The logarithmic
1.0
>>> math.log2(4) # Return to 2 Bottom 4 The logarithmic
2.0
>>> math.log10(1000) # Return to 10 Bottom 1000 The logarithmic
3.0
If you want to calculate with a Bottom b The logarithmic , You need to use the logarithmic bottoming formula .
l o g a b = l o g 10 b l o g 10 a log_ab=\frac{log_{10}b}{log_{10}a} logab=log10alog10b
>>> def glog(b, a): # Return to a Bottom b The logarithmic
return math.log(b)/math.log(a)
>>> glog(25, 5) # # Return to 5 Bottom 25 The logarithmic
2.0
Of course, we can define a function like the code above glog(), Calculate logarithms based on any number , But you always have to enter two parameters at a time , and math Modular log()、log2()、log10() Function styles are inconsistent . If you use closures , Can generate and math The style of logarithmic functions is consistent .
>>> def log_factory(n): # Define a closure generating function
def log_n(x): # Generating closures
return math.log(x)/math.log(n) # The closure carries the environment parameters n
return log_n # Back to closure
>>> log5 = log_factory(5) # Generating closures with closure generators
>>> log7 = log_factory(7) # Generating closures with closure generators
>>> log5(25) # The free quantity carried by the closure is 5
2.0
>>> log7(49) # The free quantity carried by the closure is 7
2.0
Above code , Firstly, a logarithmic function generator is designed log_factory(), Enter an integer n, Just return one to n Base logarithmic function . The generator is then used to generate two closure functions , A group called log5, A group called log7. Finally, verify , Everything is exactly the same as we thought .
The example cited in this article , From my new book 《Python The way of Master Cultivation 》, There are many similar examples in the book . The book has been officially launched and pre sold in Jingdong and Dangdang , During the period of double 11, the preferential power is unprecedented ( Discount time :11 month 9 Japan ~11 month 11 Japan ). If you think this book is good , Don't miss the moment . Students who want to sign , Please pay attention to the official account. “Python Homework counselor ”, reply “Python The way of Master Cultivation ”, You will receive instructions on how to purchase the signature version .
Channel one : Jingdong self owned books
Channel 2 : Dangdang self owned books
Channel 3 : Signature of the author
Price and preferential measures are subject to the actual release of each platform .