day13生成器

补充:

无参装饰器模板

def wrapper(func):
    def inner(*args, **kwargs):
    	# 在装饰对象前添加功能
        res = func(*args, **kwargs)
        # 在装饰对象后添加功能
        return res
    return inner

有参装饰器模板

def outer(arg):
    def wrapper(func):
        def inner(*args, **kwargs):
            res = func(*arg, **kwargs)
            return res
        return inner
    return wrapper

生成器:

  • 什么是生成器

    • 生成的工具

      生成器是一个“自定义”的迭代器,本质上是一个迭代器,

  • 如何实现生成器

    • 但凡在函数内部定义了的yield。
    • 调用函数时,函数体代码不会执行
    • 会返回一个结果,该结果就是一个生成器
  • yield

    • 每一次yield都会往生成器对象中添加一个值。

      —yield只能在函数内部定义

      —yield可以保存函数的暂停状态

    # 自定义迭代器
    def func():
        print('from func')
        yield  #yield可以保持函数的\n
                # 暂停状态,不会被执行
                
    自定义的迭代器
    def func():
        print('开始准备下蛋')
        print('1---火鸡蛋1')
        yield '火鸡蛋1'
        print('2---火鸡蛋2')
        yield '火鸡蛋2'
        print('3---火鸡蛋3')    # 可以通过yield依次执行函数体代码
        yield '火鸡蛋3'
    
  • yield和return:

    • 相同点:

      ​ 返回的值都是无限制的。

    • 不同点:

      ​ return只能返回一次值,yield可以返回多个值。

迭代器
l1 = [1, 2, 3, 4, 5]
iter_l1 = (l1.__iter__())
print(iter_l1)  # 得到的是迭代器对象的地址

print(iter_l1.__next__())  
# 当我们通过__next__取值时,才会执行函数体代码。
print(iter_l1.__next__())
# 自定义range功能,创建一个自定义的生成器

def my_range(start,end, move =1 ):  #开始,结束,步长
    while start < end:
        yield start
        start += move

g_range = my_range(1, 5)
print(g_range)

for line in g_range:
    print(line)
posted @ 2019-11-14 20:42  猫-园  阅读(97)  评论(0编辑  收藏  举报