Python 全栈开发:python函数进阶
python函数进阶
函数嵌套
函数对象
命名空间与作用域
闭包函数
装饰器
一、函数嵌套
函数的嵌套定义
def func1(): print('from func1') def func2(): #func2=内存地址 print('from func2') print(func2) func1()
函数的嵌套调用
# 比较两个数的大小 def max2(x,y): if x > y: return x else: return y # 比较三个数的大小 def max3(x,y,z): res1=max2(x,y) res2=max2(res1,z) return res2 print(max3(11,199,2))
# 结果
# 199
二、函数对象
函数在python中是第一类对象
1.可以被引用
x=1 y=x def bar(): print('from bar') f=bar # 作为对象赋值时 bar代表的值是 内存地址 f()
2.可以当中参数传入(函数名的本质,函数的内存地址)
f=func
3.可以当中函数的返回值
def bar(x): print(x) x() bar(func)
4.可以当中容器类型的元素
def bar(x): # x=func return x #return func res=bar(func) #res=func # print(res) res()
三、命名空间与作用域
命名空间:存放名字与绑定关系的空间
命名空间分为三类
内置命名空间:存放Python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效
全局命名空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效
局部命名空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放与局部名称空间), #在函数调用时临时生效,函数结束则失效
三种命名空间之间的加载顺序和取值顺序:
加载顺序:内置(解释器启动时加载,程序运行前加载)-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)--->内置
取值:在局部调用:局部命名空间--->全局命名空间--->内置命名空间
在全局范围找:
全局----内置----局部使用:
全局不能使用局部的
局部的可以使用全局的
作用域:就是作用范围
1、命名空间和作用域是分不开的.
2、作用域分为两种
全局作用域:全局命名空间与内置命名空间的名字都属于全局范围,在整个文件的任意位置都能被引用,全局有效
局部作用域:局部命名空间,只能在局部范围内生效
3、站在全局看
使用名字的时候,如果全局有,用全局的
如果全局没有,用内置的
4、为什么要有作用域
为了函数内的变量不会影响到全局
5、
pass
四、闭包函数
闭包:1.闭 :内部的函数
2.包 :包含了对外部函数作用域中变量的引用
def hei(): x=20 def inner(): x=10 #如果x定义了,他就用自己的了,就实现不了闭包 print(x)
# 闭包的常用形式: def hei(): x=20 def inner(): '''闭包函数''' print(x) return inner() 闭包函数的常见形式
判断闭包函数的方法:__closure__
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#输出的__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()
闭包获取网络应用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# from urllib.request import urlopen # def index(url): # def inner(): # return urlopen(url).read() # return inner # u='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1' # get = index(u) # print(get())
五、装饰器
pass