闭包函数和装饰器(待补充)
#闭包函数:函数内部定义函数,成为内部函数, #该内部函数包含对外部作用域,而不是对全局作用域名字的引用 #那么该内部函数成为闭包函数# name='alex' # def func(): # name='egon' # def bar(): # print(name) # return bar # b=func() # print(b)# def foo(): # name='ssssss' # b() # foo()# name='alex' # def func(): # name='egon' # x=1000000000000000000000 # def bar(): # print(name) # print(x) # a=1 # b=2 # return bar # # f=func() # print(f()) # print(f.__closure__[0].cell_contents) # print(f.__closure__[1].cell_contents)# name='alex' # def func(): # name='egon' # x=1000000000000000000000 # def bar(): # print(name) # print(x) # a=1 # b=2 # print(bar.__closure__)#能打印出值就是闭包函数 # func()#闭包函数:1 内部函数 2 包含对外部作用域而非全局作用域的引用 #闭包函数的特点:# 自带作用域# 延迟计算 # name='alex' # def func(): # def bar(): # print(name) # return bar # f=func() # print(f.__closure__) # f()# money=1000 # def tell_ino(name): # print('%s have money %s' %(name,money)) # tell_ino('egon') # # def f1(): # money=10 # tell_ino('egon') # f1()#包一层 # def wrapper(): # money=1000 # def tell_info(): # print('egon have money %s' %(money)) # return tell_info # # tell_info=wrapper() # # def foo(): # money=100 # tell_info() # foo()#包两层 # def aaa(): # name='egon' # def wrapper(): # money=1000 # def tell_info(): # print('egon have money %s' %(money)) # print('my namn is %s' %name) # return tell_info # return wrapper # # w=aaa() # tell_info=w() # print(tell_info.__closure__[0].cell_contents) # print(tell_info.__closure__[1].cell_contents)''' 报错NameError: name 'money' is not defined原因:函数的作用域关系在函数定义阶段就已经固定,与调用位置无关无论函数在何处调用,都需要回到定义阶段去找对应的作用域关系此例:虽然tell_info('egon')是在foo内调用并且引用money,但仍需要回到定义tell_info的阶段去找作用域关系,而定义时tell_info引用的money就是全局的money如果全局不存在则抛出异常NameError'''#定义闭包函数的基本形式 # def 外部函数名(): # 内部函数需要的变量 # def 内部函数(): # 引用外部变量 # return 内部函数# def deco(): # x=1 # def wrapper(): # print(x) # return wrapper # wrapper=deco() # print(wrapper)# def wrapper(): # print(x) # print(y)# def deco1(): # y=2 # def deco(): # x=1 # def wrapper(): # print(x) # print(y) # return wrapper # return deco # deco=deco1() # # wrapper=deco() # # wrapper()# from urllib.request import urlopen # print(urlopen('http://www.xiaohua100.cn/').read()) # print(urlopen('https://www.python.org').read())# def get(url): # return urlopen(url).read() # print(get('http://www.xiaohua100.cn/'))# def index(url): # # url='http://www.xiaohua100.cn/' # def get(): # return urlopen(url).read() # return get # xiaohua=index('http://www.xiaohua100.cn/') # python=index('https://www.python.org') # baidu=index('http://www.baidu.com') # print(python())
装饰器
''' 一:开放封闭原则,对扩展是开放的,对修改是封闭的 二:装饰器,装饰器本质可以任意可调用对象,被装饰的对象也可以是任意可调用对象,装饰器的功能是:在不修改被装饰对象源代码以及调用方式的前提下为期添加新功能原则:1.不修改源代码2.不修改调用方法目标:添加新功能 ''' # import time # import random # #装饰器 # def timmer(func): # # func=index # def wrapper(): # start_time = time.time() # func() #index() # stop_time=time.time() # print('run time is %s' %(stop_time-start_time)) # return wrapper # #被装饰函数 # def index(): # time.sleep(random.randrange(1,5)) # print('welecome to index page') # # def home(): # time.sleep(random.randrange(1,3)) # print('welecome to HOME page') # # index=timmer(index) #index=wrapper # home=timmer(home) # # index() #wrapper() # home()#装饰器的语法:在被装饰对象的正上方的单独一行,@装饰器名字 # import time # import random # #装饰器 # def timmer(func): # def wrapper(): # start_time = time.time() # func() # stop_time=time.time() # print('run time is %s' %(stop_time-start_time)) # return wrapper # #被装饰函数 # @timmer #index=timmer(index) # def index(): # time.sleep(random.randrange(1,5)) # print('welecome to index page') # @timmer #home=timmer(home) # def home(): # time.sleep(random.randrange(1,3)) # print('welecome to HOME page') # # index() #wrapper() # # home()#加多个装饰器 import time import random #装饰器 #统计时间功能 # def timmer(func): # def wrapper(): # start_time = time.time() # func()#index() # stop_time=time.time() # print('run time is %s' %(stop_time-start_time)) # return wrapper #认证功能 # def auth(func): # def deco(): # name=input('name: ') # password=input('password: ') # if name == 'egon' and password == '123': # print('login successful') # func() #wrapper() # else: # print('login err') # return deco#被装饰函数 # @auth #index=auth(wrapper) #index=deco # @timmer #index=timmer(index) #index=wrapper # def index(): # time.sleep(random.randrange(1,5)) # time.sleep(3) # print('welecome to index page') # # def home(): # time.sleep(random.randrange(1,3)) # print('welecome to HOME page')# index() #deco() # home()#装饰器修订 import time import random #装饰器 def timmer(func):def wrapper(*args,**kwargs):start_time = time.time()res=func(*args,**kwargs)stop_time=time.time()print('run time is %s' %(stop_time-start_time))return resreturn wrapper #被装饰函数 @timmer def index():time.sleep(random.randrange(1,5))print('welecome to index page') @timmer def home(name):time.sleep(random.randrange(1,3))print('welecome to %s HOME page' %name)return 123123123123123123123123123123123123123123index()res1=index() print('index return %s' %res1) res2=home('egon') #wraper() print('home return %s' %res2)
转载于:https://www.cnblogs.com/z-x-y/p/7021617.html
闭包函数和装饰器(待补充)相关推荐
- 名称空间与作用域、闭包函数、 装饰器
1 名称空间与作用域 2 闭包函数 3 装饰器 6.7 名称空间与作用域 内置名称空间: 存放的是:内置的名字与值的绑定关系 生效:python解释器启动 失效:Python解释器关闭 全局名称空 ...
- python中msg函数_Python 中闭包函数和装饰器
一.闭包函数的概述 闭包 closure, 是一种代码的组织结构.当一个内嵌函数引用其外部作用域的变量,就形成一个闭包函数.闭包函数有一个内嵌函数,内嵌函数引用外部函数中的变量,外部函数的返回值是内嵌 ...
- day、11闭包函数和装饰器
今日内容 2019-07-13 闭包函数 装饰器 一.闭包函数 1.什么叫闭包函数 所谓的闭包函数就是定义在函数内部的函数,且只引用外部函数作用域的变量. def outter(x, y):def m ...
- Day04:函数参数、对象、嵌套、闭包函数和装饰器
上节课复习: 1.什么是函数 函数就是具备某一功能的工具 2.为何用函数 1.程序的组织结构和可读性 2.减少代码冗余 ...
- Python 闭包、单个装饰器、多个装饰器、装饰器修饰类、应用场景
1. 闭包 在 Python 中,函数也可以作为参数.我们可以执行下面的代码: def func(a, b):return a + bprint(func) 我们直接输出函数名,而没有加括号.输出结果 ...
- python之函数三装饰器
装饰器形成的过程 装饰器的作用:不想修改函数的调用方式,但是还想在原来的函数前后加功能 原则:开发封闭原则 开发:对扩展是开发的 封闭:对修改是封闭的 装饰器的固定模式 计算运行时间 1 import ...
- Python自学记录——返回函数、匿名函数、装饰器与偏函数
国庆节快乐~~虽说今天是假期的最后一天.. 好久没学习Python了..值得高兴的是 <怪物猎人:世界>目前所有的龙我(统枪)都打过一遍了 (/得意). 正题,开始学习.记录: 返回函数 ...
- day4 匿名函数、装饰器、生成器、迭代器、内置函数、 json 与 pickle 模块
文章目录 1.列表生成式 2.匿名函数 3.装饰器 4.生成器 5.迭代器 6.内置函数 7.json & pickle 序列化与反序列化 1.列表生成式 可通过特定语句便捷生成列表 list ...
- python装饰器函数-python 装饰器 函数被装饰+函数执行
""" func1.py 文件 1.执行到@w1 2.被装饰函数作为装饰器参数 w1(func=f1()) 3.w1 函数执行有返回值,得用变量接收,变量名为f1 合适 ...
最新文章
- 2014年中回首与展望
- Pair Poject 1 【新双人贪吃蛇】本组:龚逸 合作者:庞俊
- javadoc源码获取
- openstack havana块存储Cinder磁盘加密方法研究
- OC类导入Swift工程演示
- 前端学习(3067):vue+element今日头条管理-element里面的image组件
- (十七)spring cloud微服务分布式云架构-eureka 基础
- pandas—显示行索引与列索引(数组或者列表)
- java对象说明 PO,BO,VO,DTO,POJO,DAO,Entity
- python用蓝牙发文件_用pybluez进行python蓝牙发现
- A311D项目开发总结
- 常用原型图绘制工具比较
- VBA版本获取ClientKey
- 小趣味:js编写斗地主规则(完整代码)
- 【HEC-RAS】02 软件下载及安装
- 简单排序算法时间空间复杂度分析及应用(7)-希尔排序
- Matlab中table类型使用技巧
- c语言str相关的函数
- 数据异常检测方法以及实际应用
- 魔王逗勇者c语言编程软件,勇者逗魔王游戏下载-勇者逗魔王预约下载 v1.0.5-pc6手游...