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)

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

python高级语法进阶的更多相关文章

  1. Python高级语法之:一篇文章了解yield与Generator生成器

    Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多 ...

  2. Python高级语法总结

    1.Python面向对象 创建类 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例: class ClassName: '类的帮助信息' #类文档字符串 class_s ...

  3. 网络编程-Python高级语法-装饰器

    理论:装饰器就是运行一个函数之前首先运行装饰器函数,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数 ...

  4. 网络编程-Python高级语法-property属性

    知识点: 一.什么是property属性? 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最 ...

  5. 网络编程-Python高级语法-GIL全局解释器锁

    知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线 ...

  6. python 高级语法

    #coding:utf-8 #定义一个装饰器函数 def doc_func(func): #包裹函数(闭包) def warpfunc(): #做一些额外的事情 print "%s call ...

  7. Python高级语法-贯彻回顾-元类(4.99.1)

    @ 目录 1.为什么要掌握元类 2.正文 关于作者 1.为什么要掌握元类 在django中编写models的时候遇到了元类的相关操作 并且在mini-web框架编写的时候也遇到了相关的问题 意识到深入 ...

  8. Python高级语法-对象实例对象属性-类与实例,class方法静态方法等(4.6.1)

    @ 目录 1.说明 2.代码 关于作者 1.说明 python中属性:类属性,实例属性 方法:类方法,实例方法,静态方法 想修改类属性,只能是类方法,因为只有类方法把cls(类)传入数据里面 静态方法 ...

  9. 网络编程-Python高级语法-闭包

    什么叫闭包?通俗来说就是函数里嵌套函数,从表现形式来看,内部函数引用外部函数的作用域里的变量,那么内部函数就称为闭包 举例说明: 1.闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境 ...

随机推荐

  1. 如何设计好的RESTful API 之好的RESTful API 特征

    原文地址:http://blog.csdn.net/ywk253100/article/details/25654021 导读:设计好RESTful API对于软件架构的可扩展性.可伸缩性和消费者的体 ...

  2. Redis 命令二

    一.连接控制 QUIT 关闭连接 AUTH (仅限启用时)简单的密码验证 二.适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0; DEL key 删除某个key, ...

  3. pip virtualenv requirements

    pip可以很方便的安装.卸载和管理Python的包.virtualenv则可以建立多个独立的虚拟环境,各个环境中拥有自己的python解释器和各自的package包,互不影响.pip和virtuale ...

  4. How to support both ipv4 and ipv6 address for JAVA code.

    IPv6 have colon character, for example FF:00::EEIf concatenate URL String, IPv6 URL will like: http: ...

  5. idea 搭建spring boot

    打开IntelliJ IDEA,在菜单栏选择File菜单-->New-->Project...-->Spring Initializr,Project SDK即选择JDK的版本,Ch ...

  6. 2017.5.27 使用propagation实现:根据参数决定是否需要事务管理

    1.功能描述 要实现rest接口:POST ***/entry,其中参数中有action参数. 当action=rollback时,批量新增出错时需要回滚. 当action!=rollback时,批量 ...

  7. Win7 Visual Studio 2008如何注册

    默认是90天试用   在控制面板中卸载程序,然后找到VS2008,点击卸载/更改   到这一步就不要动了   去下载并运行CrackVS2008ForWindows7,然后点击右上角的Bug微软,弹出 ...

  8. python pip install error

    使用pip install的时候报错 解决方法是使用如下的命令进行安装 python -m pip install sqlalchemy 升级pip的命令python2 -m pip install ...

  9. Oracle创建表空间与用户

    /* 说明:若已经存在相应的用户和表空间,则需要先删除相应的用户和表空间 然后再全部重新建立 */ --删除用户 drop user XDAYWEIXIN cascade; --删除表空间 drop ...

  10. 会话管理之Cookie技术

    会话管理是web开发中比较重要的环节,这一节主要总结下会话管理中的cookie技术. 1. 何为会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个 ...