Application of Function name
A function name is a variable, but it is a special variable that can be executed in conjunction with parentheses.
1. memory address of Function name
1 def func (): 2 Print (" hehe ") 3 Print # function func at 0x02969c90
2. Function name can be assigned to other variables
def func (): Print (" hehe ") Print # assign a function as a variable to another variable a () # function call func ()
3. Function names can be used as elements of a container class
1 deffunc1 ():2 Print("HAHA1")3 defFunc2 ():4 Print("HAHA2")5 deffunc3 ():6 Print("HAHA3")7 defFunc4 ():8 Print("HAHA4")9LST = [Func1,func2,func3,func4]#list memory is the memory address of the functionTen forIinchLST: OneI ()
4. Function name can be used as parameter of function
def func (): print ( " eat " ) def Func2 (FN): print ( " I am func2 " ) FN () # Perform the FN passed over print ( " I'm func2 " ) Func2 (func) # function func as parameter to pass FUNC2 parameters fn
5, function name can be used as the return value of the function
deffunc1 ():Print("here is the function 1") defFunc2 ():Print("here is the function 2") Print("here is the function 1") returnFUNC2FN= Func1 ()#Execute function 1, function 1 returns the function 2, when FN points to the above function 2FN ()#perform the functions returned above
Second, closed package
What do you mean, closures? A closure is an inner function, a reference to a variable of an outer layer function (non-global), called a closed packet
def func1 (): " Alex " def Func2 (): Print # Closed Package Func2 () func1 ( )
Question: The closure in class is to let memory remember a variable? function execution Complete can you remember this variable in Houhai?
We can use __CLOSURE__ to detect whether a function is closed, use the name __closure__ to return a cell is a closure, return none is not a closure
def func1 (): " Alex " def Func2 (): Print # Closed Package Func2 () print(func2. __closure__# (<cell at 0x03634b90:str object at 0x03424980>,)func1 ()
Question, how do I adjust the outside function?
def outer (): " Alex " # intrinsic functions def inner (): Print (name) return # Access external function, get function address to intrinsic function # access intrinsic function
# What if multiple layers are nested? It's simple, just a layer of layers to go back to the outer layer.
def func1 (): def Func2 (): def func3 (): Print (" hehe ") return func3 return func2func1 () () ()
Examples of closures: (Web crawler Applications!) )
fromUrllib.requestImportUrlopendefBut (): Content= Urlopen ("http://www.xiaohua100.cn/index.html"). Read ()defget_content ():returncontentreturnGET_CONTENTFN= but ()#It's time to start loading the 100.#What 's the need? Do not need to be in the practice of the content? Often time-consuming, network connection operation.Content = fn ()#Get contentPrint(content) Content2= FN ()#Get content backPrint(Content2)
Third, the first knowledge of the decorative device
Write code opening and closing principle: Open the function extension, modify the code closure. You can add functionality to the original code, but you cannot modify the code
Adorner version
defcreate_people ():Print("Nu wa is very powerful, pinch a clay figurine to blow the tone will become a person! ")#create_people ()defWater (FN):definner ():Print("watering first .") fn ()Print("Fertilization") returnInner#func = water (create_people)#func ()Create_people = Water (create_people)#function names, like variable names, can be assigned to other variablesCreate_people ()
Version with a syntactic sugar
@waterdefcreate_people ():Print("Nu wa is very powerful, pinch a clay figurine to blow the tone will become a person! ")#create_people ()defWater (FN):definner ():Print("watering first .") fn ()Print("Fertilization") returnInner#func = water (create_people)#func ()#create_people = Water (create_people) # function name and variable name, can be assigned to other variablesCreate_people ()
Note: It can be understood that a function is re-written, which wraps the original function in the top
That is, the function that needs to add function is wrapped in def/def inner code block
Python-fullstack-s13-day11-python Foundation