# 加载顺序: # 内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时) # 取值顺序: # 局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间 # 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,直接打印函数名得到的是函数的内存地址# 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__) #检测函数是不是闭包( ,) # 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,登录注册,等等. |