# 加载顺序:# 内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时)# 取值顺序:# 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间# 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@timmerdef login(a,b): print(a,b) time.sleep(0.3) print(‘洗洗更健康...‘) return 666print(login(2,3)) # def wrapper(f):# def inner(*args,**kwargs):# ‘‘‘执行被装饰函数之前的操作‘‘‘# ret = f(*args,**kwargs)# """执行被装饰函数之后的操作"""# return ret# return inner #装饰器功能:在不改变原函数的基础上,为原函数增加一些额外的功能,log,登录注册,等等.
原文地址:https://www.cnblogs.com/weilaixiaochaoren/p/9028390.html
时间: 2024-10-08 08:44:58