第6章 函数

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

  • 6.1 函数的定义和调用
  • 6.2 参数传递
  • 6.3 函数返回值
  • 6.4 变量作用域
  • 6.5 匿名函数(lambda)
  • 6.6 递归函数
  • 6.7 迭代器
  • 6.8 生成器
  • 6.9 装饰器

6.9 装饰器

装饰器本质上是一个 Python 函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,它也不会改变函数或类的调用方式。

它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码到装饰器中并继续重用。

概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。

装饰器的语法是将@装饰器名,放在被装饰对象上面。

有两类装饰器:函数装饰器、类装饰器

# 函数装饰器的语法
@dec
def func():pass
参数说明:
@称为语法糖
dec:装饰器名字
func:被装饰的函数名

在介绍装饰器之前,先明确几个概念及原则:

原则:

Python程序是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行的,只有等到该函数被调用时,才会执行其内部的代码块。

如果一个函数定义了两次,那么后面定义的会覆盖前面的定义。

在Python中代码的放置位置是有区别的,不能随意摆放,通常函数体要放在调用的语句之前。

概念:

函数名、函数体、返回值,函数的内存地址、函数名加括号、函数名被当作参数、函数名加括号被当作参数、返回函数名、返回函数名加括号。

# 加操作:无参数
import timedef timer(func):def inner():t1 = time.time()func()t2 = time.time()return t2 - t1return inner@timer
def add():a = 1b = 1time.sleep(1)c = a + bprint(c)return cadd = add()
print(add)

函数名: timer 、 add 、 inner

函数体:除def那一行外的部分

返回值: return后面的表达式

函数的内存地址: id(add) 、 id(outer) 等等

函数名加括号:对函数进行调用,比如 add() 、 timer(func)

函数名作为参数: timer(func) 中的 func 本身是个函数,但作为参数被传递给了timer函数

函数名加括号被当做参数:其实就是先调用函数,再将它的返回值当做别的函数的参数,例如 timer(add())

返回函数名: return inner

返回函数名加括号: return inner() ,其实就是先执行inner函数,再将其返回值作为别的函数的返回值。

一个装饰器例子:

'''
1、@timer,称为语法糖,其作用是将被装饰函数add的函数名作为实参传给装饰器timer函数的形参func,传函数名实际传的是内存指向;
2、函数timer内又嵌套了inner函数,返回值是函数名inner,必须要明确的是,传进去函数名add,返回来inner函数名,结果就是add和inner共同指向在内存中定义inner的起始地址,而此时形参func指向在内存定义add的起始地址,可在调试程序过程中通过id方法打印查看add和inner所指向的内存地址的变化情况。
明确这两点,装饰器就不难理解了。
'''
# 加操作:无参数
import timedef timer(func):def inner():t1 = time.time()func()t2 = time.time()return t2 - t1return inner@timer
def add():a = 1b = 1time.sleep(1)c = a + bprint(c)return cadd = add()
print(add)
# 加操作:位置参数
import timedef timer(func):def inner(a, b):t1 = time.time()func(a, b)t2 = time.time()return t2 - t1return inner@timer
def add(a, b):# a = 1# b = 1time.sleep(1)c = a + bprint(c)return cadd = add(1, 1)
print(add)
# 加操作:可变参数
import timedef timer(func):def inner(*args):t1 = time.time()func(*args)t2 = time.time()return t2 - t1return inner@timer
def add(a, b):# a = 1# b = 1time.sleep(1)c = a + bprint(c)return cadd = add(1, 1)
print(add)
# 加减乘除操作:可变参数
import timedef timer(func):def inner(*args):t1 = time.time()func(*args)t2 = time.time()return t2 - t1return inner@timer
def add(a, b):# a = 1# b = 1time.sleep(1)c = a + bprint(c)return c@timer
def plus(a, b):# a = 1# b = 1time.sleep(2)c = a - bprint(c)return c@timer
def multi(a, b):# a = 1# b = 1time.sleep(3)c = a * bprint(c)return c@timer
def div(a, b):# a = 1# b = 1time.sleep(4)c = a / bprint(c)return cadd = add(1, 1)
print(add)
plus = plus(2, 1)
print(plus)
multi = multi(3, 1)
print(multi)
div = div(4, 1)
print(div)

Python3 装饰器解析相关推荐

  1. python3 装饰器_Python3 装饰器

    一 什么是装饰器呢? 装饰器本质上来说就是函数,功能就是为其它函数添加附加功能. 原则: 不修改被修饰函数的源代码 不修改被修饰函数的调用方式 组织结构: 装饰器=高阶函数+函数嵌套+闭包 实例1(P ...

  2. python3装饰器例子_python 装饰器(三):装饰器实例(一)

    示例 7-15 定义了一个装饰器,它会在每次调用被装饰的函数时计时,然后把经过的时间.传入的参数和调用的结果打印出来. 示例 7-15 一个简单的装饰器,输出函数的运行时间 importtimedef ...

  3. Python3 装饰器进行log日志输出

    前言 使用Python 装饰器decorator来对函数进行日志输出_ 2021年3月 测试可用 环境 Python 3.7 代码 代码目录: logger.py -> 日志装饰器: 用来写lo ...

  4. python3装饰器详解_Python装饰器详解

    按照 Python 的编程原则,当一个函数被定义后,如要修改或扩展其功能应尽量避免直接修改函数定义的代码段,否则该函数在其他地方被调用时将无法正常运行.因此,当需要修改或扩展已被定义的函数的功能而不希 ...

  5. python三层装饰器-python3装饰器

    python装饰器 预备知识 首先我们要知道在python,一切皆对象,函数也是一个对象 >>> def test(): ... return "Hello World&q ...

  6. python类装饰器详解-Python 类装饰器解析

    1. 类装饰器(都不带参数) class ClassDeco: def __init__(self, func): self.func = func def __call__(self, *args, ...

  7. python3装饰器的高级使用

    #practice26:缓存与装饰器(递归子问题) 对于需要重复计算子问题的情况,可以使用缓存,缓存实现有两种方式:1.在函数内定义某种数据结构存储数据 2.使用装饰器(闭包结构) 菲波那切数列为:1 ...

  8. python3 装饰器_python3装饰器

    python装饰器 预备知识 首先我们要知道在python,一切皆对象,函数也是一个对象 >>> def test(): ... return "Hello World&q ...

  9. python3 装饰器参数_Learn Python 3:装饰器

    一.理解装饰器 通俗点说,当我们想给一个函数增强额外的功能,但又不想修改原函数的定义,同时新增的功能其它函数可能也需要使用,装饰器就是来解决这种需求的,将与原函数功能无关的代码提取出来,实现复用,在代 ...

最新文章

  1. 人工智能还给我们留多少空间?
  2. VB 实现大文件的分割与恢复,引用 ADODB.Stream 提供一个过程代码
  3. python 日期_python日期操作
  4. loss=nan解决办法
  5. sklearn中的正则化
  6. web容器获取SSL指纹实现和ByPass
  7. mvc4 html.beginform,MVC4 Html.BeginForm在Internet Explorer中提交按钮 9不工
  8. 2021巨量引擎手机行业人群洞察白皮书
  9. SuperSlidev2.1 轮播图片和无缝滚动
  10. java的头怎么写_JAVA对象布局之对象头(Object Header)
  11. app闪退后重启_安卓APP崩溃(crash)后重新启动,捕获全局异常重启APP
  12. javascript div 弹出可拖动窗口
  13. 《人月神话》——2人月神话
  14. 书单 | 测试工程师必读经典好书,你读过几本?
  15. 下载m3u8文件中的视频,使用FFMpeg解密合并.ts文件
  16. 如何用快慢指针在链表找到中间点
  17. PXE网络批量装机+Kickstart无人值守安装
  18. Java学到什么程度才能叫精通?
  19. ORA-01578: ORACLE 数据块损坏 之奇妙处理 DBV
  20. 2.1.4 字符与字符串编码

热门文章

  1. docker清理磁盘占用
  2. WinForm下屏幕截图程序的实现
  3. BootStrap的入门和响应式的使用
  4. 目前发展医疗物联网的困境解析
  5. 2015 年出现的十大流行 Python 库
  6. PHP规范之PSR-1
  7. 【HDOJ】2389 Rain on your Parade
  8. 那些年我看过的前端书
  9. 如何在PHP中实现链式方法调用
  10. 为什么企业开发者要关心Silverlight