优化python程序的几点建议

时间:2023-03-09 06:44:26
优化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、动态程序设计与内省函数:

__import__()                 根据模块名导入模块;

delattr(obj,name)         从对象obj中删除名为name的属性;

getattr(obj,name,val)   返回对象obj中名为name的属性值,如果没有这一属性,并且给定了val参数,就返回val;

setattr(obj,name,val)    将对象obj中名为name的属性值设置为val,必要时候创建该属性;

hasattr(obj,name)        如果对象obj中有名为name的属性,就返回True;

locals()                         返回当前本地上下文的字典;

globals()                      返回当前全局上下文的字典;

type(obj)                      返回对象obj的类型对象;

vars(obj)                      以字典形式返回对象obj的上下文,如果没有给定obj,就返回本地上下文;

2、修饰器

修饰器是一个函数,接受一个函数或方法作为其唯一的参数,并返回一个新函数或方法。

一个简单的修饰器函数:

def positieResult(function):

def wrapper(*args,**kwargs):

result=function(*args,**kwargs)

assert result>=0,function.__name__+"()result isn't>=0"

return result

wrapper.__name__=function.__name__

wrapper.__doc__=function.__doc__

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)