一、命名空间
1.命名空间一共有三种:
内置命名空间
全局命名空间
局部命名空间
2.三种命名空间之间的加载与取值顺序:
加载:内置命名空间 >全局命名空间>局部命名空间
调用:局部命名空间->全局命名空间->内置命名空间
二、作用域
1.全局作用域
包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
2.局部作用域
局部名称空间,只能在局部范围内生效
小范围的可以用大范围的 但是大范围的不能用小范围的。
范围从大到小
在小范围,如果要用一个变量,是当前范围内有的,就用自己的,如果没有就用上一级的,以此类推
如果都没有 ,报错
globals 全局作用域的名字
locals 局部作用域的名字
global关键字:局部的变为全局的
globals和locals方法
在全局中调用
print(globals())
print(locals())
在局部调用
def func(): a = 12 b = 20 print(locals()) print(globals()) func()
a = 10 def func(): global a a = 20 print(a) func() print(a)
三、函数名的本质
函数名本质上就是函数的内存地址
就是一个变量,保存了函数所在的内存地址
def func(): print(func) f=func print(f) #打印出内存地址 def func(): name='egon' def func2(): print(name) return func2() f=func() #打印出变量对应的值
四、函数嵌套
name='alex' def foo(): name='lhf' def bar(): print(name) return bar func=foo() func()
nonlocal关键字
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1(): a = 1 def f2(): nonlocal a a = 2 f2() print('a in f1 : ',a) f1()
五、闭包
1.函数的闭包
def func(): name = 'eva' def inner(): print(name) return inner f = func() f()
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
判断闭包函数的方法‘_closure_’
输出的__closure__有cell元素 :是闭包函数 def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) return inner f = func() f() #输出的__closure__为None :不是闭包函数 name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2()
闭包函数获取网络应用
from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get xiaohua = index() content = xiaohua() print(content)