Python中的装饰器,迭代器,生成器

一.装饰器

1.什么是装饰器

  • 装饰器的本质就是一个实参高阶函数和返回值高阶函数。
  • 装饰器是用来给函数添加功能(在不修改原函数的基础上给函数添加功能)
# func1就是返回值高阶函数
def func1():
    def func2():
        return 'abc'
    return func2

2.怎么给函数添加功能

  • 方法一:直接修改原函数, 问题:给不同的函数添加相同功能的时候代码需要写多遍
def sum1(a=10, b=20):
    time1 = time.time()   # 获取当前时间
    print(a+b)
    time2 = time.time()
    print('执行时间:', time2-time1)


sum1(10, 20)
  • 方法二:实参高阶函数
# 定义一个函数功能是统计一个函数的执行时间
def count_execution_time(func, *args, **kwargs):
    # func= func4
    time1 = time.time()
    func(*args, **kwargs)    # func4()
    time2 = time.time()
    print('执行时间:', time2-time1)


def func2():
    print('你好,世界!')


func2()
count_execution_time(func2)

  • 方法三: 实参高阶函数改进
def count_execution_time(func):
    def test(*args, **kwargs):
        time1 = time.time()
        # time.sleep(2)
        func(*args, **kwargs)
        time2 = time.time()
        print('执行时间:', time2-time1)
    return test


def func4(m):
    print('=======')


func4 = count_execution_time(func4)
func4(10)
  • 方法四:装饰器
  • 语法:
def 函数名1(func):
    def test(*args, **kwargs):
        func(*args, **kwargs)
        添加新的功能
    return test
  • 说明:
    函数名1 - 装饰器对应的函数名,也是装饰器的名字(根据需要添加的新功能命名)
    func - func指向的就是需要添加新功能的函数
    test - 指向的是已经添加完功能的新的函数
  • 练习:
    写一个装饰器在函数执行前打印 ‘start…’
    print(’=================================’)


def add_start(func):
    def test(*args, **kwargs):
        print('start...')
        func(*args, **kwargs)
    return test


@add_start
def func3():
    print('你好吗?')


func3()

3.有参的装饰器

  • 如果在实现装饰器新增的功能的时候需要额外的数据,那么就可以使用有参装饰器
  • 语法:
def 装饰器名称(装饰器的参数列表):
     def test1(func):
        def test2(*args, **kwargs):
            func(*args, **kwargs)
            添加新的功能
        return test2
    return test1
  • 练习: 写一个装饰器让函数的返回值保留N位小数(返回值是数字的时候)
def constraint_decimals(n):
   def test1(func):
       def test2(*args, **kwargs):
           result = func(*args, **kwargs)
           if type(result) == float:
               nums = str(result).split('.')
               return float(f'{nums[0]}.{nums[-1][0:n]}')
           return result
       return test2
   return test1

# 3.1 -> 3.100
# 3.1415926  ->


@constraint_decimals(3)
def sum1(a, b):
   return a+b

二.迭代器

1.什么是迭代器(iter)

1)迭代器的特点
  • 迭代器是一种特殊容器:
    a.不能直接查看所有的元素(打印看不到任何元素;不能计算长度)
    b.如果要读取元素的值必须将这个元素从迭代器中取出来(取出来以后就再也放不回去,迭代器中就不再有这个元素了)
2)怎么创建迭代器
  • 创建迭代器的方式有两种:
    a.将其他序列转换成迭代器: iter(序列)
    b.创建生成器(生成器的本质就是迭代器)

2.获取迭代器元素(查)

1)获取单个元素
  • next(迭代器) - 获取迭代器中最前面的一个元素
print(next(iter1))   # 10
print(next(iter1))   # 20
print(next(iter1))   # 30
print(next(iter1))   # 40
2)遍历
iter3 = iter(['name', 'age', 'hello', 'world'])
for x in iter3:
    print(x)

三.生成器

1.生成器

  • 生成器的本质就是迭代器;
  • 生成器其实是能够产生多个数据的容器,而不是真正同时保存多个数据的容器

2.怎么创建生成器

  • 调用带有yield关键字的函数就能得到一个生成器
  • 调用带有yield关键字的函数:a.不执行函数体 b.获取到的是生成器对象
def func2():
    print('ABC')
    return 200
    yield


result = func2()
print(result)     # <generator object func2 at 0x1083f4150>

3.生成器怎么生产数据

  • a. 一个生成器能生产多少数据?
    看执行生成器对应的函数,在函数结束的时候能够遇到几次yield,就能生产多少个数据
  • b. 生产器生产的数据是哪些?
    看每次遇到 yield, yield后面的数据是什么,产生的数据就是什么
1)一个生成器能生产多少数据
def func3():
   yield
   print('=====')
   yield
   print('+++++')


gen1 = func3()
print(gen1)     # <generator object func3 at 0x10e8931d0>
print(len(list(gen1)))   # 2

4.生成器产生数据的原理

  • 调用函数创建生成器对象的时候不会执行函数体;当获取生成器中的元素的时候才会执行函数体。
  • 获取第一个元素的时候从函数开始开始执行,执行遇到第一个yield就会停下来,并且将yield后面的数据作为这次获取到的元素,下次获取元素的时候从上一次结束的位置接着往后执行函数体直到遇到下一个yield,并且将新的yield的数据作为新的元素,
    以此类推
  • 如果从上次结束的位置开始到函数结束都没有遇到yield那么这个生成器就不会再创建数据了,如果是next操作,这个时候会报错
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值