返回顶部
首页 > 资讯 > 后端开发 > Python >python 高阶函数:Decorato
  • 778
分享到

python 高阶函数:Decorato

高阶函数python 2023-01-31 01:01:34 778人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

装饰器:原函数基础 ------> 动态添加功能一、不带参数的decorator#decorator封装def log(func):    def wrapper(*args, **kw):        print 'call %s

装饰器:原函数基础 ------> 动态添加功能


一、不带参数的decorator

#decorator封装

def log(func):
    def wrapper(*args, **kw):
        print 'call %s():' %func.__name__
        return func(*args, **kw)
    return wrapper


#此函数一定要放在 def log(func): 之后

@log   
def now():
    print "haha"

   
now()

log.PNG


log(now())
log.PNG


print "now_name:%s"%now.__name__

log1.PNG


简单的图解:(待以后深入理解后再详细补)

log图解.png


二、带参数的docurator

#!/usr/bin/python

#docurator封装

def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator


@log('execute')
def now():
    print "haha"    


print "now_name:%s"%now.__name__ 

log1.PNG


now()

log2.PNG


print log('execute')
print log(now)
print log('execute')(now)

log3.PNG


三、完整的decorator的写法:Python内置的functools.wraps  

import functools  #导入functools模块

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log('execute')
def now():
    print "haha"
   
print "now_name:%s"%now.__name__  

log4.PNG

now()

log2.PNG

print log('execute')
print log(now)
print log('execute')(now)

log5.PNG



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

日期:2018/8/18

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充:

  1. 多个装饰器的执行顺序是无序的,但执行过程是有序的。

  2. 装饰器执行过程是:遇到外接函数就跳转到另一个装饰器中执行,若再另一个装饰器中遇到同样的外接函数,则继续执行


证明1:多个装饰器的执行顺序是无序的

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time


def extend(func):
    def wrapper(*args, **kwargs):
        print "Begin AAAAAA"
        func(*args, **kwargs)
        print("A:%s"%(func.__name__))
        print(reduce(lambda x,y:x+y, args), kwargs)
        print "End AAAAA"
    return wrapper


def extend1(func):
    def wrapper(*args, **kwargs):
        print "Begin BBBBB"
        func(*args, **kwargs)
        print("B:%s"%(func.__name__))
        print(map(lambda x:x*2, args), kwargs)
        print "End BBBBB"    
    return wrapper

@extend      
@extend1
def get_time1(*args,**kwargs):
    begin_time = time.time()
    for n in range(3,4):
        time.sleep(1)
    end_time = time.time()
    print("run %d "% (end_time - begin_time))
    #print(reduce(lambda x,y:x+y, args), kwargs)

    
if __name__ == "__main__":

    get_time1(1,2,3,4,5,6,ma=1,du=2)

执行结果:先从第一个装饰器标志@extend开始

Begin AAAAAA
Begin BBBBB
run 1 
B:get_time1
([2, 4, 6, 8, 10, 12], {'du': 2, 'ma': 1})
End BBBBB
A:wrapper
(21, {'du': 2, 'ma': 1})
End AAAAA


另一个例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
def dec1(func):  
    print("1111")  
    def wrapper(*args, **kwargs):  
        print("2222")  
        func()  
        print("3333")  
    return wrapper  

def dec2(func):  
    print("aaaa")  
    def wrapper(*args, **kwargs):  
        print("bbbb")  
        func()  
        print("cccc")  
    return wrapper  

@dec1  
@dec2  
def test():  
    print("test test")  

test()

运行结果:从第二个装饰器标志@dec2开始

aaaa
1111
2222
bbbb
test test
cccc
3333


通过比较,多个解释器的执行顺序是无序的。若大家觉得证明不够严谨,可自己多添几个试试。


证明2:装饰器的执行过程是有序的

图1:

装饰器原函数1.png


图2:

装饰器原函数倒装1.png




没看懂?没关系,进行步骤解析:

装饰器原函数结果解析1.png



-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2018/8/20

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

补充:一个讲的很好的BLOG:  https://blog.csdn.net/xiangxianghehe/article/details/77170585


--结束END--

本文标题: python 高阶函数:Decorato

本文链接: https://lsjlt.com/news/183751.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 高阶函数:Decorato
    装饰器:原函数基础 ------> 动态添加功能一、不带参数的decorator#decorator封装def log(func):    def wrapper(*args, **kw):        print 'call %s...
    99+
    2023-01-31
    高阶 函数 python
  • Python 高阶函数
    高阶函数:简单来讲,一个函数可以接收另一个函数来作为参数,这样的函数称之为高阶函数 map函数 会根据提供的函数对指定序列做映射,也就是说将函数作用在指定序列 语法为 map(function,interable...) ...
    99+
    2023-01-30
    高阶 函数 Python
  • python高阶函数
    高阶函数定义:1.函数接收的参数是一个函数名;2.函数返回的是一个函数名;只要满足上述条件中的任意一个条件的函数均属于高阶函数 例如:1.函数接收的参数为函数名2.函数返回的结果为函数名3.函数接收的参数为函数名,函数返回的结果为函数名...
    99+
    2023-01-31
    高阶 函数 python
  • Python常见内置高阶函数即高阶函数用法
    目录1.什么是高阶函数?2.高阶函数-map、filter、reduce2.1map函数2.2filter函数2.3reduce函数1.什么是高阶函数?   高阶函数:一个函数可...
    99+
    2024-04-02
  • Python基础【高阶函数】
    map(fun,seq) 将seq中的元素依次作为参数传入fun,返回由函数返回值组成的新的列表。 python3:返回一个map对象 python2:返回列表 可以用list将对象转换为列表进行调用 代码: def f...
    99+
    2023-01-31
    高阶 函数 基础
  • 高阶函数
    一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数 编写高阶函数,就是让函数的参数能够接收别的函数 函数式编程就是指这种高度抽象的编程范式 高阶函数的特点   变量可以指向函数     函数本身也可以赋值给变量,即:变...
    99+
    2023-01-31
    高阶 函数
  • python高阶函数有哪些
    python中的高阶函数有:1.map()函数;2.reduce()函数;3.filter()函数;python中的高阶函数有以下几种map()函数map()函数是python中一个内置的高阶函数,它可以接收一个函数f和一个list,并通过...
    99+
    2024-04-02
  • 什么是Python高阶函数
    这篇文章主要介绍“什么是Python高阶函数”,在日常操作中,相信很多人在什么是Python高阶函数问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Python高阶函数”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-15
  • Python基础——4高阶函数
    高阶函数 函数本身可用变量指向,把变量当做函数参数的函数成为高阶函数 map and reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterato...
    99+
    2023-01-30
    高阶 函数 基础
  • python 递归与高阶函数
    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。一个简单的递归函数(不正式)def calc(n):     print(n)   &...
    99+
    2023-01-30
    递归 高阶 函数
  • 什么是python 高阶函数
    本篇文章为大家展示了什么是python 高阶函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。体验高阶函数在Python中,abs()函数可以完成对数字求绝对值计算。abs(-10) #&...
    99+
    2023-06-06
  • Python高阶函数是什么
    Python高阶函数是指可以接受函数作为参数或者返回一个函数的函数。在Python中,函数可以作为一种数据类型传递给其他函数,这样的...
    99+
    2024-03-08
    python
  • python之高阶函数和匿名函数
    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 1 def func(x): 2 return x*x 3 4 r = ma...
    99+
    2023-01-30
    函数 高阶 python
  • Python小世界:匿名函数、高阶函数、
    木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握。 另外,网上关于Python基础知识的各种普及已有太多太多。 附上相关大神的技术栈: Python3官方文档 Pyt...
    99+
    2023-01-31
    函数 高阶 世界
  • python3--高阶函数
    # Auther: Aaron Fan'''# 高阶函数:把一个函数名,以实参的形式,传给这个函数的形参,这个函数就称为高阶函数。比如下面的形参c,对应的实参是一个函数名abs。# 函数abs()的功能是取绝对值def add(a,b,c)...
    99+
    2023-01-31
    高阶 函数
  • python中有哪些高阶函数
    python中的高阶函数有以下几种map函数map函数可以接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回。reduce函数reduce函数是将一个函数作用到一个序列上,这个函数必...
    99+
    2024-04-02
  • python如何定义高阶函数
    在python中定义高阶函数的方法map函数map函数可以接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回。定义方法:import random#定义阶乘函数def f(x):re...
    99+
    2024-04-02
  • Python 内置高阶函数详细
    目录1、Python的内置高阶函数1.1 map()1.2 reduce() 函数1.3 reduce() 函数1.4 sorted() 函数1、Python的内置高阶函数 1.1 ...
    99+
    2024-04-02
  • python高阶函数使用的方法
    今天小编给大家分享一下python高阶函数使用的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、高阶函数函数定义pyt...
    99+
    2023-07-02
  • Python高阶函数map()怎么使用
    这篇文章主要介绍了Python高阶函数map()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python高阶函数map()怎么使用文章都会有所收获,下面我们一起来看看吧。简介:格式:map(funct...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作