python杂谈之高阶用法

python因其简单明了,灵活,可移植等优点,一跃成为最受欢迎的程序设计语言之一。python入门简单,对于初学者而言,只需了解python基本的数据类型及基本语法,即能满足大部分日常工作所需。当然像我们这种专业的python程序员,肯定不能仅仅止步于此。若想写出高质量,更为健壮,优雅的代码,实现代码项目化管理,还是需要熟悉相关python高级用法的,下面我将会使用非专业语言为大家讲解一下with用法,迭代器及生成器,装饰器,类方法与静态方法。

with用法

专业解释:确保不管使用过程中是否发生异常/错误都会执行必要的“清理”操作,释放资源。

说起with用法,大家最先想到的肯定是操作文件,with open(r'somefileName')as f,实现上下文管理来自动关闭文件,而无需我们每次手动在代码后加上f.close()。该类用法大家应该都很熟悉,我就不多说了。

本次主要是通过自定义支持上下文管理协议的类,让大家更加了解with语句。平时我们在做自动化测试项目时,为了让自己或团队更好的定位问题,时常需要抛出部分运行错误,但又不能让程序被截断,此时我们都会选择为容易出现错误的代码段,加上异常处理,来捕获异常。而每一段代码都手动加上异常处理,肯定是不符合python简单,灵活的特点的。所以with出动:

class Except_():

def __init__(self,*args,**kwargs):

#做一些事情,一般定义一些初始化变量

pass

def __enter__(self):

#语句体前做一些事情

#返回as 子句所需要的变量,若无,一般返回self即可

return self

# def other_something(self):定义些捕获异常另需做的事情,写log,report等

# pass

def __exit__(self, exc_type➀, exc_value➁,exc_trace➂):

#做一些事情,退出运行的上下文

#返回True,异常不再抛出,一般返回True

#返回False或不返回,异常再次抛出,如raise e

return True

➀:异常类型

➁:异常描述

➂:traceback对象

其中__init__,__enter__,__exit__三方法名及顺序是不可变的,是python定义好的语法,我们按照规则着写即可,其于参数名,类名,方法名随自己喜好。

每次使用时:

或者使用as子句:

withExcept_ as e:

e.other_something()

2.迭代器及生成器

迭代器是可重复调用以生成一系列值的对象,主要实现了惰性计算,只有我们在需要时触发即可,节约内存,且不依赖索引取值。以下方法都可生成一个迭代器,range(5).__iter__(),iter(range(5),map(str, range(5))。

迭代器与普通对象的区别,主要是是否有__iter__()方法,迭代器是不能直接print触发的,只会返回一个可迭代对象。

我们一般选择由list函数触发,也可由for循环触发。

tips:迭代器是必须要被触发的,如同类必须要实例化一样,否则定义一个迭代器无任何意义。

而生成器其实是一种特殊的迭代器,相比普通可迭代对象,实现了延迟计算更加省内存。生成器又可分为两种生成器表达式,生成器函数。

生成器表达式,简单来说,使用一对小括号()将for表达式括起,类似于列表推导式。

生成器函数,相对于普通函数来说,主体中包含至少一条yield语句,所以我们只要看到一个函数中有yield语句,那么它肯定是一个生成器。

简单来说,生成器函数会生成一系列值,每遇到一次yield,便会往该集合中添加一次值(类似于list的append方法)。yield也可理解为return,不同的是return返回后,函数会释放,而生成器则不会,且yield和return语句不能同时存在。

3.装饰器

讲起装饰器,首先需要我们明确两个概念,函数其实也是变量,可以作为其他函数的参数传入,也可作为其他函数的返回值。

而装饰器简单的理解即以函数为参数,并返回函数的一个函数,在不改变原函数名(或类名)的情况下,增强原来函数功能的一种函数。

一个简单的装饰器:

装饰器语法并不用每次都用赋值语句来调用,一般使用语法糖@修饰符+装饰器名字。

多个装饰器装饰一个函数:

从上例中我们可以看出,多个装饰器同时装饰一个函数时,会先装饰dosomethingB再装饰 dosomethingA(优先装饰靠近函数的),但当调用funA时,则先调用dosomethingA,再调用dosomethingB(优先调用远离函数的),执行顺序为((15+3)*2)%10=6。

装饰器传参:

即在普通装饰器外再多一层包装,形成三级嵌套,一级传入参数,二级传入函数参数,三级自定义函数,并返回函数。

4.类方法与静态方法

类方法与普通方法的主要区别为普通方法传入的是实例(self),每次调用必须要实例化,而类方法传入的为类(cls),可直接调用。实例属性只能被实例对象调用,类属性能被类或类的实例对象调用。

静态方法呢,从某种意义上来说就等同于一个普通函数,对参数无任何限制,完全游离于类,只是在执行时需要用类.静态方法名来调用。我的感觉,静态方法就是一个组织代码的工具,有些方法虽然与类无直接联系,但是需要归整时,静态方法就能发挥一定作用了。

Reference:

with用法:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/

迭代器及生成器:https://www.ibm.com/developerworks/cn/analytics/library/ba-on-demand-data-python-1/index.html?ca=drs-

装饰器:http://python.jobbole.com/81683/

类方法与静态方法:https://www.cnblogs.com/blackmatrix/p/5606364.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181130G0TM5700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励