python的迭代器,生成器和装饰器你了解吗
python 迭代器与生成器,装饰器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
list1=[1,2,3] s=iter(list1) # 创建迭代器对象 print(next(s)) # 输出迭代器的下一个元素 print(next(s)) print(next(s))
直到计算出最后一个元素,没有更多的元素时,抛出StopIteration的错误
迭代器对象可以使用常规for语句进行遍历:
list2=[1,2,3,4,5] s2 = iter(list2) # 创建迭代器对象 for h in s2: print (h, end="-")
生成器
带有 yield 的函数在 Python 中被称之为 generator(生成器)(自己制作迭代器可以看做是生成器)
#注意括号 #列表生成式 lis = [x+x for x in range(5)] print(lis) #生成器 gen= (x+x for x in range(5)) print(gen) # gen = (x+x for x in range(5)) # print(next(gen)) # print(next(gen)) # print(next(gen)) # print(next(gen)) # print(next(gen)) generator_ex = (x+x for x in range(5)) for i in generator_ex: print(i)
自己产生一个支持小数的range生成器(即带yield的迭代器)
你先把yield看做“return”,这个是直观的,它首先是个return,普通的return是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运行了。看做return之后再把它看做一个是生成器(generator)的一部分(带yield的函数才是真正的迭代器),
def frange(star,stop,step): x=star while x<stop: yield x x+=step for i in frange(10,20,0.5): print(i)
下图最直观得可以看出yield的作用
把yield想想成return,return了一个4之后,程序停止,并没有执行赋值给res操作。
一个带有 yield 的函数就是一个 generator,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
def foo(): print("starting...") while True: print("yield前") res = yield 4 print("yield后") print("res:", res) g = foo() print(next(g)) print("*" * 20) print(next(g))
在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶上这顶帽子,这顶帽子我们称之为装饰函数 或 装饰器。
装饰器的使用方法很固定:
先定义一个装饰函数(帽子)(也可以用类、偏函数实现)
再定义你的业务函数、或者类(人)
最后把这顶帽子带在这个人头上
装饰器的简单的用法有很多,这里举两个常见的。
日志打印器
时间计时器
# 这是装饰函数 def logger(func): def wrapper(*args, **kw): print('我准备开始计算:{} 函数了:'.format(func.__name__)) # 真正执行的是这行。 func(*args, **kw) print('啊哈,我计算完啦。给自己加个鸡腿!!') return wrapper @logger def add(x, y): print('{} + {} = {}'.format(x, y, x+y)) add(200, 50)
# 这是装饰函数 def timer(func): def wrapper(*args, **kw): t1=time.time() # 这是函数真正执行的地方 func(*args, **kw) t2=time.time() # 计算下时长 cost_time = t2-t1 print("花费时间:{}秒".format(cost_time)) return wrapper import time @timer def want_sleep(sleep_time): time.sleep(sleep_time) want_sleep(10)
def american(): print("我来自中国。") def chinese(): print("I am from America.") def say_hello(contry): def wrapper(func): def deco(*args, **kwargs): if contry == "china": print("你好!") elif contry == "america": print('hello.') else: return # 真正执行函数的地方 func(*args, **kwargs) return deco return wrapper @say_hello("china") def american(): print("我来自中国。") @say_hello("america") def chinese(): print("I am from America.")
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!