您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > Python语句、函数与方法的使用技巧总结
Python语句、函数与方法的使用技巧总结显示有限的接口到外部当发布python第三方package时,并不希望代码中所有的函数或者class可以被外部import,在__init__.py中添加__all__属性,该list中填写可以import的类或者函数名,可以起到限制的import的作用,防止外部import其他函数或者类。#!/usr/bin/envpython#-*-coding:utf-8-*-frombaseimportAPIBasefromclientimportClientfromdecoratorimportinterface,export,streamfromserverimportServerfromstorageimportStoragefromutilimport(LogFormatter,disable_logging_to_stderr,enable_logging_to_kids,info)__all__=['APIBase','Client','LogFormatter','Server','Storage','disable_logging_to_stderr','enable_logging_to_kids','export','info','interface','stream']with的魔力with语句需要支持上下文管理协议的对象,上下文管理协议包含__enter__和__exit__两个方法。with语句建立运行时上下文需要通过这两个方法执行进入和退出操作。其中上下文表达式是跟在with之后的表达式,该表达式返回一个上下文管理对象。#常见with使用场景withopen(test.txt,r)asmy_file:#注意,是__enter__()方法的返回值赋值给了my_file,forlineinmy_file:printline知道具体原理,我们可以自定义支持上下文管理协议的类,类中实现__enter__和__exit__方法。#!/usr/bin/envpython#-*-coding:utf-8-*-classMyWith(object):def__init__(self):print__init__methoddef__enter__(self):print__enter__methodreturnself#返回对象给as后的变量def__exit__(self,exc_type,exc_value,exc_traceback):print__exit__methodifexc_tracebackisNone:printExitedwithoutExceptionreturnTrueelse:printExitedwithExceptionreturnFalsedeftest_with():withMyWith()asmy_with:printrunningmy_withprint------分割线-----withMyWith()asmy_with:printrunningbeforeExceptionraiseExceptionprintrunningafterExceptionif__name__=='__main__':test_with()执行结果如下:__init__method__enter__methodrunningmy_with__exit__methodExitedwithoutException------分割线-----__init__method__enter__methodrunningbeforeException__exit__methodExitedwithExceptionTraceback(mostrecentcalllast):Filebin/python,line34,inmoduleexec(compile(__file__f.read(),__file__,exec))Filetest_with.py,line33,inmoduletest_with()Filetest_with.py,line28,intest_withraiseExceptionException证明了会先执行__enter__方法,然后调用with内的逻辑,最后执行__exit__做退出处理,并且,即使出现异常也能正常退出filter的用法相对filter而言,map和reduce使用的会更频繁一些,filter正如其名字,按照某种规则过滤掉一些元素。#!/usr/bin/envpython#-*-coding:utf-8-*-lst=[1,2,3,4,5,6]#所有奇数都会返回True,偶数会返回False被过滤掉printfilter(lambdax:x%2!=0,lst)#输出结果[1,3,5]一行作判断当条件满足时,返回的为等号后面的变量,否则返回else后语句。lst=[1,2,3]new_lst=lst[0]iflstisnotNoneelseNoneprintnew_lst#打印结果1装饰器之单例使用装饰器实现简单的单例模式#单例装饰器defsingleton(cls):instances=dict()#初始为空def_singleton(*args,**kwargs):ifclsnotininstances:#如果不存在,则创建并放入字典instances[cls]=cls(*args,**kwargs)returninstances[cls]return_singleton@singletonclassTest(object):passif__name__=='__main__':t1=Test()t2=Test()#两者具有相同的地址printt1,t2staticmethod装饰器类中两种常用的装饰,首先区分一下他们:普通成员函数,其中第一个隐式参数为对象classmethod装饰器,类方法(给人感觉非常类似于OC中的类方法),其中第一个隐式参数为类staticmethod装饰器,没有任何隐式参数.python中的静态方法类似与C++中的静态方法#!/usr/bin/envpython#-*-coding:utf-8-*-classA(object):#普通成员函数deffoo(self,x):printexecutingfoo(%s,%s)%(self,x)@classmethod#使用classmethod进行装饰defclass_foo(cls,x):printexecutingclass_foo(%s,%s)%(cls,x)@staticmethod#使用staticmethod进行装饰defstatic_foo(x):printexecutingstatic_foo(%s)%xdeftest_three_method():obj=A()#直接调用噗通的成员方法obj.foo(para)#此处obj对象作为成员函数的隐式参数,就是selfobj.class_foo(para)#此处类作为隐式参数被传入,就是clsA.class_foo(para)#更直接的类方法调用obj.static_foo(para)#静态方法并没有任何隐式参数,但是要通过对象或者类进行调用A.static_foo(para)if__name__=='__main__':test_three_method()#函数输出executingfoo(__main__.Aobjectat0x100ba4e10,para)executingclass_foo(class'__main__.A',para)executingclass_foo(class'__main__.A',para)executingstatic_foo(para)executingstatic_foo(para)property装饰器定义私有类属性将property与装饰器结合实现属性私有化(更简单安全的实现get和set方法)。#python内建函数property(fget=None,fset=None,fdel=None,doc=None)fget是获取属性的值的函数,fset是设置属性值的函数,fdel是删除属性的函数,doc是一个字符串(像注释一样)。从实现来看,这些参数都是可选的。property有三个方法getter(),setter()和delete()来指定fget,fset和fdel。这表示以下这行:classStudent(object):@property#相当于property.getter(score)或者property(score)defscore(self):returnself._score@score.setter#相当于score=property.setter(score)defscore(self,value):ifnotisinstance(value,int):raiseValueError('scoremustbeaninteger!')ifvalue0orvalue100:raiseValueError('scoremustbetween0~100!')self._score=valueiter魔法通过yield和__iter__的结合,我们可以把一个对象变成可迭代的通过__str__的重写,可以直接通过想要的形式打印对象#!/usr/bin/envpython#-*-coding:utf-8-*-classTestIter(object):def__init__(self):self.lst=[1,2,3,4,5]defread(self):foreleinxrange(len(self.lst)):yieldeledef__iter__(self):returnself.read()def__str__(self):return','.join(map(str,self.lst))__repr__=__str__deftest_iter():obj=TestIter()fornuminobj:printnumprintobjif__name__=='__main__':test_iter()神奇partialpartial使用上很像C++中仿函数(函数对象)。在stackoverflow给出了类似与partial的运行方式:defpartial(func,*part_args):defwrapper(*extra_args):args=list(part_args)args.extend(extra_args)returnfunc(*args)returnwrapper利用用闭包的特性绑定预先绑定一些函数参数,返回一个可调用的变量,直到真正的调用执行:#!/usr/bin/envpython#-*-coding:utf-8-*-fromfunctoolsimportpartialdefsum(a,b):returna+bdeftest_partial():fun=partial(sum,2)#事先绑定一个参数,fun成为一个只需要一个参数的可调用变量printfun(3)#实现执行的即是sum(2,3)if__name__=='__main__':test_partial()#执行结果5神秘evaleval我理解为一种内嵌的python解释器(这种解释可能会有偏差),会解释字符串为对应的代码并执行,并且将执行结果返回。看一下下面这个例子:#!/usr/bin/envpython#-*-coding:utf-8-*-deftest_first():return3deftest_second(num):returnnumaction={#可以看做是一个sandboxpara:5,test_first:test_first,test_second:test_second}deftest_eavl
本文标题:Python语句、函数与方法的使用技巧总结
链接地址:https://www.777doc.com/doc-4855580 .html