函数及名称空间
一,名称空间
什么是名称空间?
名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间),但凡查找值一定要通过名字,访问名字必须去查找名称空间。
名称空间的分类
内置名称空间:存放的是Python解释器自有的名字
#print(len)#print(max)
全局名称空间:存放的是文件级别的名字
x=1 while True def foo():
y=2 b=4 m=3
if x==4: break
z=3
局部名称空间:在函数内定义的名字
生命周期:
内置名称空间:在解释器启动时生效,解释器关闭则失效
全局名称空间:在解释器执行Python文件时生效,文件执行完毕后则失效。
局部名称空间:只在调用函数是临时产生该函数的局部名称空间,该函数调用额按笔后则 失效。
加载顺序:内置》全局》局部
名字的查找顺序:基于当前所在位置往上查找,假设当前站在局部,查找从局部到全局到内置;假设当前站在全局,查找顺序为从全局到内置。
名字的查找顺序在函数的定义阶段就已经固定死了,与函数的调用位置无关。也就是说无论在任何地方调用函数都必须回到当初定义函数的位置去确定名字的查找顺序。
二,作用域:
域指的是范围,作用域指的是作用的范围,分为两种。
全局作用域:包含的是内置名称空间,与全局名称空间的名字。特点:全局有效,全局存活。
局部作用域:包含的是局部名称空间中的名字。特点:局部有效,临时存活。
global,nonlocal
global:在局部声明一个名字是来自全局作用域的,可以用来在局部修改全局的不可变类型,不论外面套了多少层函数都是修改最外层的作用域。
nonlocal:声明一个名字是来自当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型。
三,闭包函数
1 什么是闭包函数
闭:指的是闭包函数是定义在一个函数内部的函数
包:该内部函数包含对外层函数作用域名字的引用(不是全局)
需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制
2,为何要用闭包函数?
闭包函数提供了一种为函数体传值的解决方案
闭包函数的的基本形式:通常把一个函数缩进到另外一个函数的内部,它访问一个名字是来自一个外层函数,假如这个函数访问一个x,那么在它头顶来一个x,下部有个return,把这个函数返回到外层就可以了。他的作用域与调用阶段没有任何关系,x的确定在定义阶段就已经固定死了。
def outter():
x=111
def inner():
print(x)
return innner
f=outter() #f=outter内的inner
#x=222 在定义阶段已经确定x的取值,即使外部f()调用无关,所以x仍然是x=111
#f()
3,如何用闭包函数
为闭包函数传值的方式一:参数传值
def func(x,y):
return x+y
func(1,2)
为函数体传值的方式二:闭包
def outter():
x=1
y=2
def func():
print(x+y)
return func
f=outter()
f()
---恢复内容结束---