Python之函数进阶
一、python命名空间:
1.1 加载顺序:
内置名称空间 ---> 全局名称空间 ----> 局部名称空间(执行函数时)
1.2 取值顺序:
先从局部名称空间找----> 全局名称空间找----->内置名称空间找
二、python作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
globals和locals方法:
1 name = 'wusir' 2 def func(): 3 name = 'alex' 4 print(name) 5 print(globals()) 6 print(locals()) 7 func()
global全局变量关键字,nonlocal 局部变量关键字:
global:
1,声明一个全局变量。
2,在局部作用域想对全局作用域的全局变量进行修改,global(限于字符串,数字)
1 def func(): 2 global a 3 a = 2 4 print(a) 5 func() 6 print(a) 7 8 ##### 9 #可变的数据类型:list,dict,set,不需要加global 10 l1 = [1,2,3] 11 def func(): 12 l1.append(444) 13 func() 14 print(l1)
nonlocal:
1,不能修改全局变量
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
1 def add_b(): 2 b = 42 3 def do_global(): 4 b = 10 5 print(b) 6 def dd_nonlocal(): 7 nonlocal b 8 b = b + 20 9 print(b) 10 dd_nonlocal() 11 print(b) 12 do_global() 13 print(b) 14 add_b()
三、函数的嵌套
函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,单向。
1 def fun1(): 2 print(111) 3 4 def fun2(): 5 print(222) 6 fun1() 7 fun2() 8 print(111) 9 ########## 10 def fun2(): 11 print(222) 12 def fun3(): 13 print(666) 14 print(444) 15 fun3() 16 print(888) 17 print(333) 18 fun2() 19 print(555)
四、函数名的本质
函数名就是函数的内存地址,一个特殊的变量。
1, 函数名的内存地址,print(func)
2, 函数名可以赋值给其他变量
3, 函数名可以当做容器类的元素
4, 函数名可以当做函数的参数.
5, 函数名可以当做函数的返回值.
学名:第一对象
五、闭包
内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
函数内部定义的函数称为内部函数
用处:
如果说你内存函数是个闭包,python内部有一个机制,遇到闭包,
他会在内存中开启一个内存空间,不会随着函数的结束而关闭.
5.1 判断闭包
1 def wrapper(): 2 name = 'alex' 3 def inner(): 4 print(name) 5 inner() 6 print(inner.__closure__) # 检测是不是闭包 cell 就是b包 7 wrapper()
5.2 闭包嵌套
1 def wrapper(): 2 money = 1000 3 def func(): 4 name = 'eva' 5 def inner(): 6 print(name,money) 7 return inner 8 return func 9 10 f = wrapper() 11 i = f() 12 i()
5.3 爬虫
1 from urllib.request import urlopen 2 print(urlopen('http://www.cnblogs.com/jin-xin/articles/8259929.html').read()) 3 def index(url): 4 content = urlopen(url).read() 5 def get(): 6 with open('爬虫','a') as f1: 7 f1.write(content.decode('utf-8')) 8 return get