day20

一、上节内容回顾

迭代器运行的三种方式:

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()
原文地址:https://www.cnblogs.com/zhangguoxv/p/9844664.html