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)

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

最新文章

  1. 转:Java中abstract和interface的区别
  2. [LeetCode] 10. Regular Expression Matching
  3. 【uoj149】 NOIP2015—子串
  4. metasploit(MSF)终端命令大全
  5. CentOS下配置SMTP
  6. java静态成员的初始化过程
  7. (翻译)W3C的Turtle文档
  8. LDAP-HA安装与配置(Keepalived方式实现)
  9. Node 系列之path模块
  10. IDEA创建lo4j模板
  11. 使用Java打印字符串表格(中英文内容不乱)
  12. 自定义控件详解(五):onMeasure()、onLayout()
  13. ListView 控件和 INotifyPropertyChanged 接口
  14. IE8 margin:0 auto 不能居中显示的问题
  15. 用html+css+js实现选项卡切换效果
  16. python 流程控制(for循环语句)
  17. Python3基础 __len__,__getitem__ 记录列表中元素访问的次数 定制不可变序列,下标字典
  18. Thinkphp学习笔记7-输入变量
  19. cdoj916-方老师的分身 III 【拓扑排序】
  20. OC - ARC(自动引用计数)

热门文章

  1. mipmap一
  2. 关于container_of和list_for_each_entry 及其相关函数的分析
  3. [Tools] Create a Simple CLI Tool in Node.js with CAC
  4. [PWA] Customize the Splash Screen of a PWA built with create-react-app
  5. block传值以及利用block封装一个网络请求类
  6. Protractor(angular定制的e2e)的简易入门
  7. TCP/IP详解 卷一(第十一章 UDP:用户数据报协议)
  8. 51单片机 | 实现SMC1602液晶屏显示实例
  9. spring aop中的propagation(传播属性)的7种配置的意思
  10. linux程序设计——取消一个线程(第十二章)