优化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)

 

posted @ 2017-07-21 11:43  覆手为云p  阅读(1969)  评论(0编辑  收藏  举报
停止精灵球