一.装饰器
1.什么是装饰器
- 装饰器的本质就是一个实参高阶函数和返回值高阶函数。
- 装饰器是用来给函数添加功能(在不修改原函数的基础上给函数添加功能)
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):
time1 = time.time()
func(*args, **kwargs)
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()
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
@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))
print(next(iter1))
print(next(iter1))
print(next(iter1))
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)
3.生成器怎么生产数据
- a. 一个生成器能生产多少数据?
看执行生成器对应的函数,在函数结束的时候能够遇到几次yield,就能生产多少个数据 - b. 生产器生产的数据是哪些?
看每次遇到 yield, yield后面的数据是什么,产生的数据就是什么
1)一个生成器能生产多少数据
def func3():
yield
print('=====')
yield
print('+++++')
gen1 = func3()
print(gen1)
print(len(list(gen1)))
4.生成器产生数据的原理
- 调用函数创建生成器对象的时候不会执行函数体;当获取生成器中的元素的时候才会执行函数体。
- 获取第一个元素的时候从函数开始开始执行,执行遇到第一个yield就会停下来,并且将yield后面的数据作为这次获取到的元素,下次获取元素的时候从上一次结束的位置接着往后执行函数体直到遇到下一个yield,并且将新的yield的数据作为新的元素,
以此类推 - 如果从上次结束的位置开始到函数结束都没有遇到yield那么这个生成器就不会再创建数据了,如果是next操作,这个时候会报错