Python小技巧之迭代器和装饰器

一、迭代器

  • 迭代器协议:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一个对象,要么引起一个StopIteration异常以终止迭代,迭代只能向后进行不能往前回退。

  • 可迭代对象:可实现迭代器协议的对象(通过对象内部定义的__iter__()方法)。

  • python的内部工具如for循环、sum、max、min、map、reduce、filter等都通过迭代器协议访问对象。

  • 使用for循环访问可迭代对象的本质:调用对象的__iter__()方法生成可迭代对象、执行可迭代对象的__next__()方法依次访问元素、全部访问之后自动终止。

s=(1,'a',{'b':1},[1,2])
a=s.__iter__()  #调用元组内部的__iter__()方法生成可迭代对象
print(a)  #输出<tuple_iterator object at 0x0000000002701550>
print(a.__next__())  #输出1
#调用可迭代对象的__next__()访问元素,每执行一次访问一个元素,也可以使用next(a)访问
print(a.__next__())  #输出a
print(a.__next__())  #输出{'b': 1}
print(a.__next__())  #输出[1, 2]
#此处执行后已访问到最后一个元素,如果再执行一次a.__next__()会报StopIteration错误
  • 两种方法提供生成器,生成器只能遍历一次,遍历完之后就为空。

        1、生成器函数:类似常规函数,但使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从离开的地方继续执行。

def d():
    yield 1,2,3
    yield 2
a=d()
print(a)  #输出<generator object d at 0x000000000214A318>,表示a是一个生成器对象
print(a.__next__())  #输出(1, 2, 3)
print(a.__next__())  #输出2

        2、生成器表达式,类似列表推导,但是生成器会按需产生一个对象,而不是一次生成。

a=(i for i in range(10))
print(a)  #输出<generator object <genexpr> at 0x000000000219A318>,表示a是一个生成器对象
print(a.__next__())  #输出0
print(a.__next__())  #输出1

二、装饰器

  • 装饰器本质:函数闭包的语法糖,一个函数,该函数用来处理其他函数,在不改变源函数的情况下添加功能,装饰器的返回值可以是一个函数对象。

  • 使用场景:插入日志,事务处理,缓存,权限校验等。

  • 装饰器=高阶函数+函数嵌套+闭包。

  • 函数闭包:

    • 1、必须函数嵌套函数。

    • 2、内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量。

    • 3、外部函数必须返回内嵌函数——必须返回那个内部函数。

    • 4、闭包的作用:可以保持程序上一次运行后的状态然后继续执行。

  • 自动化测试场景如:计算函数的执行时间。

import time

def show_time(func):
    def inner():
        start_time = time.time() #开始时间
        func()#函数调用
        end_time = time.time()#结束时间
        print(f"函数执行时间{end_time-start_time}")
    return inner #返回函数对象

@show_time   #相当于 case = show_time(case) 语法糖
def case():
    print("执行测试用例")
    time.sleep(1)

case()

#输出
#执行测试用例
#函数执行时间1.0030663013458252

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值