装饰器,生成器,迭代器

装饰器:  
  器:代表函数
  装饰:装饰其他函数


  装饰器原则:
    不能修改被装饰函数的源代码
    不能修改被装饰函数的调用方式


  实现装饰器:
    1 函数即变量 (匿名函数没有函数名,使用完就会被回收)
    2 高阶函数
      a:把一个函数名当做实参传给另外一个函数
      b:返回值中包含函数名
    3 嵌套函数
      a:在函数体内用def声明一个函数

    4 闭包:函数接受的参数可以传递给内嵌函数里

  一个简单的装饰器:

    def timer(func):
      def test2(*args): # 可变参数能接收不一样的环境
        start_time = time.time()
        func(*args)
        end_time = time.time()
        print("时间间隔是: --> %s " % (end_time - start_time) )
      return test2    # 返回的一定是函数名, 不能带(), 否则会出错


      @timer
      def test1():
        time.sleep(3)
        print('in test1')

 

  用法:

    在要被装饰的函数前加上@装饰器名, 这句话相当于test1 = timer(test1)

列表生成式:
  [ i*i for i in range(10) ]

生成器:
  分为列表生成器和函数生成器
    注意, 生成器只能迭代一次, 使用完了就完了, 在处理超大数据的时候合适
  列表生成器:
    将列表生成器的中括号换成小括号
      ( i*i for i in range(10) )

  与list的区别;
    调用时候才生成, 特别快, 不使用不占内存
    不支持切片
    只记录当前位置, __next__()方法

  函数生成器:
    yield:返回一个值, 此时程序等待下次调用, 处于挂起状态
    send:可以给yield传值

  生成器的例子:
import time

def consumer(name):
    print("ready for beef")
    while True:
        beef = yield
        print("beef %s comes, eaten by %s" % (beef, name))


def producer(name):
    c1 = consumer('A')
    c2 = consumer('B')
    c1.__next__()
    c2.__next__()
    print("doing meet beef")
    for i in range(3):
        time.sleep(1)
        print("1 beef made, 2 copule")
        c1.send(i)
        c2.send(i)


producer("hinimix")
 
迭代器:
  生成器是迭代器(Iterator), list,dict,str是可以迭代的, 但是不是迭代器
  迭代器转换iter()

  注意
    凡是可作用与for循环的都是Iterable类型
    凡是可作用于next()函数的对象都是Iterator类型,
原文地址:https://www.cnblogs.com/hinimix/p/8080075.html