一:函数名的作用(函数名的命名规则跟变量一样)
1,作为函数的地址

def func(): pass print(func)
2,作为变量

def func(): print(123) f=func f1=f f2=f1 f2()
3,作为函数的参数

def func(): print(23) def func1(f): f() func1(func)
4,作为函数的返回值

def func(): def inner(): print(123) return inner
5,作为容器的元素

def func1(): pass def func2(): pass def func3(): pass a=[func1,func2,func3]
函数名是第一类对象。
二,闭包函数
内部函数对外部函数的的变量(非全局变量)的引用,并返回,就会形成递归。一般函数会在调用的时候在内存中产生一个空间,该空间会随函数的结束而消失;在递归函数中,该空间不会随函数的结束而消失。能够节省空间。

def func(a): def inner(): print(a) return inner a=3 f=func(a) f()
globals() 返回全局变量的字典
locals()返回当前位置 局部变量的字典

def func(): def inner(): a=3 print(globals()) print(locals()) inner() return inner print(globals()) print(locals()) func()
在全局空间,字典内容相同,在局部空间,字典内容不同。
如何判断闭包函数 f.__closure__

def func(a): def inner(): print(inner.__closure__) return a return inner
闭包的应用
装饰器,爬虫

import requests def func(url): def inner(): ret=requests.get(url) return ret.text return inner url="http://www.baidu.com" f=func(url) f1=f() print(f1)