您的位置:首页 > 编程语言 > Python开发

Python之迭代器,生成器与装饰器进阶

2019-02-23 21:04 645 查看

一.迭代器
  1.1 可迭代对象:
      含有__iter__()方法的对象是可迭代对象 -- 可迭代协议
  2.2 迭代器
      执行了__iter__()方法返回的就是迭代器,增加了__next__()方法,可以用next取值
      迭代器优点:
          取值一个一个取,不会一次性取出所有的值,内存占用少
二.生成器
   2.1 生成器函数
   2.2 生成器表达式
   2.3 生成器函数的另一种用法:中途可以传值,首先要用__next__方法激活
       def generator():
           print(111)
           recv = yield 1
           print(recv)
           recv= yield 2
           print(recv)
           recv = yield 3
           print(recv)
      g = generator()
      ret = g.__next__()
      print(ret)
      ret = g.send('first send')
      print(ret)
      ret = g.send('second send')
      print(ret)
      
      # python3 新用法
      # def generator():
      #     a = [1,2,3,4,5]
      #     b = [6,7,8,9,10]
      #     yield from a
      #     yield from b
      # g = generator()
      # for i in g:
      #     print(i)
三.生成器函数
  只要含有yield关键字的函数都是生成器函数,yield不能和return共用且需要写在函数内部
  # def generator():
  #     print('第一个生成器函数')
  #     yield 2
  # ret = generator()
  # print(ret)
  # <generator object generator at 0x0000020B84512EB8> 返回一个生成器对象
  # print(dir(ret))
  # ['__class__', '__del__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__name__', '__ne__', '__new__', '__next__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
  # 有__iter__,和__next__方法,说明生成器也是迭代器
 
  # def generator():
  #     yield '第一个yield'
  #     yield '第二个yield'
  #     yield '第三个yield'
  #     yield '第四个yield'
  #     yield '第五个yield'
  # g = generator()
  # print(g.__next__())
  # print('-' * 20)
  # print(g.__next__())
  # print('-' * 20)
  # print(g.__next__())
  # print('-' * 20)
  # print(g.__next__())
  # print('-' * 20)
  # print(g.__next__())
  # print('-' * 20)
  # print(g.__next__())  # 所有值取完报错:StopIteration
  # print('-' * 20)
  # 遇到一个yield即停止,下一次调用从上一个yield后开始,在处理大数据的时候优势明显,每次处理一部分,下一次从上一次结束的地方接着向下执行
二.装饰器进阶
   # def wraper(fun):
   #     def expendFunc():
   #         print("sourceFunc前执行的代码")
   #         fun()
   #         print("sourceFunc后执行的代码")
   #     return expendFunc
   # @wraper
   # def sourceFunc():
   #     '''
   #     sourcFunc的文档注释
   #     '''
   #     print("装饰器补充...")
   # sourceFunc()
   # print(sourceFunc.__name__) # 输出的是expendFfunc
   # print(sourceFunc.__doc__) # 输出的是None
   # 原函数的名字和文档注释都被改变了
   # from functools import wraps
   #
   # def wraper(fun):
   #     @wraps(fun)
   #     def expendFunc():
   #         print("sourceFunc前执行的代码")
   #         fun()
   #         print("sourceFunc后执行的代码")
   #     return expendFunc
   # @wraper
   # def sourceFunc():
   #     '''
   #     sourcFunc的文档注释
   #     '''
   #     print("装饰器补充...")
   # sourceFunc()
   # print(sourceFunc.__name__) # 输出的是sourceFunc
   # print(sourceFunc.__doc__) # 输出的是"sourcFunc的文档注释"
   
   # 多个装饰器装饰一个函数
   # from functools import wraps
   #
   # def wraper1(fun):
   #     @wraps(fun)
   #     def expendFunc1():
   #         print("执行fun前执行wraper1中的代码...")
   #         fun()
   #         print("执行完fun后执行wraper1中的代码...")
   #     return expendFunc1
   #
   # def wraper2(fun):
   #     @wraps(fun)
   #     def expendFunc2():
   #         print("执行fun前执行wraper2中的代码...")
   #         fun()
   #         print("执行完fun后执行wraper2中的代码...")
   #     return expendFunc2
   # @wraper1
   # @wraper2
   # def func():
   #     print("这是一个被wraper1和wraper2一起装饰的函数")
   # func()
   # 执行fun前执行wraper1中的代码...
   # 执行fun前执行wraper2中的代码...
   # 这是一个被wraper1和wraper2一起装饰的函数
   # 执行完fun后执行wraper2中的代码...
   # 执行完fun后执行wraper1中的代码...
   # @wraper2
   # @wraper1
   # def func():
   #     print("这是一个被wraper1和wraper2一起装饰的函数")
   # func()
   # 执行fun前执行wraper2中的代码...
   # 执行fun前执行wraper1中的代码...
   # 这是一个被wraper1和wraper2一起装饰的函数
   # 执行完fun后执行wraper1中的代码...
   # 执行完fun后执行wraper2中的代码...
   
   # 多个函数取消装饰器的效果--带参数的装饰器:FLAG设置为False则扩展功能
   # from functools import wraps
   #
   # FLAG = True
   # def wraperOut(flag):
   #     def wraper(fun):
   #         @wraps(fun)
   #         def expendFunc():
   #             if flag:
   #                 print("执行fun前执行的代码...")
   #                 fun()
   #                 print("执行fun后执行的代码...")
   #             else:fun()
   #         return expendFunc
   #     return wraper
   #
   # @wraperOut(FLAG)
   # def func1():
   #     print(func1.__name__)
   #
   # @wraperOut(FLAG)
   # def func2():
   #     print(func2.__name__)
   #
   # func1()
   # func2()

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: