函数嵌套与闭包函数
函数嵌套:
函数嵌套就是在函数内调用了其他函数
名称空间与作用域
名称空间:就是存放名字与值绑定关系的地方
名称空间分类:
1,内置名称空间:存放python解释器自带的名字,在解释器启动时生效,关闭就失效
2,全局名称空间:存放文件级别的名字(没有缩进),在执行文件的时候生效,在文件结束或者在文件执行期间被删除时失效
3,局部名称空间:存放函数内定义的名字,在调用函数时生效,调用结束失效
加载顺序:内置名称空间---》全局名称空间----》局部名称空间
查找名字顺序:局部名称空间----》全局名称空间----》内置名称空间 (查找时会从自己当前位置开始查找)
作用域:发挥作用的空间
1,全局作用域:包含的是内置名称空间与全局名称空间的名字。
特点:1,在任何位置都能访问的到
2,该范围内的名字会伴随程序整个生命周期
2,局部作用域:包含的是局部名称空间的名字
特点:1,只能在函数内使用
2,调用时生效,结束失效
函数对象:
1、可以被引用
例 x=1
y=x
def bar():
print('from bar')
f=bar
f()
2、可以当中参数传入
例: x=1
def func(a):
print(a)
func(x)
3、可以当中函数的返回值
例 x=1
def foo():
return x
res=foo()
print(res)
4、可以当中容器类型的元素
例 x=1
l=[x,]
print(l)
闭包函数:
闭:指的是定义在函数内部的函数
注意:作用域关系在函数定义阶段就规定死了,与调用位置无关
闭包函数:定义在函数内部的函数,并且该函数包含对外部函数作用域中名字的引用,该函数就称为闭包函数
例 def outter():
name='egon'
def inner():
print('my name is %s' %name)
return inner
f=outter()
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
应用领域:延迟计算(原来我们是传参,现在我们是包起来)
例 from urllib.request import urlopen
def index(url):
def get():
return urlopen(url).read()
return get
baidu=index('http://www.baidu.com')
print(baidu().decode('utf-8'))