zoukankan      html  css  js  c++  java
  • python高级语法进阶

    python中几个比较难懂概念进阶。

    迭代器

    实现了迭代器协议的容器对象,基于如下两个方法:

     __next__:返回容器的下一个元素    
     __iter__:返回迭代器本身
    

    由此可见,如果要自定义一个迭代器,需要编写一个具有next方法的类,只要这个类提供返回迭代器实例的iter特殊方法:

    class CountDown(object):
        def __init__(self, step):
            self.step = step
    
        def __next__(self):
            if self.step <= 0:
                raise StopIteration
            self.step -= 1
            return self.step
    
        def __iter__(self):
            return self
    
    for ele in CountDown(4):
        print(ele)
    

    生成器

    被称为特殊的迭代器,是python中协程、异步并发的基础。两个比较重要的方法: send、next,实际上next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去。因此,我们可以看做c.next() 和 c.send(None) 作用是一样的。

    可参见: https://blog.csdn.net/qq_39521554/article/details/79864889

    send既然可以传值变成yield的返回值,因此生成器中的函数可以根据客户端代码改变自身行为,为此还添加了另外两个函数:throw,close,会向生成器抛出错误。

    装饰器

    说起装饰器,一直局限于就是在一个函数内部定义了一个子函数,然后把子函数返回一种形式。其实任何可调用对象(任何实现了call方法的对象都是可调用的)都可以作为装饰器。

    • 作为一个函数

      def mydecorator(function):
          def wrapped(*args, **kwargs):
              # before dosomthing
              result = function(*args, **kwargs)
              # after dosomthing
              return result
      
          return wrapped
      
    • 作为一个类

    如果装饰器需要复杂的参数化或依赖于特定状态,最好作为一个类来定义。

    class DecoratorAsClass:
        def __init__(self,function):
            self.function=function
    
        def __call__(self, *args, **kwargs):
            # before dosomthing
    
            result = function(*args, **kwargs)
            # after dosomthing
    
            return result
    
    • 参数化装饰器

      def repeat(number=3):
          """
          多次重复执行装饰函数
          :param number: 
          :return: 
          """
          def actual_decorator(function):
              def wrapper(*args, **kwargs):
                  result = None
                  for _ in range(number):
                      result = function(*args, **kwargs)
                  return result
      
              return wrapper
      
          return actual_decorator
      
    • 保存内省的装饰器

    乍一看这个名字很玄乎,其实就是一种可以保存被装饰函数元数据的装饰器。使用以上几种装饰器都不会保存函数的元数据(主要是文档字符串和原始函数名)。 解决这个问题主要是借助于functools模块内置的wraps()装饰器:

    from functools import wraps 
    
    def preserving_decorator(function):
        @wraps(function)
        def wrapped(*args, **kwargs):
            """
            包装函数内部文档
            :param args:
            :param kwargs:
            :return:
            """
            return function(*args, **kwargs)
    
        return wrapped  
    
    @preserving_decorator
    def func_with_imported_docstring():
        pass
    

    用法和有用的示例

    参数检查

    缓存

    代理

    上下文提供者

     

     

    上下文管理器

    主要使用with语句,任何实现了上下文管理器协议的对象都可以用作上下文管理器。该协议包含两个特殊的方法:

    • __enter__(self)
    • __exit__(self,exc_type,exc_value,tracback)

    待续.....................

  • 相关阅读:
    IIS无法显示 XML 页
    asp.net实现sql存取图片
    微软的面试题
    IIS配置.Net问题大全
    Asp.Net调用WebService
    生活本无常,前路更精彩
    【转载】碰到讨厌的老板怎么办
    xxxx不必xx尽,留些xxxx
    【BLOG】Mr梵谷
    机会,从来都是留给有准备的你
  • 原文地址:https://www.cnblogs.com/tianboblog/p/9682570.html
Copyright © 2011-2022 走看看