学习python的第十一天

一、装饰器

1.什么是装饰器

装饰器的本质就是一个实参高阶函数和返回值高阶函数
装饰器是用来给函数添加功能的(在不久改原函数的基础上给函数添加功能)

# 返回值高阶函数
def func1():
    def func2():
        return 'abc'

    return func2()


print(func1())

2.怎么给函数添加功能

方法一: 直接修改函数

def sum1(a, b):
    time1 = time.time()
    print(a + b)
    time2 = time.time()
    print(time2 - time1)


sum1(10, 20)

方法二:实参高阶函数

# 统计执行函数的时间
def count_execution_time(func, *args, **kwargs):
    time1 = time.time()
    func(*args, **kwargs)
    time2 = time.time()
    print('执行时间:', time2 - time1)


def func2(m, n):
    print(m * n)
    print('hello world!')


count_execution_time(func2, 2135, -3156)

方法三:装饰器 实参高阶函数改进

def count_execution_time(func):
    def test():
        time1 = time.time()
        func()
        time2 = time.time()
        print('执行时间:', time2 - time1)

    return test


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


func4 = count_execution_time(func4)

方法四:装饰器

def 函数名1(func):
    def test(*args, **kwargs):
        func(*args, **kwargs)
        添加新的功能  (可以在func前可以在func后)
    return test

说明:
函数名1 - 装饰器对应的函数名,也是装饰器的名字(根据需要添加的新功能命名)
func - func指向的就是需要添加新功能的函数
test - 指向的是已经添加完功能的新函数

练习:写一个装饰器,在函数执行前打印’start’

def print_strat(func):
    def test(*args, **kwargs):
        print('strat', end='')
        func(*args, **kwargs)

    return test


@print_strat
def func1():
    print('你好吗?')


func1()

二、有参的装饰器

如果在实现装饰器新增的功能的时候需要额外的数据,那么就可以使用有参的装饰器

def 装饰器名称(装饰器参数列表)
    def test1(func):
        def test2(*args,**kwargs):
            func(*args,**kwargs)
            添加新的功能
        return test2
    return test1

三、迭代器

1.什么是迭代器

1)迭代器特点

迭代器是一种特殊容器:
a.不能直接查看所有元素(打印看不到结果;不能计算长度)
b.如果要读取元素的值必须将这个元素从迭代器中取出来(取出来后就再也放不回去,迭代器中不再有这个元素了)

2)创建迭代器

创建迭代器的方式有两种:
a.将其他序列转换成迭代器:iter(序列)
b.创建生成器(生成器本质就是迭代器)

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

注意:不管以任何形式获取到了迭代器的元素,这个元素在迭代器中都不存在了

1)获取单个元素
2) 遍历
iter3 = iter(['name','age','hello','world'])
for x in iter3:
    print(x)

四、生成器

1.什么是生成器

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

2.怎么创建生成器

调用带有yield关键字的函数就能得到一个生成器
调用普通函数:a.执行函数体,获取函数返回值
调用带有yield关键字的函数:a.不执行函数体 b.获取到的是生成器对象
生成器怎么产生数据:
a.一个生成器能产生多少数据 - 看执行生成器对应的函数,在函数结束的时候能够遇到几次yield就能生成多少个数据
b.生成器生成的数据是哪些 - 每次遇到yield,yield后面的数据是什么,产生的就是什么

def func3():
    yield
    print('======')
    yield
    print('++++++')


gen1 = func3()
print(gen1)
print(len(list(gen1)))

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

调用函数创建生成器对象的时候不会执行函数体;当获取生成器中的元素的时候才会执行函数体。获取第一个元素的时候从函数开始执行,执行遇到第一个yield就会停下来,并且将yield后面的数据作为这次获取的元素,下次获取元素的时候从上一次结束的位置接着往后执行函数体直到遇到下一个yield,并且将新的yield的数据作为新的元素,以此类推,如果从上次结束的位置开始到函数结束都没有遇到yield那么这个生成器就不会再创建数据了,如果是next操作,就会报错

练习: 写一个学号的生成器

def stu_num():
    for x in range(1,10000):
        yield f'stu{x:0>4}'


stu_num_gen = stu_num()
print(next(stu_num_gen))
print(next(stu_num_gen))
for _ in range(10):
    print(next(stu_num_gen))

# 注意: 每次调用函数的时候都是在创建新的生成器对象
print(next(stu_num()))  #stu0001
print(next(stu_num()))  #stu0001
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值