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__
#输出的__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()
View Code
闭包获取网络应用
# from urllib.request import urlopen
# def index(url):
# def inner():
# return urlopen(url).read()
# return inner
# u=''
# get = index(u)
# print(get())
View Code
五、装饰器
pass