python迭代器、生成器、装饰器、上下文管理器

  • 迭代器

    python迭代器就是一个实现了迭代容器的实现对象

    本身有两个方法:

            __next__:返回容器下一个元素

            __iter__:返回迭代器本身

    python迭代器、生成器、装饰器、上下文管理器_第1张图片

 

  • 生成器

        generator生成器带有yield语句的函数都可以称之为生成器,生成器是可以进行迭代的。生成器可以用for或者next进行迭代。

        python迭代器、生成器、装饰器、上下文管理器_第2张图片

        generator还可以使用send进行值的传递。

        python迭代器、生成器、装饰器、上下文管理器_第3张图片

  • 装饰器

        装饰器的作用就是使函数包装与方法包装(一个函数,接受函数并返回增强后的函数)

        语法和实现方式:

  1. 作为一个函数

            

def mydecoretor(function):

    def wrapped(*args,**kwargs):

        #在调用函数前,做点什么

        result = function(*args,**kwargs)

        #函数调用之后,做点什么

        #并返回结果

        return result

    return function

    

       2. 作为一个类

        如果装饰器需要复杂的参数化或者特定的依赖状态。可以写成类的形式。尽管绝大多数情况装饰器都是用函数来实现的。

       

class DecoratorAsClass:

    def __init__(self, function):

        self.function = function

 

    def __call__(self, *args, **kwargs):

        #在调用原始函数前,做点什么

        result = self.function(*args, **kwargs)

        #在调用原始函数后,做点什么

        #并返回结果

 

        return result

 

     3. 参数化装饰器

def repeat(number = 3):

    '''多次执行装饰函数。

 

    返回最后一次原始函数调用的值作为结果

    :param number:重复次数,默认为3

    '''

    def actual_decorator(function):

        def wrapped(*args,**kwargs):

            result = None

            for _ in range(number):

                result = function(*args,**kwargs)

            return result

        return wrapped

    return actual_decorator

  1. 保存内省的装饰器

        python迭代器、生成器、装饰器、上下文管理器_第4张图片

 

    装饰器用法和有用的例子:

            用法:

                ①参数检查

                ②缓存

                ③代理

                ④上下文提供者

 

 

 

  • 上下文管理器

            为了确保即使再出现错误的情况下也可以运行某部分代码:try......finally语句是很有用的。

        这个语句的场景:

                ①关闭一个锁

                ②关闭一个文件

                ③创建一个临时代码补丁

                ④在特殊环境中运行受保护的代码

        with语句给这些场景的代码块提供了一种简单的方式。即,即使该段代码出现错误,依然可以运行某部分的代码。

        with 所求值的对象必须包含__enter__()方法和一个__exit__()方法。

        紧跟with 后面的语句被求值以后,返回对象的__enter__()对象被执行,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块完全执行了之后,再执行__exit__()方法

#!/usr/bin/env python

# with_example01.py

class Sample:

    def __enter__(self):

        print "In __enter__()"

        return "Foo"

    def __exit__(self, type, value, trace):

        print "In __exit__()"

def get_sample():

    return Sample()

with get_sample() as sample:

    print "sample:", sample

结果为:

In __enter__()

sample: Foo

In __exit__()

ps:__exit__方法的三个参数:

type:

value: integer division or modulo by zero

trace:

解释:with后面任何代码块异常抛出时,__exit__()方法就被执行了,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了

Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

你可能感兴趣的:(python基础,python,迭代器生成器)