• 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()
  • 相关阅读:
    Python之路(第十七篇)logging模块
    Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
    Python之路(第十四篇)os模块
    Python之路(第十三篇)time模块、random模块、string模块、验证码练习
    Python之路(第十二篇)程序解耦、模块介绍导入安装、包
    Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器
    Python之路(第十一篇)装饰器
    Python之路(第十篇)迭代器协议、for循环机制、三元运算、列表解析式、生成器
    Python之路(第九篇)Python文件操作
    Python编程笔记(第二篇)二进制、字符编码、数据类型
  • 原文地址:https://www.cnblogs.com/zhangguoxv/p/9844664.html
Copyright © 2020-2023  润新知