一、装饰器

1.1 目的

  • 在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能

1.2 应用场景

  • 想要为函数扩展功能时,可以选择用装饰器

1.3 基本装饰器

  1. 基本格式:

    def func(arg):
    def inner():
    v = arg()
    return v
    return inner # 重点:
    # 第一步:执行func函数并将下面的函数参数传递,相当于:func(index)
    # 第二步:将func的返回值重新赋值给下面的函数名。 index = func(index)
    @func
    def index():
    print(123)
    return 666 print(index)
  2. 总结

    • 编写格式:
    def 外层函数(参数):
    def 内层函数(*args,**kwargs)
    return 参数(*args,**kwargs)
    return 内层函数
    • 应用格式:
    @外层函数
    def index(): #要装饰的函数
    pass index()
    # 装饰器的编写
    def x(func):
    def y():
    # 前
    ret = func()
    # 后
    return ret
    return y # 装饰器的应用
    @x
    def index():
    return 10 # 执行函数,自动触发装饰器了
    v = index()
    print(v)
  3. 示例:

    def func(arg):
    def inner():
    print('before')
    v = arg()
    print('after')
    return v
    return inner def index():
    print('123')
    return '666' # 示例一
    v1 = index() # 执行index函数,打印123并返回666赋值给v1. # 示例二
    v2 = func(index) # v2是inner函数,arg=index函数
    index = 666
    v3 = v2() # 示例三
    v4 = func(index)
    index = v4 # index ==> inner
    index() # 示例四
    index = func(index)
    index()

1.4 带参数的装饰器

  1. 应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行N次

    # 第一步:执行 ret = xxx(index)
    # 第二步:将返回值赋值给 index = ret
    @xxx
    def index():
    pass # 第一步:执行 v1 = uuu(9)
    # 第二步:ret = v1(index)
    # 第三步:index = ret
    @uuu(9)
    def index():
    pass
  2. 区别:

    # 普通装饰器
    def wrapper(func):
    def inner(*args,**kwargs):
    data = func(*args,**kwargs) # 执行原函数并获取返回值
    return data
    return inner @wrapper
    def index():
    pass # 带参数装饰器
    def x(counter):
    def wrapper(func):
    def inner(*args,**kwargs):
    data = func(*args,**kwargs) # 执行原函数并获取返回值
    return data
    return inner
    return wrapper @x(9)
    def index():
    pass
  3. 练习题

    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。
    def xxx(counter):
    def wrapper(func):
    def inner(*args,**kwargs):
    v = []
    for i in range(counter):
    data = func(*args,**kwargs) # 执行原函数并获取返回值
    v.append(data)
    return v
    return inner
    return wrapper @xxx(5)
    def index():
    return 8
    v = index()
    print(v)

二、 迭代器

2.1 基本知识

  1. 用途:对 某种对象(str/list/tuple/dict/set类创建的对象-可迭代对象)中的元素进行逐一获取

  2. 表象:具有__next__方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)

  3. 示例:

    • 列表转换成迭代器:

      • v1 = iter([11,22,33,44])
      • v1 = [11,22,33,44].__iter__()
    • 迭代器想要获取每个值:反复调用 val = v1.__next__()
    v1 = [11,22,33,44]
    
    # 列表转换成迭代器
    v2 = iter(v1) # 迭代器获取每个值
    result1 = v2.__next__()
    print(result1)
    result2 = v2.__next__()
    print(result2)
    result3 = v2.__next__()
    print(result3)
    result4 = v2.__next__()
    print(result4) result5 = v2.__next__()
    print(result5) # 报错:Stoplteration 表示已经迭代结束
  4. for循环:运用了迭代器

    v1 = [11,22,33,44]
    
    # 1.内部会将v1转换成迭代器
    # 2.内部反复执行 迭代器.__next__()
    # 3.取完不报错
    for item in v1:
    print(item)

2.2 可迭代对象

  1. 表象:可以被for循环的对象就可以称为是可迭代对象

  2. 如何让一个对象变成可迭代对象?

    • 在类中实现__iter__方法且返回一个迭代器(生成器)
    # 示例一:
    class Foo:
    def __iter__(self):
    return iter([1,2,3,4]) obj = Foo() # 示例二:
    class Foo:
    def __iter__(self):
    yield 1
    yield 2
    yield 3 obj = Foo()
  3. 注意:只要能被for循环,就是去看他内部的__iter__方法

三、 生成器

3.1 基本知识

  1. 可以理解为:函数的变异、特殊的迭代器、特殊的可迭代对象

  2. 生成器的作用:

    • 生成数据
    • 迭代
  3. 示例:

    # 生成器函数(内部是否包含yield)
    def func():
    print('F1')
    yield 1
    print('F2')
    yield 2
    print('F3')
    yield 100
    print('F4')
    # 函数内部代码不会执行,返回一个 生成器对象 。
    v1 = func()
    # 生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
    for item in v1:
    print(item)

3.2 关键字

  1. yield

    • 用途:判断函数是否是生成器函数
  2. yield from

    • 用途:从当前生成器函数跳到其他生成器函数中,执行结束后再回原函数继续执行下面代码
    def base():
    yield 88
    yield 99 def func():
    yield 1
    yield 2
    yield from base() # 跳到base函数
    yield 3 result = func()
    for item in result:
    print(item) # 1 2 88 99 3

3.3 总结

  1. 重点:

    • 函数中如果存在yield,那么该函数就是一个生成器函数
    • 调用生成器函数会返回一个生成器
    • 生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值
  2. 建议:

    • 生成器函数中一般不要有return

    • 如果需要终止生成器函数中的循环,可以用return

      def func():
      count = 1
      while True:
      yield count
      count += 1
      if count == 100:
      return
      val = func()
      for item in val:
      print(item)
  3. 生成器示例:读取大文件内容

    def func():
    # 分批去读取文件中的内容,将文件的内容返回给调用者。
    cursor = 0
    while True:
    f = open('db', 'r', encoding='utf-8') # 通过网络连接上redis
    # 代指 redis[0:10]
    f.seek(cursor)
    data_list =[]
    for i in range(10):
    line = f.readline()
    if not line:
    return
    data_list.append(line)
    cursor = f.tell()
    f.close() # 关闭与redis的连接 for row in data_list:
    yield row for item in func():
    print(item)

s21day09 python笔记的更多相关文章

  1. Python笔记之不可不练

    如果您已经有了一定的Python编程基础,那么本文就是为您的编程能力锦上添花,如果您刚刚开始对Python有一点点兴趣,不怕,Python的重点基础知识已经总结在博文<Python笔记之不可不知 ...

  2. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  3. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

  4. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  5. 13.python笔记之pyyaml模块

    Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...

  6. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  7. python笔记 - day8

    python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/art ...

  8. python笔记 - day7-1 之面向对象编程

    python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: ...

  9. python笔记 - day7

    python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblog ...

随机推荐

  1. 【Alpha】Scrum Meeting 4

    目录 前言 任务分配 燃尽图 会议照片 签入记录 困难 前言 第4次会议在4月8日由PM在教一317召开. 对项目完成情况进行了确认,分配下一阶段任务.时长60min. 任务分配 姓名 当前阶段任务 ...

  2. G711 G723 G729线路占多少带宽问题

    G.711   G.711   也称为PCM(脉冲编码调制),是国际电信联盟订定出来的一套语音压缩标准,主要用于电话.它主要用脉冲编码调制对音频采样,采样率为8k每秒.它利用一个 64Kbps 未压缩 ...

  3. 王之泰201771010131《面向对象程序设计(java)》第十周学习总结

    第一部分:理论知识学习部分 第八章  泛型程序设计 1.泛型程序设计概念 1)JDK 5.0 中增加的泛型类型,是Java 语言中类型安全的一次重要改进. 2)泛型:也称参数化类型(parameter ...

  4. Go 使用 JSON

    Encode 将一个对象编码成 JSON 数据,接受一个 interface{} 对象,返回 []byte 和 err func Marshal(v interface{}) {[]byte,err} ...

  5. Nginx教程---03.Nginx日志切割

    Nginx的定时任务与自动切割 明确: 如果这个网站的访问量比较大,那么一天下来 nginx日志可能会特别的大,所以当出现这种情况呢,如果 把每天的日志都存在同一个日志文件里,会使你的日志文件大到让你 ...

  6. 《深入理解Nginx:模块开发与架构解析》读书笔记

    1.nginx的特点:快.扩展性强.可靠性强.内存低消耗.支持高并发.热部署.开源免费 2.nginx由master进程来管理多个(CPU数)worker进程 3.配置按功能分,有4类: 1)用于调试 ...

  7. IDEA中更改Tomcat服务器的URL

    先别参考以下的做法,貌似出了点状况,后续修正!!! 直接上图吧 看IDEA的右上角 点击黄色方框内的Edit Configurations,进入以下的编辑面 后面四个框内的都可以修改,当然不要修改和其 ...

  8. nodejs web API 相关杂项

    场景是这样的: docker-compose中起多个服务,其中有一个是nodejs写的作为web API. 这个API 的使用者有2类: 1 docker-compose网络内其他特定服务访问,作为C ...

  9. C#执行EXE程序

    第一种方法:System.Diagnostics.ProcessStartInfo info =new System.Diagnostics.ProcessStartInfo(path);info.W ...

  10. Javascript 智能输入数字且保留小数点后三位

    html: <input type="text" name="cprice" placeholder="最多保留小数点后三位" onk ...