python学习-42 装饰器 --- 函数闭包1

函数闭包举例:

def father(name):
    print(‘hello world‘)
    def son():
        print(‘儿子说:我的爸爸是%s‘ % name)
        def grandfson():
            print(‘孙子说:我的爷爷是%s‘ % name)
        grandfson()
    son()
father(‘小明‘)

运行结果:

hello world
儿子说:我的爸爸是小明
孙子说:我的爷爷是小明

Process finished with exit code 0

函数的包: 就是嵌套里的一层一层的函数

闭: 就是封装的意思

----------函数闭包的装饰器基本实现
import time

# 装饰器框架
def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print(‘运行时间为;%s‘ %(stop_time-start_time))
    return wrapper

@timmer
def test():
    time.sleep(1)
    print(‘test函数运行完毕‘)

#  test =timmer(test)  相当于 @timmer
test()

运行结果;

test函数运行完毕
运行时间为;1.000901460647583

Process finished with exit code 0
---------函数闭包加上返回值
import time

# 装饰器框架
def timmer(func):
    def wrapper():
        start_time = time.time()
        res = func()       # 就是在运行test()
        stop_time = time.time()
        print(‘运行时间为;%s‘ %(stop_time-start_time))
        return res
    return wrapper

@timmer  # test = timmer(test)
def test():
    time.sleep(1)
    print(‘test函数运行完毕‘)
    return ‘132‘
res =test()  #
print(res)

运行结果:

test函数运行完毕
运行时间为;1.000777244567871
132

Process finished with exit code 0

------函数闭包加上参数


import time

# 装饰器框架def timmer(func):    def wrapper(*args,**kwargs):     # *args 元组的形式,最多可传3个值。 **kwargs 字典,相当于:wrapper(*(name,age,gender),**{ })        start_time = time.time()        res = func(*args,**kwargs)        stop_time = time.time()        print(‘运行时间为;%s‘ %(stop_time-start_time))        return res    return wrapper

@timmer  # test = timmer(test)def test(name,age):    time.sleep(1)    print(‘test函数运行完毕,名字:%s 年龄: %s‘ % (name,age))    return ‘132‘ret = test(‘小王‘,20)print(ret)

@timmerdef test1(name,age,gender):    time.sleep(1)    print(‘test1名字:%s,年龄%s,性别:%s‘ %(name,age,gender))    return ‘321‘res =test1(‘小红‘,18,‘男‘)print(res)
 

运行结果:

test函数运行完毕,名字:小王 年龄: 20
运行时间为;1.0007729530334473
132
test1名字:小红,年龄18,性别:男
运行时间为;1.0006530284881592
321

Process finished with exit code 0

原文地址:https://www.cnblogs.com/liujinjing521/p/11213373.html

时间: 2024-08-25 10:46:00

python学习-42 装饰器 --- 函数闭包1的相关文章

python学习-43 装饰器 -- 函数闭包2

函数闭包为函数加上认证功能 1.登陆账号 user_dic ={'username':None,'login':False} def auth_func(func): def wrapper(*args,**kwargs): if user_dic['username'] and user_dic['login']: res = func(*args,**kwargs) return res username = input('账号:').strip() passwd = input('密码:'

六、PYTHON 学习之装饰器使用

Python是一种强大的语言,即可浅尝辄止,也可深入挖掘.很适合做科学计算.数据挖掘等等.今天我将简单介绍一下Python的装饰器(Decorators)的用法 . 假设我们想要庆祝下生日,需要邀请一些朋友过来参加.但是你有个讨厌的朋友,叫Joe,必须不能让他来啊.可能首先你想到的是建一个list,然后迭代查找并移除所有的Joe童鞋.这当然是个好方法,但是这里为了介绍装饰器,我们会用@来完成这个工作.虽然可能看起来没有什么必要,但是有助于大家学习装饰器的用法. 首先创建一个Python文件app

python学习笔记--装饰器

1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来不这么单调: def showInfo(fun): def wrap(x,y): print "The function before" func(x,y) print "The function after" return wrap def f(x,y): print

Python 学习笔记 - 装饰器

这一节了解了一些装饰器的简单使用. 首先来看一个预备知识,把一个函数当做参数,传入另外一个函数 比如说我传递outer(f1),我传入的是f1的内存地址,a=func()其实执行了f1()这个函数,并把返回值赋给了a,因此当我打印print(a),他会输出hee >>> def outer(func):     print(func)     a=func()     print(a) def f1():     print("aaa")     return &qu

十、PYTHON 学习之装饰器加深理解

在第六章已经有所介绍,这里看到一篇比较好的文章转过来. 基本概念 装饰器是23z种设计模式之一,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子来理解,咖啡,加糖的咖啡,加牛奶的咖啡. 本质上,还是咖啡,只是在原有的东西上,做了"装饰",使之附加一些功能或特性. 例如记录日志,需要对某些函数进行记录 笨的办法,每个函数加入代码,如果代码变了,就悲催了 装饰器的办法,定义一个专门日志记录的装饰器,对需要的函数进行装饰.

Python学习之装饰器

装饰器出现的原因是因为我们应对新的需求:在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能:它的本质是闭包函数. 装饰器的结构: def timmer(func): def inner(*args,**kwargs): '''添加函数调用之前的扩展代码''' ret = func(*args,**kwargs) '''添加函数调用之后的扩展代码''' return ret return inner 两个def 两个return互相对应. 装饰器的设计模式:是开放封闭原则:既对扩展是开放的

Python基础课:装饰器和闭包

#4.装饰器 #闭包 def fx(x): x += 1 def fy(y): return x*y return fy def f1(func): #print('f1 runing') def f2(y): print('f2 runing') return func(y) + 1 return f2 def gun(m): print('gun runing') return m*m #f1(gun) #fg = f1(gun) def fun(m): print('f2 runing')

python之路--装饰器函数

(一)装饰器的形成过程 装饰器的本质是闭包函数的一种应用,装饰器是用来装饰函数的,在不修改原函数及其调用方式的情况下对原函数功能进行拓展. #简单的无参函数装饰器 import time def timmer(func): def inner(): start = time.time() func() end = time.time() print(end -start) return inner @timmer#语法糖 def hahaha(): time.sleep(2)#停止时间的一种用法

Python学习之装饰器进阶

函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) aaa(1,2) 默认参数:不是必须传参数 def bbb(x=10): print(x) # bbb() #x = 10 # bbb(20) #x = 20 动态传参 def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置传参数 t = (1