一:普通装饰器

  • 概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能
  1. 普通装饰器编写的格式

    def 外层函数(参数)
    def 内层函数(*args,**kwargs)
    #函数执行之前
    data= 参数(*args,**kwags)
    #函数执行之后
    return data
    return 内层函数
  2. 用法示例:  
    def func(arg):
    def inner(*args,**kwargs):
    v = arg(*args,**kwargs)
    return v
    return inner @func #@装饰器的语法 : 等价于: index = func(index)
    def index():
    print(123)
    return 666
    ret = index()
    print(ret) 执行原理:
      1. 函数从上往下执行,遇到 @func 时,执行 index = func(index),参数 arg = index,同时将返回值 inner 函数赋值给 index ,
      2. 遇到 index()时,此时就是 inner(),执行 inner 函数
      3. 执行 inner 函数,里面的 arg(*args,**kwargs)执行,就是 index 函数执行,打印 123 ,同时将 index 的返回值 666 赋值给 v : v = 666
      4. 继续执行 inner 函数, inner 函数的返回值是 v , 执行 inner 函数的是 ret = index() , 所以 ret = v = 666
  3. 应用示例
    #示例:计算函数执行时间
    import time
    def base(func):
    def inner(*args,**kwargs):
    start_time = time.time() --->#函数执行之前
    v= func(*args,**kwargs)
    end_tme = time.time() ---->#函数执行之后
    print(end_time-start_time)
    return v
    return inner @base
    def func1():
    time.sleep(2) # 函数执行延缓2秒
    print(123) @base
    def func2():
    time.sleep(1)
    print(456)
  • 关于返回值

    def base(func):
    def inner(*args,**kwargs):
    data = func(*args,**kwargs)
    return data
    return inner @base
    def index():
    print(123)
    return 666
    v1 =index()
    print(v1)
    #func函数带括号,执行index函数,先打印'123',先将666返回给data,data再返回给v1   
  • 关于前后
    def base(func):
    def inner(*args,**kwargs)
    print('函数调用之前')
    data = func(*args,**kwargs) #执行原函数并获取返回值
    print('调用原函数之后')
    return data
    return inner
    @base
    def index()
    print(123)
    index()

二:带参数的装饰器

  • 基本格式

    def base(counter):
    def wrapper(func):
    def inner(*args,**kwargs):
    data = func(*args,**kwargs) # 执行原函数并获取返回值
    return data
    return inner
    return wrapper
    @base(9)
    def index():
    pass # 先执行base函数,然后将返回值wrapper返回,变成不带参数的装饰器
    # counter 参数在装饰器内部任意位置都能被调用 
  • 用法示例
    #写一个带参数的函,实现:参数是多少,被装饰的函数就要执行多少次,返回最后一次执行的结果
    
    def base(counter):
    def wrapper(func):
    def inner(*args,**kwargs):
    for i in range(counter):
    data = func(*args,**kwargs) # 执行原函数并获取返回值
    return data
    return inner
    return wrapper @base(5)
    def index():
    return '好难啊'
    v = index()
    print(v) 

三:生成器 (函数的变异)

  • 概念:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数,会返回一个生成器,生成器只有被for循环时,生成器内部代码才会执行,每次循环都会获取yield返回的值
  • 获取生成器的三种方式
    • 生成器函数
    • 生成器表达式
    • python内部提供的一些
  • 生成器的本质就是迭代器
    • 唯一区别: 生成器是我们自己用python代码构建的数据结构,迭代器都是提供的或者是转化得来的
  • 生成器函数 : 内部是否包含yield
    def func():
    print('F1')
    yield 1
    print('F2')
    yield 2
    print('F3')
    #函数内部代码不会执行,返回一个生成器对象
    v1 = func()
    #生成器可以被for 循环,一旦开始循环函数内部代码就开始执行
    for item in v1:
    print(item)
    # F1 1 F2 2 F3  
  • 特殊的迭代对象
    def func():
    yield 1 v = func()
    result = v.__iter__()
    print(result) 

四:迭代器

  • 概念:对某种对象(str/lsit/tuple/dict/set类创建的对象)中的元素进行逐一获取,表象:具有__nest__方法且每次调用都获取可迭代对象中的元素
  • 优点 : 节省内存,惰性机制
  • 缺点 : 不直观,速度相对慢,操作方法单一,不走回头路
  • 列表转换成迭代器
    • v1 = iter([1,2,3,4])

    • v2 = [1,2,3,4].__iter__()

  • 迭代器想要获取每个元素 : 反复调用val = v1.__next__()
    v1 = "alex"
    v2 = iter(v1)
    while True:
    try:
    val = v2.__next__()
    print(val)
    except StopIterationas e:
    break
  • 直到报错:stoplteration错误,表示迭代已经完毕
  • 如何判断一个对象是否是迭代器 : 内部是否有__next__方法
  • for 循环
    v1 = [11,22,33,44]
    
    # 1.内部会将v1转换成迭代器
    # 2.内部反复执行 迭代器.__next__()
    # 3.取完不报错
    for item in v1:
    print(item) 
  • 可迭代对象
    • 内部具有_iter__方法且返回一个迭代器

    • 可以被for 循环

python-装饰器&生成器&迭代器&推导式的更多相关文章

  1. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  2. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  3. python装饰器、迭代器、生成器

    装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...

  4. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  5. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  6. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

  7. python day 13 生成器 以及 推导式

    1.生成器的本质是迭代器 2.生成器函数 def  fn() 函数体 yield fn() g = fn() 此时这个g就是生成器 所以g 是可迭代的 g._ _next_ _ 每执行一次_ _nex ...

  8. python — 装饰器、迭代器

    目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...

  9. python第六章:三大利器(装饰器,迭代器,生成器)--小白博客

    python装饰器 什么是装饰器?在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 # 原理(个人理解):将原函数(bar)的内存地址重新赋值,进行覆盖.新值为装饰器 ...

随机推荐

  1. bzoj 2157: 旅游 (LCT 边权)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2157 题面; 2157: 旅游 Time Limit: 10 Sec  Memory Lim ...

  2. 科学地增加postgresql最大连接数

    PG配置文件路径 /etc/postgresql/9.3/main/postgresql.conf 首先如何查看最大连接数 This SQL will help you select max_conn ...

  3. .Net Core实践3 配置文件

    环境 .netcore2.1 / vs2017 / win10 / centos7 在.netcore项目中读取配置文件,先添加应用程序配置文件App.config.这个是类库项目的配置文件名. Sy ...

  4. js重点--this关键字

    推荐博客:https://www.cnblogs.com/huaxili/p/5407559.html this是JavaScript的一个关键字,表示的不是对象本身,而是指被调用的上文. 主要用于以 ...

  5. Java基础--面向对象编程4(多态)

    1.多态的概念 多态是指程序中的同一引用类型,使用不同的实例而执行结果不同的. 同一个类型:一般指父类 不同的实例:不同的子类实例 执行结果不同:针对同一方法执行的结果不同 package cn.sx ...

  6. Ubuntu18安装Pycharm时遇到的几个问题

    今天给电脑安装了Ubuntu18.04,安装了一些基础软件. 这里是Ubuntu安装Pycharm的一些问题: 1.安装Pycharm. 首先需要到Pycharm官网进行下载安装包,由于我的是Ubun ...

  7. Tomcat系列(9)——Tomcat 6方面调优(内存,线程,IO,压缩,缓存,集群)

    核心部分 内存 线程 IO 压缩 缓存 集群 一.JVM内存优化 Tomcat内存优化,包括内存大小,垃圾回收策略. Windows 下的catalina.bat,Linux 下的catalina.s ...

  8. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  9. Matplotlib画正弦余弦曲线

    参考1:http://www.labri.fr/perso/nrougier/teaching/matplotlib/ 参考2:https://matplotlib.org/api/artist_ap ...

  10. python基础1之 由来、种类、优缺点、安装环境

    python基础1之由来.种类.优缺点.安装环境 一.前世今生 Python的创始人是吉多·范罗苏姆(Guido van Rossum),在1989年开发.今年最新的编程语言排行榜中,python名列 ...