python的三大器(装饰器,生成器,迭代器)....

一 .装饰器

装饰器的作用:

  1. 装饰器的本质:是一个闭包(高阶函数+嵌套函数)
  2. 装饰器的功能:在不修改原函数的及其调用的情况下对原函数的功能进行扩展。

流程:
定义一个要装饰的功能,定义第一个内层函数,内层函数他必须是多值参数的形式,把功能写好,然后调用内层函数,并且给他一个返回值,等把装饰功能写好后,在把这个返回值给它返回来,然后在把内层函数名给返回来。

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。

如何创建一个生成器:

  1. 第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

  2. 如果一个函数中包含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表达式整体的结果

你可能感兴趣的:(python的三大器(装饰器,生成器,迭代器)....)