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()
View Code

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)
View Code

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()
View Code

三、函数的嵌套

函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,单向。

 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)
View Code

 四、函数名的本质

函数名就是函数的内存地址,一个特殊的变量。

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()
View Code

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()
View Code

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
View Code

 

 

 

posted @ 2018-02-01 16:33  WoLfff  阅读(182)  评论(0编辑  收藏  举报