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. python xml与字典的相互转换

    def trans_xml_to_dict(xml): """ 将微信支付交互返回的 XML 格式数据转化为 Python Dict 对象 :param xml: 原始 ...

  2. ES6里关于模板字面量的拓展

    JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系 ...

  3. dom元素父子容器互相调用控制

    在html中普通的父容器调用子容器中的方法十分简单 因为这两个容器的所有方法和属性都在同一个dom模型中 可以直接控制和使用 但是如果子容器中是一个iframe标签又是怎样的情况? iframe请求另 ...

  4. 2017.3.31 spring mvc教程(二)核心流程及配置详解

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  5. Android——Activity的生命周期

    一,Demo測试Activity的生命周期 写两个Activity: package com.example.activity_04; import android.os.Bundle; import ...

  6. 全民Scheme(1):数字游戏

    刚刚看到两句话,感觉不错,分享给大家: 1.用户的问题.就是我们的问题 2.做一些用户想要的东西 (define add1 (lambda (x) (+ 1 x))) (define sub1 (la ...

  7. python——双下划线与python命名机制

    python中双下划线的作用(1)所有以双下划线开头的成员是私有的(2)python对于私有变量是会进行扎压(mangling)的,扎压规则是原始定义:class A():    __function ...

  8. TCP/IP详解 卷一(第十八章 TCP连接的建立和终止)

    建立连接 建立一个TCP连接时会发生下述情况 1.客户TCP发送一个SYN(同步)分节,它告诉服务器将在(待建立)连接中发送的数据的初始序列号. 2.服务器确认(ACK)客户的SYN,同时自己也得发送 ...

  9. 如何创建JAR文件?如何运行.jar形式的Java程序?

    一.如何创建JAR文件? .jar是用来压缩档案或者解压档案的文件格式,其特点是具有无损压缩的功能.想知道如何创建这种程序?请访问 http://www.cnblogs.com/yjmyzz/p/ex ...

  10. ASP.NET CORE RAZOR :初始化数据库

    官方说法是:设定数据库种子https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/sql 应用背景:初次部署系统时,设定一 ...