博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python---函数的应用,闭包,装饰器
阅读量:4916 次
发布时间:2019-06-11

本文共 6929 字,大约阅读时间需要 23 分钟。

# 加载顺序: #         内置名称空间 ---> 全局名称空间(程序运行时)---> 局部名称空间(函数执行时) #     取值顺序: #     局部名称空间(函数执行时)---> 全局名称空间(程序运行时)---> 内置名称空间 #         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,登录注册,等等.

转载于:https://www.cnblogs.com/weilaixiaochaoren/p/9028390.html

你可能感兴趣的文章
课后作业2:编写一个文件加解密程序,通过命令行完成加解密工作
查看>>
js 值类型和引用类型
查看>>
java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果
查看>>
java相关。关于jsp中使用el表达式的格式,谢谢!
查看>>
GetDlgItem的用法小结
查看>>
java带包编译
查看>>
树状数组详解(重拾笔记)
查看>>
javascript深入理解js闭包
查看>>
PLSQL
查看>>
ASP.NET Core 应用程序Startup类介绍
查看>>
【python】-类的继承
查看>>
同一个POD中默认共享哪些名称空间
查看>>
HTTP协议详解
查看>>
xdebug调试的原理
查看>>
php 日期时间运算比较
查看>>
C#类、接口、虚方法和抽象方法
查看>>
Linq C#增删改查
查看>>
[转]第一章 Windows Shell是什么 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987862】...
查看>>
iOS获取设备UUID和IDFA
查看>>
模糊查询
查看>>