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)
待续.....................
python高级语法进阶的更多相关文章
- Python高级语法之:一篇文章了解yield与Generator生成器
Python高级语法中,由一个yield关键词生成的generator生成器,是精髓中的精髓.它虽然比装饰器.魔法方法更难懂,但是它强大到我们难以想象的地步:小到简单的for loop循环,大到代替多 ...
- Python高级语法总结
1.Python面向对象 创建类 使用class语句来创建一个新类,class之后为类的名称并以冒号结尾,如下实例: class ClassName: '类的帮助信息' #类文档字符串 class_s ...
- 网络编程-Python高级语法-装饰器
理论:装饰器就是运行一个函数之前首先运行装饰器函数,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数 ...
- 网络编程-Python高级语法-property属性
知识点: 一.什么是property属性? 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最 ...
- 网络编程-Python高级语法-GIL全局解释器锁
知识点:GIL全局解释器锁其实和Python没有任何关系,是由于当初编写Python解释器时留下的,它只对多线程有影响,GIL保证同一时刻只有一个线程在运行,即使是多核配置电脑,同一时刻也只会让一个线 ...
- python 高级语法
#coding:utf-8 #定义一个装饰器函数 def doc_func(func): #包裹函数(闭包) def warpfunc(): #做一些额外的事情 print "%s call ...
- Python高级语法-贯彻回顾-元类(4.99.1)
@ 目录 1.为什么要掌握元类 2.正文 关于作者 1.为什么要掌握元类 在django中编写models的时候遇到了元类的相关操作 并且在mini-web框架编写的时候也遇到了相关的问题 意识到深入 ...
- Python高级语法-对象实例对象属性-类与实例,class方法静态方法等(4.6.1)
@ 目录 1.说明 2.代码 关于作者 1.说明 python中属性:类属性,实例属性 方法:类方法,实例方法,静态方法 想修改类属性,只能是类方法,因为只有类方法把cls(类)传入数据里面 静态方法 ...
- 网络编程-Python高级语法-闭包
什么叫闭包?通俗来说就是函数里嵌套函数,从表现形式来看,内部函数引用外部函数的作用域里的变量,那么内部函数就称为闭包 举例说明: 1.闭包=函数块+定义函数时的环境,inner就是函数块,x就是环境 ...
随机推荐
- appium 几点总结(转)
1. 建立session时常用命令: DesiredCapabilities cap = new DesiredCapabilities(); cap.SetCapability("brow ...
- Asp.net问题集锦
1.在Web应用开发中经常碰到这样的情况,Dropdownlist绑定的数据太多,用户要选择某一项必须从头找到尾,使用起来很不方便.最近我在工作中就碰到这种情况,公司内某个业务系统需要绑定几百条的厂家 ...
- 百度地图 Android SDK - 标注(Marker)的基本使用
标注(Marker)是开发人员最常使用的地图覆盖物志一.今天就来向大家介绍一些标注(Marker)的最基本用法! 实现目标: 1.构建基础地图页面: 2.在地图的中心点处加入 Marker: 3.实现 ...
- 微信小程序 - .gitignore失效问题
-------------------------------------------- Last Update Date:2018-8-8 ----------------------------- ...
- 【BIEE】05_启动BIEE时,无法启动BI_SERVER
本地修改资料库后,重新启动BIEE,结果报错: 点击[查看日志信息]后 从这里是没看出是什么问题造成的,那么我们就要去查询启动日志了 问题解决 找到日志路径:D:\obiee\instances\in ...
- 【Excle数据透视表】如何让字段标题不显示“求和项”
我们做好了数据透视表之后是下面这个样子的 这个样子一点都不好看,那么如何去掉"求和项"呢? 步骤 方法① 单击B3单元格→编辑区域输入"数量 "→Enter(也 ...
- Mysql视图的创建及使用
视图理解: 视图又叫虚表.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成. 视 ...
- Java学习从入门到精通(2) [转载]
Java Learning Path(二).书籍篇 学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
- 【优才原创】Android的拖放机制
优才网 [优才原创]Android的拖放机制 2016-04-18 优才学院 优才网 一.拖放机制概述 ² 拖放操作是手指触摸屏幕上的某一对象.然后拖动该对象.最后在屏幕的某个位置释放该对象并运行某种 ...