优化python程序的几点建议
1、在需要只读序列时,最好使用元组而非列表;
2、使用生成器yield,而不是创建大的元组和列表并在其上进行迭代处理;
3、尽量使用python内置的数据结构,而不实现自己的自定义结构;
4、从小字符串中产生大字符串时,不要对小字符串进行连接,而是在列表中累积,最后将字符串列表结合成一个单独的字符串;
5、如果某个对象需要多次使用属性访问,或从某个数据结构中进行访问,那么较好的做法是创建并使用一个局部变量来访问对象。
6、可使用字典对多个类似的elif分支进行简化;
functions=dict(a=add,b=edit,l=list)
functions[recieve]() 其中add(),edit(),list()为函数名,recieve为接收的参数;
7、打开读写文件用上下文管理器with语句;
下面是对python复杂语法的一点补充:
1、动态程序设计与内省函数:
1 __import__() 根据模块名导入模块; 2 delattr(obj,name) 从对象obj中删除名为name的属性; 3 getattr(obj,name,val) 返回对象obj中名为name的属性值,如果没有这一属性,并且给定了val参数,就返回val; 4 setattr(obj,name,val) 将对象obj中名为name的属性值设置为val,必要时候创建该属性; 5 hasattr(obj,name) 如果对象obj中有名为name的属性,就返回True; 6 locals() 返回当前本地上下文的字典; 7 globals() 返回当前全局上下文的字典; 8 type(obj) 返回对象obj的类型对象; 9 vars(obj) 以字典形式返回对象obj的上下文,如果没有给定obj,就返回本地上下文;
2、修饰器
修饰器是一个函数,接受一个函数或方法作为其唯一的参数,并返回一个新函数或方法。
一个简单的修饰器函数:
1 def positieResult(function): 2 def wrapper(*args,**kwargs): 3 result=function(*args,**kwargs) 4 assert result>=0,function.__name__+"()result isn't>=0" 5 return result 6 wrapper.__name__=function.__name__ 7 wrapper.__doc__=function.__doc__ 8 return wrapper
也可用functools模块的wraps函数来取代最后对函数的同步语句:
@functools.wraps(function)
def wrapper(*args,**kwargs):
...
也可在此函数的外国再包一层函数来给修饰器增加可传递参数。
3、def a() ->bool:
suite
表示对函数使用时加注释(3.5后加的新功能)
4、函子另一种包含了特殊方法__call()__的类。它提供的一个关键好处就是可以维护一些状态信息。
闭包:
def make_strip_function(characters): def strip_function(string): return string.strip(characters) return strip_function
使用方法:
strip_a=make_strip_function(',:;.!?') strip_a('ladys!') #returns:'ladys'
相当于二次传参,下面的函子具有相同的功能和用法
class Strip: def __init__(self,characters): self.characters=characters def __call__(self,string) return string.strip(self.characters)