day13-迭代器、生成器、装饰器

一.迭代器

  1. 什么是迭代器(iter)

    1)迭代器是内容型数据类型。

    2)怎么创建迭代器:a.将其他序列转换成迭代器。 b.创建生成器。

    3)特点:打印的时候不能查看元素;无法获取元素个数;获取元素的时候必须将元素从迭代器中 取出,而且取出后元素会从迭代器中消失,并且无法再添加。

    #创建迭代器
    i1 = iter('abc')
    print(i1)	# <str_iterator object at 0x10653ebe0>
    print(len(i1))	# 报错!
    i2 = iter([10, 20, 'abc', 30])
    print(i2)	# <list_iterator object at 0x10705ed60>
    
  2. 获取元素

    迭代器不管以什么样的方式获取到了它的元素,那么被获取到的元素就会从迭代器中消失。

    1)获取单个元素

    ​ next(迭代器) - 获取迭代器最前面那个元素。

    2)遍历

    for 变量 in 迭代器:
        pass
    
    i1 = iter('abc')
    print(next(i1))     # 'a'
    print(next(i1))     # 'b'
    print(next(i1))     # 'c'
    # print(next(i1))     # 报错!StopIteration
    

二.生成器

  1. 什么是生成器

    1)生成器是容器型数据类型,但是生成器中存储的并不是数据,而是产生数据的算法。

    2)生成器从获取数据的角度来看还是迭代器。

  2. 如何创建生成器

    调用一个带有yield关键字的函数就可以得到一个生成器对象。

    注意:如果被调用的函数中有yield,那么调用函数的时候不会执行函数体,也不会获取返回值,而是得到一 个生成器。

    def func1():
        yield
        print('+++')
        print('---')
        return 100
    
  3. 如何控制生成器元素的个数和值

    执行创建生成器函数的函数体的时候,会遇到几次yield,那么对应的生成器就可以创建几个数据,每次遇到yield,yield后面的值就是创建的具体的数据。

    def number_gender():
        yield 100
        yield 200
        yield 300
        
    gen1 = number_gender()
    print(list(gen1))	#[100, 200, 300]
    

三.装饰器

  1. 装饰器 = 实参高阶函数 + 返回值高阶函数 +糖语法

  2. 用来给已经定义好的函数添加功能。

  3. 添加功能 - 统计函数执行时间

    import time
    #方案一:直接将新增的功能对应代码添加到函数中。
    #存在的问题:如果多个函数都要添加相同的时候,需要将新增功能的代码写多遍。
    def func1():
        start = time.time()
        print('hello world!')
        end = time.time()
        print(f'执行时间:{end - start}')
    #方案二:直接使用实参高阶函数
    def count_time(f):
        start = time.time()
        f()
        end = time.time()
        print(f'执行时间:{end - start}')
    #方案三:使用装饰器
    def total_time(f):
        def new_f(*args, **kwargs):
            start = time.time()
            result = f(*args, **kwargs)
            end = time.time()
            print(f'执行时间:{end - start}')
            return result
        return new_f
    

四.装饰器语法

  1. 无参装饰器语法

    def 装饰器名称(原函数对应的形参):
        def 新函数名(*args, **kwargs):
            原函数返回值 = 原函数(*args, **kwargs)
            新增功能
            return 原函数返回值
        return 新函数名
    
    def 装饰器名称(f):
        def new_f(*args, **kwargs):
            result = f(*args, **kwargs)
            新增功能
            return result
        return new_f
    
    # 练习:写一个装饰器在函数调用结束后打印'千锋教育'
    def add_logo(f):
        # f = func2
        def new_f(*args, **kwargs):
            result = f(*args, **kwargs)
            print('千锋教育')
            return result
        print(new_f)
        return new_f
    
    
    @add_logo
    def func1():
        print('hello world~')
    
    
    func1()
    
    @add_logo
    def func2(n, m=2):
        print(n * 2 + m)
    
    
    func2(10, 20)
    
    # 练习:写一个装饰器将函数返回值乘以100
    # 20  -> 2000
    
    
    def ride100(f):
        def new_f(*args, **kwargs):
            result = f(*args, **kwargs)
            if type(result) in (int, float):
                return result * 100
            return result
        return new_f
    
    
    @ride100
    def func1():
        return 12.3
    
    
    result = func1()
    print(f'result:{result}')
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值