一、装饰器

装饰器:本质就是函数,功能是为其它函数添加附加功能

装饰器的原则:

  • 不修改被修饰函数的源代码
  • 不修改被修饰函数的调用方式

装饰器的知识储备:

  装饰器 = 高阶函数 + 函数嵌套 + 闭包

二、高阶函数

高阶函数的定义:

  • 函数的接收参数是一个函数名
  • 函数的返回值是一个函数名
  • 满足上述条件任意一个都可以是高阶函数
import time

def fun1():
    time.sleep(0.5)
    print("hello")

def computing_run_time(fun):
    """
    计算函数运行时间
    :param fun:
    :return:
    """
    start_time = time.time()
    fun()
    end_time = time.time()
    print("运行时间%s" % (end_time - start_time))

computing_run_time(fun1)

"""
优点:在不修改函数源代码的前提下,给函数添加了额外的功能
缺点:改变了调用方式
"""

函数的接收参数是函数名

import time

def fun1():
    time.sleep(0.5)
    print("hello")

def computing_run_time(fun):
    """
    计算函数运行时间
    :param fun:
    :return:
    """
    fun()
    return fun

fun1 = computing_run_time(fun1)
fun1()   

"""
优点:没有改变函数的调用方式
缺点:不能为函数添加新的功能
"""

函数的返回值是函数名

注:仅仅是高阶函数不能满足装饰器的需求

三、函数嵌套和闭包

"""
闭包:首先必须是内部定义的函数,该函数包含对外部作用域而不是全局作用域名字的引用

定义:内部函数的代码包含对外部函数的代码的引用,但一定不是对全局作用域的引用
"""

def fun1():

    print("fun1")
    name = 1

    def fun2():
        print("fun2")
        print(name)

        def fun3():
            print("fun3")
            print(name)
        fun3()
    fun2()

fun1()

  

四、装饰器示例

无参装饰器

def outer(fun):

    def wrapper():
        fun()

    return wrapper

加上参数

def outer(fun):

    def wrapper(*args, **kwargs):
        fun(*args, **kwargs)

    return wrapper

  

简单装饰器

import time

def outer(func):
    """
    计算程序的运行时间
    :param func:
    :return:
    """

    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        stop_time = time.time()
        print("函数运行的时间为:%s" % (stop_time-start_time))
        return result
    return wrapper

@outer   # 语法糖  等价于 : cal = outer(cal)  把wrapper函数的函数地址赋值给cal
def cal(list1):
    result = 0
    for i in list1:
        time.sleep(0.1)
        result += i

    return result

res = cal(range(20))
print(res)

  

注:

  函数cal的执行流程,先执行装饰器的outer函数,outer将函数的返回值赋值给变量cal,所以调用cal()  等价于  cal = outer(cal),   cal()  等价于这两步

多层装饰器

装饰器中含有函数参数

def before(name):
    print("before:%s" % name)
    return "before"

def after(name):
    print("after:%s" % name)
    return "after"

# 外层的参数只是为了将值传递到里层
def outer(before_func, after_func):

    def middle(main_func):

        def wrapper(*args, **kwargs):

            before_result = before_func(*args, **kwargs)
            print("before_result:%s" % before_result)

            main_result = main_func(*args, **kwargs)
            print("main_result: %s" % main_result)

            after_result = after_func(*args, **kwargs)
            print("after_result: %s" % after_result)

            return main_result

        return wrapper

    return middle

@outer(before, after)
def index(name):
    print("index")
    return name

result = index("aaa")
print(result)

  

python学习【第五篇】python函数 (二)的更多相关文章

  1. Python学习【第九篇】函数

    函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...

  2. Python 学习 第八篇:函数2(参数、lamdba和函数属性)

    函数的参数是参数暴露给外部的接口,向函数传递参数,可以控制函数的流程,函数可以0个.1个或多个参数:在Python中向函数传参,使用的是赋值方式. 一,传递参数 参数是通过赋值来传递的,传递参数的特点 ...

  3. Python 学习 第七篇:函数1(定义、调用和变量的作用域)

    函数是把一些语句集合在一起的程序结构,用于把复杂的流程细分成不同的组件,能够减少代码的冗余.代码的复用和修改代码的代价. 函数可以0个.1个或多个参数,向函数传递参数,可以控制函数的流程.函数还可以返 ...

  4. Python 学习 第五篇:语句和语法

    Python程序是语句构成的,语句包含表达式,表达式嵌套在语句中,包含变量和常量,用于处理对象.Python的语法实质上是由表达式.语句和代码块构成的.语句是由表达式构成的,代码块是由多个语句构成的复 ...

  5. Python学习第五篇——如何访问字典

    # the example_1 aim to tell how to use dctionary,and how to access list or dictionary infos={"f ...

  6. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  7. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  8. 第五篇python进阶之深浅拷贝

    目录 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 二.拷贝(只针对可变数据类型) 三.浅拷贝 四.深拷贝 第五篇python进阶之深浅拷贝 一.引言 1.1可变 和不可变 id不 ...

  9. 第五篇.python进阶

    目录 第五篇.python进阶 1. 异常处理 2. 数字类型内置方法 2.定义: 3.常用操作+内置方法: 4.存一个值or多个值: 5.有序or无序: 6.可变和不可变 1.用途: 2.定义: 3 ...

  10. Python 学习 第十篇 CMDB用户权限管理

    Python 学习 第十篇 CMDB用户权限管理 2016-10-10 16:29:17 标签: python 版权声明:原创作品,谢绝转载!否则将追究法律责任. 不管是什么系统,用户权限都是至关重要 ...

随机推荐

  1. <LeetCode OJ> 101. Symmetric Tree

    101. Symmetric Tree My Submissions Question Total Accepted: 90196 Total Submissions: 273390 Difficul ...

  2. oracle调优 浅析有效的游标管理

    浅析有效的游标管理 [思路分析] 能够把游标理解成共享的运行计划,当sql不被共享时.常规的解决思路有两个方向: 1.调整共享池的尺寸(共享池的库缓存区中共享运行计划): 2.sql书写时尽量重用绑定 ...

  3. 倍福TwinCAT(贝福Beckhoff)应用教程13.2 TwinCAT控制松下伺服 NC自定义直线插补

    对于MOVEJ的关节运动来说,我们只关心每个电机的角度(只需要考虑多个电机协同开始运动和结束运动,关键是对每个电机加速度均一化,从而一起跑一起停,这部分内容可以参考机器人学导论以获取更加详细的说明), ...

  4. Python学习笔记(四)多进程的使用

    python中多进程与Linux 下的C基本相同.   fork的基本使用   先看最简单的例子: # coding: utf-8 import os def my_fork(): pid = os. ...

  5. Linux信号(signal) 机制分析(转)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  6. java IO,bufferedReader类

    1,掌握bufferedreader类作用 2,掌握键盘输入的基本格式. Buffer:表示缓冲区,之前的StringBuffer,缓冲区中的内容可以更改,可以提高效率. 如果要想接收任意长度的数据, ...

  7. 使用 curl() 函数实现不同站点之间注册用户的同步

    一 需求 在A站点注册一个新用户,那么,在B站点也会被同时注册 二 思路 在A站点注册的同时,调用API接口实现在B站点也会被同时注册 三 实现 主要代码如下: function http_curl( ...

  8. SHOW CREATE DATABASE Syntax

    SHOW CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name Shows the CREATE DATABASE statement that cre ...

  9. [DevExpress]XtraTabControl右键加入关闭当前页、关闭其它页、所有关闭的实现

    private void xtraTabControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButton ...

  10. Java并发编程(三)概念介绍

    在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...