python学习七(基础知识)
python基础学习七
本章内容
- 装饰器
- 生成器
- 迭代器
1.装饰器
装饰器 decorator
或者称为包装器,是对函数的一种包装。
它能使函数的功能得到扩充,而同时不用修改函数本身的代码。
它能够增加函数执行前、执行后的行为,而不需对调用函数的代码做任何改变
def showtime(f): def inner(): start = time.time() f() end = time.time() print("spend %s" % (end - start)) return inner @showtime #bar=showtime(bar) def bar(): print('bar....') time.sleep(3) bar()
#结果
bar....
spend 3.000171661376953
import time def showtime(f): def inner(x,y): start = time.time() f(x,y) end = time.time() print("spend %s" % (end - start)) return inner @showtime #add=showtime(add) def add(a,b): print(a+b) time.sleep(1) add(1,2)
#结果
3
spend 1.0000572204589844
import time def showtime(f): def inner(*x,**y): start = time.time() f(*x,**y) end = time.time() print("spend %s" % (end - start)) return inner @showtime #bar=showtime(bar) def add1(*a,**b): sums = 0 for i in a: sums += i print(sums) time.sleep(2) add1(1,2,5,7,9)
#结果
24
spend 2.0001144409179688
import time #装饰器参数 def logger(flag=''): def showtime(f): def inner(*x, **y): start = time.time() f(*x, **y) end = time.time() print("spend %s" % (end - start)) if flag == "true": print("日志记录") return inner return showtime @logger("true")#showtime def add1(*a,**b): sums = 0 for i in a: sums += i print(sums) time.sleep(2) add1(1,2,5,7,9)
#结果
24
spend 2.0001144409179688
日志记录
2.生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)
生成器都是迭代器,迭代器不一定是生成器
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。
def f(): print("ok") yield 1 print("ok") yield 2 return None g = f() print(g) #<generator object f at 0x0000000001E4F5E8> next(g) next(g) next(g) #报StopIteration
使用 yield 实现斐波那契数列:
import sys def fib(max): n,a,b = 0,0,1 while n < max: yield a a,b = b,a+b n += 1 f = fib(7) #f 是一个迭代器,由生成器返回生成 print(f) #<generator object fib at 0x0000000001D125E8> while True: #0 1 1 2 3 5 8 try: print(next(f),end=" ") except StopIteration: sys.exit()
3.迭代器
代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,而在一系列结果的末尾时,会引发StopIteration错误。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
可以直接作用于for循环的对象统称为可迭代对象:
一类是集合数据类型,如list、tuple、dict、set、str等
一类是generator,包括生成器和带yield的generator function。
l=[1,2,3,5] d = iter(l) # 创建迭代器对象 print(d) #<list_iterator object at 0x0000000001D969B0> print(next(d)) # 输出迭代器的下一个元素 print(next(d)) print(next(d)) print(next(d)) print(next(d)) #报StopIteration
自定义迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__():
__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。
class MyNum: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration mynum = MyNum() itr = iter(mynum) for x in itr: print(x)

浙公网安备 33010602011771号