python---函数的应用,闭包,装饰器

# 加载顺序:
# 内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时)
# 取值顺序:
# 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间
# LEGB
# 执行顺序:
# 当代码运行时,从上至下依次执行。
# 函数的嵌套。
# global
# 1,声明一个全局变量。
# 2,更改一个全局变量。
# nonlocal
# 1,不能改变一个全局变量。

# def funcl(*args , **kwargs):
# pass
# funcl()

# *的魔性用法 #运用场景:累加
# def funcl (*args,**kwargs):
# for i in args:
# print(i)
# print(args)
# print(*args)
# print(kwargs)
# print(**kwargs)
# funcl(*[1,2,3], **{'name':'alex'})
#
# def funcl():
# print(666)
# def func2():
# funcl()
# print(333)
# def inner():
# print(222)
# inner()
# print(111)
# func2()
# print(555)
# 111 666 333 222 555

# 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间
# nam='老男孩'
# def funcl():
# global name
# name='alex'
# funcl()
# print(name)


# nam='老男孩'
# def funcl():
# global name
# name='alex'
# def funcl3():
# print(name)
# funcl3()
# funcl()
# print(name)

# def add_b():
# b=42
# def do_global():
# b=10
# print(b)
# def dd_nonlocal():
# nonlocal b
# b=b+20
# print(b)
# dd_nonlocal()
# print(b)
# do_global()
# print(b)
# add_b()

#函数名的应用:
# 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70>
# print(func1)

#2,函数名可以赋值运算。
# def func1():
# print(666)
# f1 = func1
# f1()
# 3, 函数名可以作为函数的参数。

# def func1():
# print(666)
#
# def func2(x):
# x()
# print(555)
# func2(func1)

# 4,函数名可以作为容器类数据类型的元素。

# def func1():
# print(666)
#
# def func2():
# print(222)
#
# def func3():
# print(111)
#
# def func4():
# print(777)
# l1 = [func1, func2, func3, func4]
# for i in l1:
# i()
# dic1 = {
# 1:func1,
# 2:func2,
# 3:func3,
# 4:func4,
# }
# dic1[1]()


# #函数名可以当做函数的返回值
#
#
# def func1():
# print(666)
#
#
# def func2(x): # x = func1
# print(222)
# return x
# ret = func2(func1)
# ret()

#函数闭包

# 内层函数对外层函数非全局变量的引用就叫闭包
#判断是不是闭包 函数名.__closure__
# 返回的None则不是闭包,返回的是cell.... 则是闭包
# 闭包有什么用?
#当执行一个函数时,如果解释器判断此函数内部闭包存在,这样
#Python就一个机制,闭包的所在的临时名称空间不会随着函数的执行完毕而消失。
# def funcl():
# name='老男孩'
# def inner():
# print(name)
# inner()
# print(inner.__closure__) #检测函数是不是闭包(<cell at 0x00000000006F5D68: str object at 0x0000000000E108A0>,)
# funcl()
#
# def funcl():
# global name
# name='老男孩'
# def inner():
# print(name)
# inner()
# print(inner.__closure__)# None 不是闭包
# funcl()
#
# def func1(x):
# def inner():
# print(x)
# inner()
# print(inner.__closure__)
#
# name = '老男孩'
# func1(name)

# def func():
# def func1():
# name='老男孩'
# def func2():
# nonlocal name
# name='alex'
# def func3():
# global name #global name 发给改变的只是全局的变量,函数内部的不受它的影响
# name='太白'
# name='日天'
# func1()
# print(name)
# func2()
# print(name)
# func3()
# print(name)
# func()
# print(name)
#
# 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)
#
#
# def f1():
# a=0
# def f2():
# nonlocal a
# a += 1
# return a
# return f2
#
# b=f1()
# print(b())
# print(b())
# print(b())

#装饰器


import time
# '''第一版本,测试函数low'''
# def login():
# time.sleep(0.3)
# print('洗洗更健康')
# def timmer():
# start_time=time.time()
# login()
# end_time=time.time()
# print('次函数的执行时间%s' % (end_time-start_time))
# timmer()


# def login():
# time.sleep(0.3)
# print('洗洗更健康...')
# login()
# def register():
# time.sleep(0.4)
# print('洗洗更健康222222....')
# register()
# def timmer(f):
# start_time=time.time()
# f()
# end_time=time.time()
# print('此函数的执行时间%s' % (end_time-start_time))
# timmer(login)
# timmer(register)

# # 虽然执行函数的方式已经无限接近于原方式,但是更麻烦了,增加了两步代码。改
# # def login():
# # time.sleep(0.3)
# # print('洗洗更健康...')$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
# # login()
# #
# # def timmer(f):
# # start_time = time.time()
# # f()
# # end_time = time.time()
# # print('此函数的执行时间%s' % (end_time - start_time))
# #
# # f1 = login # 将login函数名给了f1
# # login = timmer # 将timmer函数名给了login
# login(f1) # timmer(login)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$


# def login():
# time.sleep(0.3)
# print('洗洗更健康...')
# login()

# def timmer(f):
# start_time = time.time()
# f()
# end_time = time.time()
# print('此函数的执行时间%s' % (end_time - start_time))
#
# f1 = login # 将login函数名给了f1
# login = timmer # 将timmer函数名给了login
# login(f1) # timmer(login)

#初级装饰器
# def login():
# time.sleep(0.3)
# print('洗洗更健康...')
# # login()
# def timmer(f):
# def inner():
# start_time=time.time()
# f()
# end_time=time.time()
# print('此函数的执行时间%s' % (end_time-start_time))
# return inner
# login=timmer(login)
# login()

# 简单版装饰器 语法糖
# def timmer(f):
# def inner():
# start_time=time.time()
# f()
# end_time=time.time()
# print('此函数的执行时间%s' % (end_time-start_time))
# return inner
# @timmer
# def login():
# time.sleep(0.3)
# print('洗洗更健康...')
# login()
# @timmer
# def register():
# time.sleep(0.2)
# print('洗洗更健康22...')
# login()


# def timmer(f): # f = login函数名
# def inner():
# start_time = time.time()
# f() # login()
# end_time = time.time()
# print('此函数的执行时间%s' % (end_time - start_time))
# return inner
#
# @timmer # login = timmer(login) # inner 此login是新变量
# def login():
# time.sleep(0.3)
# print('洗洗更健康...')
# login()
#
# @timmer # register = timmer(register)
# def register():
# time.sleep(0.2)
# print('洗洗更健康22...')
#
# login() # inner()

#被装饰的函数带参数的装饰器
#
# def timmer(f):
# def inner(*args,**kwargs):
# start_time=time.time()
# f(*args,**kwargs)
# end_time=time.time()
# print('此函数的执行时间%s' % (end_time-start_time))
# return inner
# @timmer
# def login(a,b):
# print(a,b)
# time.sleep(0.3)
# print('洗洗更健康...')
# login(2,3)
# @timmer
# def register(a):
# time.sleep(0.2)
# print('洗洗更健康22...')
# register(1)
# def funcl(x):
# x=0
# print(x)
# funcl(0)

#函数带返回值的装饰器(万能装饰器)
def timmer(f):
def inner(*args,**kwargs):
start_time=time.time()
ret=f(*args,**kwargs)
end_time=time.time()
print('此函数的执行时间%s' % (end_time-start_time))
return ret
return inner
@timmer
def login(a,b):
print(a,b)
time.sleep(0.3)
print('洗洗更健康...')
return 666
print(login(2,3))

# def wrapper(f):
# def inner(*args,**kwargs):
# '''执行被装饰函数之前的操作'''
# ret = f(*args,**kwargs)
# """执行被装饰函数之后的操作"""
# return ret
# return inner

#装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.








猜你喜欢

转载自www.cnblogs.com/weilaixiaochaoren/p/9028390.html
今日推荐