一、上节内容回顾
迭代器运行的三种方式:
t.__next__(), next(t), t.send()
def test(): print('开始啦') first=yield #return 1 first=None print('第一次',first) yield 2 print('第二次') yield 3 t=test() res=t.__next__() # 开始啦 print(res) # None res=t.send(5) # 第一次 5(把值传给上一次的yield,并继续往下执行) print(res) # 2
使用迭代器,计算一段文字中,每个单词出现的位置
def index_words(text): if text: yield 0 for index,letter in enumerate(text,1): # 将字符串中的每个字母都列出索引 if letter == ' ': yield index g = index_words('hello ni hao amen') print(g) print(g.__next__()) # 0 print(g.__next__()) # 6 print(g.__next__()) # 9 print(g.__next__()) # 13 print(g.__next__()) # StopIteration
def test(): for i in range(4): yield i t = test() # t 是生成器,此时并未运行 print(list(test()))# 生成器函数可以无穷遍历 [0, 1, 2, 3] print(t) # <generator object test at 0x00000000011038E0> 此时还没运行 t print(list(t)) # [0, 1, 2, 3] 因为list具有遍历作用,因此运行了 t
def test(): for i in range(4): yield i t = test() # t 是生成器,此时并未运行 for i in t: print(i) # 0 # 1 # 2 # 3 t1 = (i for i in t)# t已经被遍历过了 print(list(t1)) # []
def test(): for i in range(4): yield i t = test() # t 是生成器,此时并未运行 t1 = (i for i in t) t2 = (i for i in t1) print(list(t1)) # [0, 1, 2, 3] 遍历t1 print(list(t2)) # [] t1 被遍历过,里面没有值了
二、装饰器
装饰器 = 高阶函数 + 函数嵌套 + 闭包
计算函数运行时间
import time def func(l): start_time = time.time() res = 0 for i in l: res += i time.sleep(1) stop_time = time.time() print('函数的运行时间是%s' %(stop_time - start_time)) return res s = func(range(10)) print(s)
仅用高阶函数做不到添加装饰器功能
# 高阶函数定义: # 1.函数接收的参数是一个函数名 # 2.函数的返回值是一个函数名 # 3.满足上述条件任意一个,都可称之为高阶函数 import time def foo(): time.sleep(2) print('Come baby!') def timer(func): start_time = time.time() func() stop_time = time.time() print('运行时间为 %s' %(stop_time - start_time)) timer(foo) # 第一种方法,但违背了装饰器原则 import time def foo(): time.sleep(2) print('Come baby!') def timer(func): start_time = time.time() func() stop_time = time.time() print('运行时间为 %s' %(stop_time - start_time)) return func foo = timer(foo) foo() # 第二种方法,但foo多执行了一次
利用闭包功能实现装饰器
import time def timmer(func): #func=test def wrapper():# 用于写装饰器添加的功能 # print(func) start_time=time.time() func() #就是在运行test() stop_time = time.time() print('运行时间是%s' %(stop_time-start_time)) return wrapper @timmer # 关联timmer()函数 def test(): time.sleep(1) print('北风吹') test()