装饰器的作用:
流程:
定义一个要装饰的功能,定义第一个内层函数,内层函数他必须是多值参数的形式,把功能写好,然后调用内层函数,并且给他一个返回值,等把装饰功能写好后,在把这个返回值给它返回来,然后在把内层函数名给返回来。
import time
def cla_index(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
end_time = time.time()
print(end_time-start_time)
return ret
return inner
@cla_index
def add(m,n):
time.sleep(2.2)
return m + n
print(add(1,2))
当我们任何函数需要装饰的时候,直接@函数名(语法糖)
优点:
我们程序的拓展性不仅很强,而且还特别安全,不会对原来程序的结构以及调用的接口造成任何的影响。
迭代器:
迭代是访问集合的一种方式,迭代器是可以记住便利的位置的对象。迭代对象从集合的第一个元素开始访问,知道所有的元素被访问完结束,迭代器只能往前不会后退。、
拥有_iter_()和_next_()方法就是一个迭代器
可迭代对象:
数据使用for的便利的对象,就是一个迭代对象,或者实现的__iter__()方法就是一个可迭代对象,
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
isinstance() 判断某个东西是否可以迭代:
form collections.abc import Iterable
print(isinstance([1,2,33],Iterable)
凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象
定义:
在Python中,一边循环一边计算的机制,称为生成器:generator。
如何创建一个生成器:
第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
如果一个函数中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。调用函数就是创建了一个生成器(generator)对象。
生成器的工作原理
(1)生成器(generator)能够迭代的关键是它有一个next()方法,
工作原理就是通过重复调用next()方法,直到捕获一个异常。
(2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
可用next()调用生成器对象来取值。next 两种方式 t.next() | next(t)。
可用for 循环获取返回值(每执行一次,取生成器里面一个值)
(基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。
(3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
(4).send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果